缓存超时策略:手动清除"分体式"新闻缓存

https://blog.csdn.net/github_26672553/article/details/81869719
https://blog.csdn.net/github_26672553/article/details/81908780

前面我们学习了redis的Hash数据类型和Sorted Set数据类型,来实现新闻数据的“分体式缓存”。把新闻内容用Hash缓存,新闻点击量用Sorted Set缓存。

但是,但是,Sorted Set数据类型不能设置超时时间,因为同一个key里包含了多个数据。
如果设置超时时间,那么同一个key的所有记录都没有了。

怎么设置过期时间?
对于新闻内容是Hash数据类型,点击量是Sorted set数据类型。

1、加入新闻内容过期时间是200秒,那么到期后,内容就删除了。但是点击量数据还在Sorted Set中。
2、如果给Sorted Setkey设置过期时间,那么会清掉所有的member。。。

保存缓存过期时间

既然不能直接设置expire,那么我们可以手动来完成缓存的清理。

1、不管是新闻内容还是点击量,都不设置expire
2、插入缓存时,专门做个Sorted Set来存放时间戳

zadd news_exp 时间戳  101
zadd news_exp 时间戳  102
zadd news_exp 时间戳  103

101,102,103就是新闻ID。

假如我们想要200秒后过期,那么 缓存里的时间戳+200秒 <= 当前时间戳 就代表过期了。
然后就:
1、删除Hash里面的新闻内容(比如hnews101)
2、删除Sorted Set里面的 新闻点击量
3、删除news_exp里面对应的值(zrem key member)

redis 事务介绍

文档地址:
https://redis.io/topics/transactions
redis的事务和mysql不一样,不支持回滚。

基本用法:

MULTI   #开启事务
命令1
命令2
.......
EXEC    #执行

其实就是把命令一条条放入队列,最后一次性执行。

redis 订阅、发布

https://redis.io/topics/pubsub

把上面知识点串起来

(订阅news频道)订阅端运行起来,里面包含了手动清除缓存的功能(用程序实现的);
客户端向news频道发布消息。

比如订阅端收到的命令是clear_cache就代表是要清除缓存。

清除缓存的操作,可以放到Linux计划任务中定时去判断是否过期;
也可以使用redis的订阅/发布功能,来手动清除(比如网站后台设计一个按钮就发布清除命令)

猜你喜欢

转载自blog.csdn.net/github_26672553/article/details/82014804