Skip to content

Latest commit

 

History

History
138 lines (117 loc) · 8.08 KB

redis.md

File metadata and controls

138 lines (117 loc) · 8.08 KB

redis zset 实现原理

- 压缩链表,跳表

redis的nvm

Redis在项目中的使用场景

redis常用的数据结构

  • string, hash , set zset, list

redis的zset实现

Redis缓存淘汰策略

Redis主从复制原理

Redis怎么实现高可用

redis缓存雪崩、缓存穿透、缓存击穿

redis string的编码方式

- int 编码:保存long 型的64位有符号整数
- embstr 编码:保存长度小于44字节的字符串
- raw 编码:保存长度大于44字节的字符串

redis的日志?主从同步用哪些?主从同步时候继续有数据写入怎么办?

- AOF,RDB
- RDB
- replica_backoff_buffer(环形队列,可以被覆盖)

redis的底层结构

  • redis缓存雪崩、缓存穿透、缓存击穿?如何解决

    • 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

      • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
    • 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

      • 设置热点数据永远不过期。
      • 加互斥锁
    • 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。 设置热点数据永远不过期。

  • 那问你随机过期时间实现得不好就出现了大量key过期

  • 关于分布式锁redis

      1. setnx + expire + del
      1. 如果expire时间过短,业务还没执行完锁失效了,那么别的请求可以共享资源了,该如何做?
      1. 如果expire时间过长,而业务执行完之后由于某种原因del lock失败,那么其他请求就获取不到锁了,该如何做?
      1. 如果业务还在执行,锁被别人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的

redis zset为什么用跳表,不用avl,红黑树?

从内存占用上来比较,跳表比平衡树更灵活一些。平衡树每个节点包含 2 个指针(分别指向左右子树),而跳表每个节点包含的指针数目平均为 1/(1-p),具体取决于参数 p 的大小。如果像 Redis里的实现一样,取 p=1/4,那么平均每个节点包含 1.33 个指针,比平衡树更有优势。
在做范围查找的时候,跳表比平衡树操作要简单。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在跳表上进行范围查找就非常简单,只需要在找到小值之后,对第 1 层链表进行若干步的遍历就可以实现。
从算法实现难度上来比较,跳表比平衡树要简单得多。平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而跳表的插入和删除只需要修改相邻节点的指针,操作简单又快速