【问题标题】:How to prevent eviction on specific keys without setting a TTL?如何在不设置 TTL 的情况下防止对特定键的驱逐?
【发布时间】:2019-06-30 15:55:36
【问题描述】:

问题: 我想在一个键上设置一个 TTL(以避免它永远存在),但我不想让那个特定的键被驱逐。 当我设置 TTL 时,我知道什么时候让缓存过期是安全的,但是在这个时间之前让缓存过期是不安全的,并且驱逐会带来这个缓存提前过期的风险。

上下文: 我正在使用 Redis 以多种语言缓存对象,如果基础数据发生更改,但是我想从 Redis 中删除所有关联的缓存。 我解决这个问题的方法是在 Redis 上创建一个 SET,其中包含对每种语言的键的引用。我担心的是,如果该 SET 被逐出 - 我会失去对其他键的引用,并冒着让它们在不应该存在的情况下保留在缓存中的风险。

我在寻找什么 一个看起来像的 Redis 命令 PLEASE_DO_NOT_EVICT 键 而不会阻止该密钥在 TTL 用完后过期。

非常感谢您花时间阅读和回答!


虽然我可以使用通配符匹配来查找所有关联的键,但这比 SMEMBERS 慢得多,而且我在每个 MS 都很重要的环境中执行此操作,因为这些对象的创建和删除非常频繁,所以这个查询经常发生。


在这些对象中没有 TTL 意味着它们开始在内存中累积,这是不可取的。而且他们确实倾向于在一段时间后停止被引用


不驱逐政策似乎有风险,我非常希望


创建时:

SADD 'object:id:group', 'object:id:spanish'
SETEX 'object:id:spanish', 'Este es el object en espaniol', 100
EXPIRE 'object:id:group', 100

由于对象更改而使组到期时:

SMEMBERS 'object:id:group'
=> 'object:id:spanish', 'object:id:english'
DELETE 'object:id:spanish', 'object:id:english'
DELETE 'object:id:group'

【问题讨论】:

    标签: redis


    【解决方案1】:

    您可以将maxmemory-policy 设置为其默认值“noeviction”。在这种模式下,不会驱逐任何键。

    【讨论】:

    • 感谢您的回答!我确实说过:“制定不驱逐政策似乎有风险,我非常想这样做”我考虑过这一点,但如果可能的话,我宁愿避免超出内存限制的费用!
    • 哦,没看到那句话……这有什么风险?
    • 如果出现大的应用程序使用高峰,我们担心内存使用量会不断增加
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多