Redis的过期策略是什么?
Redis中可以通过expire key seconds命令给指定的key设置一个存活时间。一旦到达这个时间,key就会被自动移除。除此之外,也可以在key过期之前通过persist key命令来取消该key的过期。另外,还可以使用ttl key命令观察key的剩余存活时间。
相关命令:
- expire key seconds
- expireat key timestamp(seconds)
- pexpire key milliseconds
- pexpireat key timestamp(milliseconds)
- persist key
- ttl key
- pttl key
过期策略:
-
定时删除
-
给每个过期key维护一个时钟,到达过期时间立即删除key
-
CPU不友好
-
惰性删除
-
放任过期key存在。当有访问过期key时,才会真正删除key。
-
空间不友好,一直不访问的key有可能存在内存泄漏
-
定期删除
-
周期性的删除过期key。权衡策略
redis的对于过期key的移除采用惰性删除+定期删除的策略。
Redis的内存淘汰策略是怎样的?Redis可以作为一个LRU cache吗?
除了上边讲的过期策略,对于没有设置过期时间的key,redis也可以进行自动内存管理。
redis可以通过配置 maxmemory 属性,使得当使用的内存空间超过这个大小时,按照具体的淘汰策略进行key淘汰(此处的key不仅仅针对可过期key,还针对不会过期的key)。
-
noeviction 不淘汰,新插入数据时,返回错误
-
allkeys-lru 按照lru的策略对全部的key进行淘汰
-
volatile-lru 按照lru的策略对可过期的key进行淘汰
-
allkeys-random 随机从全部的key中淘汰
-
volatile-random 随机从可过期的key中淘汰
-
volatile-ttl 淘汰可过期的数据中ttl时间小的key
参考资料:
MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
可以通过redis本身的allkeys-lru的内存淘汰策略来保证redis留存的数据是热点数据。
Redis可以用作异步的消息队列吗?如果想一次生产多次消费,该怎么实现?
可以使用list结构来作为异步的消息队列,生产者使用lpush放入消息,消费者通过prpop阻塞地从另一侧消费消息。
一次生产多次消费可以使用redis的pub/sub功能。
Redis怎么实现延时队列?
可以使用sorted set来实现。将任务以及任务的执行时间(score)放入sorted set。另一段通过zrangebyscore的命令轮询取走要执行的任务进行处理。
Redis的string是二进制安全的是什么意思?
redis的string 不仅可以保存文本,还可以保存图片,音视频等二进制数据。
这个特性跟redis中的string采用的是SDS这种结构是有关系的。C中string的结束是通过结束标识符来实现的,而该符号有可能在图片中出现。而SDS则显示的记录已使用空间的长度,而不会根据结束符来判断结束。
Redis是怎么做持久化的?
RDB AOF
Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
redis有模式匹配的方案可以来解决这个问题。
什么是缓存穿透,缓存击穿,缓存雪崩?如何避免?
单线程的Redis为什么性能这么好?
- 纯内存操作
- 单线程省去了CPU切换的消耗
- IO多路复用