- 压缩链表,跳表
- string, hash , set zset, list
- int 编码:保存long 型的64位有符号整数
- embstr 编码:保存长度小于44字节的字符串
- raw 编码:保存长度大于44字节的字符串
- AOF,RDB
- RDB
- replica_backoff_buffer(环形队列,可以被覆盖)
-
redis缓存雪崩、缓存穿透、缓存击穿?如何解决
-
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
-
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
- 设置热点数据永远不过期。
- 加互斥锁
-
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。 设置热点数据永远不过期。
-
-
那问你随机过期时间实现得不好就出现了大量key过期
-
关于分布式锁redis
-
- setnx + expire + del
-
- 如果expire时间过短,业务还没执行完锁失效了,那么别的请求可以共享资源了,该如何做?
-
- 如果expire时间过长,而业务执行完之后由于某种原因del lock失败,那么其他请求就获取不到锁了,该如何做?
-
- 如果业务还在执行,锁被别人del了,那么如何保证共享资源?
- 参考答案
-
-
redis里面有热点数据10w个。这时候一个程序员从数据库中捞了1000个新的数据返回,顶替了1000个热点数据(程序员用新的key塞入redis,导致redis中其他老的1000个key被删除)。用什么方式可以避免这样的情况发生?(字节面试题)
-
redis 持久化有哪几种方式
-
redis 集群有哪几种,redis集群怎么实现高可用
-
redis怎么做高可用,机制
-
怎么保证redis和mysql的数据一致性
-
redis的删除策略
-
redis缓存穿透 如果用很多不存在的key攻击怎么办
- 可以使用布隆过滤器,bitmap来实现
-
redis sorted set score的范围是多少
- (-2^53---- +2^53)
-
redis数据结构, sort set 底层实现
-
- [refer](https://processon.com/mindmap/60c09f127d9c087937196f50)
-
-
redis 内存优化相关的设计
-
秒杀,促销设计
-
redis如何保证lua脚本的一致性
- 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他进程或者进程的命令插入
- reference
-
redis里面有热点数据10w个。这时候一个程序员从数据库中捞了1000个新的数据返回,顶替了1000个热点数据(程序员用新的key塞入redis,导致redis中其他老的1000个key被删除)。用什么方式可以避免这样的情况发生?
- 参看答案: 利用lfu淘汰策略
- 参考答案2: 冷热数据分离,redis机器分离
-
redis 复制的原理
-
redis哨兵原理
-
redis主动下线被动下线
-
redis复制延迟
-
redis的故障恢复
-
redis cluster 集群中突然宕机了一台服务器会发生什么
-
redis cluster 中为什么要用crc16算法 而不用哈希一致性算法?
-
redis哨兵集群中有服务挂掉,哨兵会做哪些事?
-
热key的探测方案?
-
redis 大量key过期,但是内存不释放?
- 淘汰策略为懒淘汰,修改淘汰策略
-
redis内存很多碎片,导致内存居高不下,如何解决?
-
为啥RedisCluster设计成16384个槽
-
100w数据,redis怎么取出来合适
-
网关集群发生脑列了你的hash环会受到什么影响,怎么解决(也许不是redis相关问题,redis也有脑裂的情况)
-
redis哈希和集合有啥关系
-
redis/etcd使用ap还是cp
-
redis可以作为消息队列使用吗?如何防止消息丢失
- 广播订阅模式:基于Redis的 Pub/Sub 机制,一旦有客户端往某个key里面publish一个消息,所有subscribe的客户端都会触发事件
- 集群订阅模式:基于Redis List双向+ 原子性 + BRPOP
- 如何避免消息丢失
- 写入时候要求启用事务处理,保证写一定成功
- redis配置成任何变更一定实时持久化,比如存储端是磁盘的话,每次变更马上同步写入磁盘,才算完成
- 消费端也要实现事务方式,处理完成后,再回来真实删除消息
- 多线程或者多端同时并发处理,可以通过锁的方式来规避
- refer
- Redis 如何实现的分布式锁? setnx 、 redisson ,为什么要用 redisson ? watchdog "如果让你基于 setnx 实现一个 watchdog 怎么做?怎么做 watch 呢?
- 怎么样基于redis存储文件的
- redis的RDB瘦身你是怎么做的,key是不过期吗?
- sortset数据量特别大的时候,有什么问题?
- sortset数据插入时,时间复杂度是多少?
- O(LogN)
- zset 为啥不用红黑树,二叉树,为什么用跳跃表?基于什么原因?
- redis key的过期方式
- lru的特点
- redis是怎么记录lru的
从内存占用上来比较,跳表比平衡树更灵活一些。平衡树每个节点包含 2 个指针(分别指向左右子树),而跳表每个节点包含的指针数目平均为 1/(1-p),具体取决于参数 p 的大小。如果像 Redis里的实现一样,取 p=1/4,那么平均每个节点包含 1.33 个指针,比平衡树更有优势。
在做范围查找的时候,跳表比平衡树操作要简单。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在跳表上进行范围查找就非常简单,只需要在找到小值之后,对第 1 层链表进行若干步的遍历就可以实现。
从算法实现难度上来比较,跳表比平衡树要简单得多。平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而跳表的插入和删除只需要修改相邻节点的指针,操作简单又快速