本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
1、设置过期时间 expire key time(s)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式 注意: 除了string独有设置过期时间方法,其他类型都需要依靠expire方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用persist key 2、三种过期策略 定时删除 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时
过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
缓存穿透、缓存击穿和缓存雪崩是Redis面试当中和实际开发中,经常需要考虑的一个问题。很多人对该问题的产生、原因和解决方案还是不够清晰。其实大家针对该三种情况,去仔细分析一个产生的原理就能很好的找到一个好的解决方案。
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,
本文对Redis的数据库文件进行简要介绍,包括数据库的选择,键的新建更新删除、Redis过期策略以及事件通知等。
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?
Redis 服务器将绝大部分的信息都保存在 server.h/redisServer。redis 的数据是保存在 redisServer 中的 redisDb 结构中。
Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 redis.h 文件中,但是 redis 6.x版本目录中都没有这个文件。redisDb 结构应该在 server.h文件中)
Redis 缓存是 Redis 的一种主要应用场景。通过将热点数据存储在内存中,可以大大提高应用的读取速度,从而提高应用的性能。
缓存异常有四种类型,分别是 缓存穿透、缓存雪崩、缓存击穿、缓存和数据库的数据不一致。
注:本文主要参考自《Redis设计与实现》 https://www.cnblogs.com/xuliangxing/p/7151812.html https://www.cnblogs.com/s
《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结 (原创内容,转载请注明来源,谢谢) 一、RDB、AOF、复制对过期键的处理 1、RDB 创建RDB:在执行bgsave或save命令创建一个新的rdb文件时,redis会对数据库中的所有的键进行检查,已经过期的键不会被加入新的rdb文件中。因此过期键对创建RDB没有影响。 载入RDB:载入rdb文件时,会区分载入的这个redis服务器是主服务器还是从服务器。如果是主服务器,会检查所有的键,仅载入未过期的键;如果是从服务器,则无论是
缓存雪崩是指在某一时刻,大量的缓存数据同时失效,导致大量的请求直接打到数据库上,从而引发数据库的压力激增,可能导致整个系统的崩溃,这种现象被称为缓存雪崩。
在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库。
纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注。 Linux技术交流QQ群:2659793(十二月最新!!) Redis数据库(Redis 如何表示一个数据库,数据库操作是如何实现的) 当Redis服务器初始化的时候会创建 redis.h/REDIS_DEFAULT_DBNUM(后面简写 N ) 个数据库,且数据库的id是从 0 到 N-1 , 所有的数据库保存到 redis.h/redisServer.db 数组中 。 在客户端可以通过 “SELECT” 命令进行切换,其中程序
除了string独有设置过期时间的方法,其他类型都需依靠expire方法设置时间,若:
如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。
前面我们花了很多的时间介绍了 redis 中基本的数据结构,及其内部的实现情况,这些都是非常基础的东西,可能不经意间你就会用到他们,希望你花点时间了解一下。
同事排查不到原因,迫不得已联系到正在休假的我。幸亏我带着电脑呢!(打工人的觉悟真高,休假都带着电脑)于是我打开电脑,连上V**,连接远程桌面,登录日志系统,查看一番,又翻了翻代码,发现是因为从Redis中查询的数据为字符串null(这种情况是Redis中不存在且数据库也不存在时,避免缓存穿透而临时缓存的字符串null),导致抛出业务异常,打印错误日志,从而触发邮件告警。接口调用量一上来,报错就多了,于是就收到了千余封告警邮件。
Redis是key-value数据库,可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。
在 Redis 系列的开篇文章中,我们对 Redis 概述以及 Redis 数据结构与对象进行了详细的讨论以及了解。经过上一篇文章的阅读,相信读者已经对 Redis 的内部结构有了大致了解,接下来我们继续深入了解 Redis 内部结构。
随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享一下Redis几道常见的面试题:
在日常的工作中,Redis最常用的场景就是缓存场景,为什么Redis能作为缓存呢?
在请求达到后端之后,对需要进行缓存的接口,会先去 Redis 中找有无数据,没有的话会继续走正常的业务流程,然后将查询到的结果返回给客户端的同时也放在 Redis 中一份,下次相同请求进来后,就可以直接从 Redis中 拿到数据。
之前我们聊过string、list、hash、set、zset,并且自实现了动态字符串、双端链表、hash字典、压缩链表、跳跃链表等结构。那么redis是怎么组织这些数据结构高效的运行呢?
随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。
在redis源码中数据库的结构由server.h/redisDb表示, redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space),redisDb源码:
对于Redis,我们业务开发一般都只关心Redis键值对的查询、修改操作,可能因为懒或者只想能用就行,呵呵。很少关心键值对存储在什么地方、键值对过期了会怎么样、Redis有没什么策略处理过期的键、Redis处理过期键又有什么作用?但这些问题却是Java程序员在Redis上进阶的必备知识,不要埋怨Java要学习的系统知识为什么这么多,因为这些确确实实是程序员进阶所必须掌握的。我们往下看看~
本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透、缓存击穿、缓存雪崩。
无论先操作db还是cache,都会有各自的问题,根本原因是cache和db的更新不是一个原子操作,因此总会有不一致的问题。想要彻底解决这种问题必须将cache和db的更新操作归在一个事务之下(例如使用一些分布式事务,或者强一致性的分布式协议)。或者采用串行化,可以保证强一致性。
这个问题来自于粉丝面试的时候遇到的,下面我来讲解一下。 什么是缓存击穿 对于这个问题,简单的说就是把缓存透了但数据库没透。还不明白?那么这一小节我来带大家通过一个形象的例子来讲解一下。 我们知道缓存层都会设置数据过期时间,如果不设置过期时间的话,随着查询的越来越多缓存就会越来越大,内存撑不住了服务器就炸了。但是我们设置了过期时间真的就万无一失了吗?假设数据已经到期了,那么缓存就查不到了,这时只能去数据库查。如果同一时间巨多的人发送的查询请求都是要求查这个数据。因为缓存过期了,所以这个巨多的查询都直接转向数
redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典: ❑过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键)。 ❑过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。
平时我们使用缓存的方案,一般是在数据库中存储一份,在缓存中同步存储一份。当请求过来的时候,可以先从缓存中取数据,如果有数据,直接返回缓存中的结果。如果缓存中没有数据,那么去数据库中取出数据,同时更新到缓存中,返回结果。如果数据库中也没有数据,可以直接返回空。
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
除了string独有设置过期时间的方法,其他类型都需要依靠expire方法设置时间,若:
总之,使用缓存可以优化系统的性能、提高响应速度、降低数据库负载、节省网络传输和服务器资源,从而提升用户体验和系统的可靠性。
本文分享一篇关于Redis热门问题,缓存穿透、缓存击穿和缓存雪崩。针对该文的面试题,我也整理好了,你可以直接点击查看。
看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。
缓存是计算机系统中应用非常广泛的技术,最经典的,操作系统中处处是缓存,缓存可以大大提升数据访问速率。
平时我们使用缓存的方案,一般是在数据库中存储一份,在缓存中同步存储一份。当请求过来的视乎,可以先从缓存中取数据,如果有数据,直接返回缓存中的结果。如果缓存中没有数据,那么去数据库中取出数据,同时更新到缓存中,返回结果。如果数据库中也没有数据,可以直接返回空。
领取专属 10元无门槛券
手把手带您无忧上云