面试被问到:如何让 Redis 的 Value 过期,10个有9个不会!

JAVA herman 266浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近有个同学在群里交流心得,他说他面试了 10 个程序员,9 个都“不会”如何让 Redis 的 Value 过期!

Redis 的持久化特性是它的一大亮点,但是它并不会被我们用来做持久化存储。因此,如何让 Redis 的 key 或 value 过期就显得非常重要!今天,我就简单的来说一下,这个面试题!

Redis 本身是自带的有过期机制的,但是这个过期机制只针对具体的 Key 过期,而 Value 如何过期,没有特定的功能。但是在某些场景下,往往还需要让 Redis 的 Value 过期,而 Key 不过期。

比如,我们现在有一个需求,需要对 15 分钟内的文章进行一次阅读统计。并且要求每分钟统计一次,找出热点文章,做特殊处理。每篇文章都有一个唯一 ID 进行标示。

现举例有文章的阅读数量变化如下:

[100, 520, 666, 888, 996 ...]

如果文章太多,就会浪费很多的内存空间!我们需要及时清理一些 Value 数据,而让 Key 过期,可能就不太适用我们的场景了!

那么如何做呢?

这个时候,Redis 的有序集合就可以派上用场了!

通过对指定的值可以指定 score,然后根据 score 来进行排序;然后再通过 ZRANGEBYSCORE 来获取一定范围内 score 所对应的 value。

ZRANGEBYSCORE key score1 
#   文章id   时间戳    阅读数 
ZADD id    1577591750 996

现在,如果我们想要获取 15 分钟内的数据,就可以这样做:

ZRANGEBYSCORE id now - 15 * 60 now

但还是不够完美,因为我们的值虽然是取对了,可 Value 并没有过期。

所以,针对上面的命令,我们还可以再优化一下!

ZRANGEBYSCORE id 0 now - 15 * 60

最后,你还需要注意的是,除了 Value 过期,key 也要注意,key 也需要设置过期。

# 24 小时后整个 key 过期
EXPIRE key 24 * 60 * 60

上面我的这个例子可能不是特别的恰当,针对的也是有序集合。如果是非有序集合,也有网友回答说,先 get 值,然后淘汰旧数据后,再重新 set 值。不过,我的建议是选择合适的数据结构更重要!

如果你对 Redis 也感兴趣,下面这些知识点你都完全掌握了吗?

  • 整体架构:get/set请求的执行流程
  • 通信协议: 为什么说Redis的协议是二进制安全的?
  • 事件循环:Redis为什么这么快(上)
  • 数据存储:Redis为什么这么快(下)
  • 数据编码:Redis多种数据类型底层是如何存储的?
  • 持久化:数据存储在内存,Redis是如何保证宕机后数据不丢的?
  • 主从复制: Redis是怎么保证主从一致的?
  • 源码调试:如何分析Redis源码
  • 小结:Redis与memcached有什么区别
  • 数据淘汰:Redis内存满了是否还能写入数据
  • 数据过期:key过期后会被立刻删除吗
  • 事务:Redis事务是否满足ACID特性
  • lua脚本:Redis事务有替代方案吗
  • lazyfree:Redis如何应对大key删除问题
  • client side cache: Redis如何应对热点key问题
  • stream:Redis如何应对消息队列场景
  • module: 除了常见的特性,Redis还可以做什么
  • 集群:业界常用的Redis集群方案
  • 集群:社区redis-cluster原理剖析(上)
  • 集群:社区redis-cluster原理剖析(下)
  • 成本:数据全部存储内存,如何应对成本高的问题
  • Redis多数据中心解决方案
  • 小结:业务使用建议
  • 监控报警: 如何判断Redis是不是出问题了
  • sentinal:Redis如何实现自动failover
  • 如何定位请求耗时长的问题?
  • 如何定位内存异常的问题?
  • 如何定位主从复制异常的问题?
  • 小结:Redis问题排查思路总结&线上运维建议
  • 分布式kv:请求处理模型设计
  • 分布式kv:数据模型&查询语言设计
  • 分布式kv:数据存储设计
  • 分布式kv:多副本设计
  • 分布式kv:数据分片设计
  • 分布式kv:事务设计
  • 分布式kv:一致性共识
  • 分布式kv:分布式系统挑战

最后我说一个活动福利,拉钩教育,推出了一个“隔离在家里,温暖在心底”的免费送课程活动!

拉钩课程免费送

有需要的,可以加我微信号:codedq,免费获得!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 面试被问到:如何让 Redis 的 Value 过期,10个有9个不会!