Redis 使用求助

2021-03-15 23:52:49 +08:00
 LeeReamond

大家好,我在菜鸟教程的 Redis 页面大概过了一下 redis 使用方法,遇到一些不清楚的地方。

其一是,redis 的基础数据类型中,key 的 api 很丰富,可以设置超时等等,但 list 和 hash 则没有这么丰富,不知道能否手动设置超时?一个典型的业务场景是,后端生成验证码校验,利用 redis 进行多节点间的同步,最方便的方式是 redis 里设置好超时时间,比如五分钟,这样用户申请验证的时候业务端只需要查一下 redis,如果能获取到数据就一切正常,如果获取不到数据就说明该验证码失效了,很清晰。

但是这种验证码如果使用 key 的话很不好管理,key 的数量会泛滥,最好放在同一个 hash 里面,而 hash 我观察网上写的 api,并没有超时功能,想请问一下是就是这么设计的还是有什么别的用法?

===

其二问题是,redis 有没有办法主动限制 hash 的存储量。典型业务场景是进行页面缓存管理,比如我服务器资源有限,我想限制 redis 最多保存一万条缓存,超过数量则按照先进先出方式滚动,这个是业务上的限制需求。我目前了解到的实现方式,以上实现似乎是通过限制 redis 最大内存占用量,然后占用达到最大后触发 redis 的自动清理,来实现限制缓存量,但这种控制感觉不是很精确,而且清理会不会除了指定内容外,对其他不希望清理的内容产生影响呢?请问一下这类需求该怎么实现,谢谢

839 次点击
所在节点    问与答
8 条回复
des
2021-03-16 00:12:57 +08:00
1 、redis 的 hash 没有单个 key 过期的功能,详见: https://github.com/redis/redis/issues/1042
2 、可以使用 list 结构,每次 push 完用 ltrim 修剪。
LeeReamond
2021-03-16 00:19:42 +08:00
@des 感谢回复,所以需求 1 的实现方式应该就是用普通 key,然后每次 exists key 查看是否存在?需求 2 你提到的是一个方法,但可能我主题中描述有些问题,因为实际业务需求用 fifo 可能不太合适,最好是结合访问次数,比如一个多次被访问的页面即使加入时间较早也不会被挤到队列末尾。印象中以前看过一些技术文章,redis 是支持这类算法的,同样地是只能使用内存上限来进行限制吗?
des
2021-03-16 00:53:43 +08:00
@LeeReamond
文章的话,基本都是在讲 redis 自带的缓存淘汰,我看到的好像都是这样
建议自行用 hash + sorted set 实现缓存淘汰算法

另外提一句,你要实在看着一堆 key 难受,可以放另外一个 db,眼不见心不烦
des
2021-03-16 01:02:42 +08:00
@des
当然更为简单的是直接用 expire,访问过就重新设置一下 expire
没有访问的话,就自动过期删除了,不过需要考虑一下内存会用满
LeeReamond
2021-03-16 02:30:22 +08:00
@des 请问“hash+sorted set 实现缓存淘汰算法”应该如何理解,想了一下没有理解怎么做。sortedset 中的字段可以和 hash 中的 key 相对应,然后呢?
ferock
2021-03-16 07:06:21 +08:00
页面缓存管理,该走 SE 的还是走 SE 去
LeeReamond
2021-03-16 08:44:45 +08:00
@ferock 请问 SE 是什么
ferock
2021-03-16 08:56:49 +08:00
@LeeReamond #7

Search Engines,例如,你可以部署 Elasticsearch

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/761914

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX