V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

Redis 使用求助

  •  
  •   LeeReamond · 2021-03-15 23:52:49 +08:00 · 783 次点击
    这是一个创建于 1161 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    ===

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

    8 条回复    2021-03-16 08:56:49 +08:00
    des
        1
    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
        2
    LeeReamond  
    OP
       2021-03-16 00:19:42 +08:00
    @des 感谢回复,所以需求 1 的实现方式应该就是用普通 key,然后每次 exists key 查看是否存在?需求 2 你提到的是一个方法,但可能我主题中描述有些问题,因为实际业务需求用 fifo 可能不太合适,最好是结合访问次数,比如一个多次被访问的页面即使加入时间较早也不会被挤到队列末尾。印象中以前看过一些技术文章,redis 是支持这类算法的,同样地是只能使用内存上限来进行限制吗?
    des
        3
    des  
       2021-03-16 00:53:43 +08:00   ❤️ 1
    @LeeReamond
    文章的话,基本都是在讲 redis 自带的缓存淘汰,我看到的好像都是这样
    建议自行用 hash + sorted set 实现缓存淘汰算法

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

    Search Engines,例如,你可以部署 Elasticsearch
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5010 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 05:56 · PVG 13:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.