为什么Redis要给缓存数据设置过期时间?
内存是有限的,如果缓存中的所有数据都是一直保存,很容易OOM
Redis如何判断数据是否过期?
通过过期字典来保存数据的过期时间
过期删除策略
Redis采用的是定期删除+惰性删除
Redis内存淘汰机制
1. noeviction(默认):不淘汰任何key,内存满时不写入新的key。
2. volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,值越小越先被淘汰
3. allkeys-random:对所有key进行随机淘汰
4. volatile-random:对设置了TTL的key进行随机淘汰
5. allkeys-lru:对所有key基于LRU算法进行淘汰
6. volatile-lru:对设置了TTL的key基于LRU算法进行淘汰
7. allkeys-lfu:对全体key给予LFRU算法进行淘汰
8. volatile-lfu:对设置了TTL的key基于LFU算法进行淘汰
怎么保证Redis挂掉之后重启数据可以进行恢复?
依赖持久化机制
什么是RDB持久化?
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为RDB文件(dump.rdb)
什么是AOF持久化?
以日志的形式来记录每个写操作,将Redis执行过的所有写命令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。
Redis4.0对于持久化机制做了什么优化?
支持开启混合方式设置 设置aof-use-rdb-preamble的值为 yes 表示开启,设置为no表示禁用
RDB+AOF的混合方式---------> 结论:RDB镜像做全量持久化,AOF做增量持久化
先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。
如何使用Redis事务?
Redis通过MULTI、EXEC、DISCARD、WATCH等命令来实现事务。
Redis事务支持原子性吗?
Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
什么是bigkey?有什么危害?
对于string类型的value,大于等于 10kb 就是bigkey
对于list、hash、set、zset类型,超过5000个属于bigkey
危害:
1.内存不均
2.超时删除
3.网络流量阻塞
如何发现bigkey?
使用--bigkeys参数查找或者分析RDB文件
如何避免大量key集中过期?
1.给key设置随机过期时间
2.开启lazy-free惰性删除