最近有个同学在群里交流心得,他说他面试了 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,免费获得!
: » 面试被问到:如何让 Redis 的 Value 过期,10个有9个不会!
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/252181.html