Redis之面试题

148 阅读3分钟

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

参考资料:

Using Redis as an LRU cache

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多路复用