redis常见面试题
Posted blackomen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis常见面试题相关的知识,希望对你有一定的参考价值。
MemCache与redis的区别
Memcache:代码层次类似于Hash
- 支持简单数据类型
- 不支持数据持久化存储
- 不支持主动
不支持分片
Redis:键值对存储结构 类似HashMap
- 数据类型丰富
- 支持数据磁盘持久化存储
- 支持主从
支持分片
Redis数据类型
- String:最基本的数据类型,二进制安全
- Hash:String元素组成的字典,适合于存储对象
- List:列表,按照String元素插入顺序排序
- Set:String元素组成的无序集合,通过哈希表实现,不允许重复
- Sorted Set:通过分数来为集合中的成员进行从小到大的排序
用于计数的HyperLongLog,用于支持存储地理位置信息的Geo
Redis模糊匹配
- keys k1* :从缓存库中全量查询出所有模糊匹配的key
scan 0 match k1* count 10 : 基于游标(首次查询游标为0)不定批量(10-)查询
Redis实现分布式锁
1.破坏原子性
- SetNX key value:如果key不存在则创建并赋值
Expire key seconds:设置key的生存时间,解决SetNX长期有效的问题
2.改进方案
- set key value [EX seconds] [PX millSeconds] [NX] [XX]
- 设置过期时间秒EX/毫秒PX
当key不存在时才进行操作NX/key存在时才进行操作XX
Redis异步队列
- 使用list作为队列,rpush生产消息,lpop消费消息-->立即消费消息
- blpop key timeout:阻塞直到队列有消息或者超时-->只能供一个消费者消费
pub/sub:主题/订阅模式-->消息发布是无状态的,无法保证消息是否可达
Redis持久化策略 默认RDB+AOF
- RDB:保存某个时间点的全量数据快照
- Bgsave:检查进程中是否存在RDB/AOF子进程,没有则触发持久化rdbSaveBackground,系统调用fork创建进程,使用写时复制进行快照
- AOF:记录除查询外的所有变更数据库状态指令,以append形式追加增量数据保存到AOF文件中
指令可读 保存增量数据,使用日志重写解决AOF文件大小不断增加的问题
pipeline:类似于linux中的管道,用于批量执行指令,节省多次IO往返时间
Redis主动同步机制:master写操作/slave读操作 redis sentinel:解决主从同步master宕机后的主从切换问题
- 全量同步机制(同步操作):将从服务器的数据库状态更新至主服务器当前所处的数据库状态
- 从服务器向主服务器发送SYNC命令;
- 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
- 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
- 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
- 增量同步机制(命令传播操作):在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态
在执行完同步操作之后,如果主服务器执行了写操作,那么主服务器的数据库状态就会修改,并导致主从服务器状态不再一致。
主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。缓存问题
- 缓存穿透:访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。
- 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
- 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。
- 缓存雪崩:大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
- 可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。
- 缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
- 在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。
以上是关于redis常见面试题的主要内容,如果未能解决你的问题,请参考以下文章