使用redis有序集合存储实时缓存的key

问题描述:用户访问app首页信息,根据请求参数来拼接redis的实时缓存key,如果首页信息编辑了信息,需要对redis做清除缓存操作,请问如何实现?
思路:使用redis的有序集合去存储实时缓存的key,分数为实时缓存key的过期时间戳,每次新增缓存的时候,都去判断有序集合里的成员是否有过期的,有过期的然后清除; 那如果是一个操作很频繁的接口,每次都要去判断有没有过期的,然后再去做删除操作,这个会不会很影响性能,假设是访问频率是每秒500次,请问有没有更好的方案实现?
可不可以对有序集合key做处理,让key按某一规则生成,这样过期了的key就不用去操作删除,只是在统一清除缓存的时候,在根据规则去获取有序集合的key,再操作删除?

引用gpt 回答 有帮助的话 采纳一下
对于频繁访问且需要实时清除缓存的场景,我推荐以下方案:

  1. 使用Redis Hash结构存储缓存数据,键名为页面唯一标识比如页面ID,字段为各变量名称,值为变量值。
  2. 设置缓存数据的过期时间,让Redis自动过期删除。
  3. 在页面更新时,直接删除对应页面ID的整个Hash结构,实现快速清除。
  4. 页面访问时,优先从Redis读取数据,如果Hash不存在则从数据库加载后设置到Redis。
  5. 可以根据页面类型或频率设置不同的缓存时长,热点数据可以设置更长时长。
  6. 此方案无需使用有序集合维护Key列表,直接按ID查找即可,降低维护成本。
  7. Redis单线程模型足以支持每秒500次的访问频率,不会成为瓶颈。
  8. 也可以考虑使用Redis Lua脚本,将查找、计算、更新封装为一个原子操作。
  9. 使用Redis Pub/Sub实现边缓存更新边推送的机制。
    总之,直接利用Redis内置的数据结构和过期策略,可以高效实现实时缓存的管理,无需建立额外的Key列表。
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7767137
  • 除此之外, 这篇博客: Redis面试16连击!学会直接反客为主,面试官都懵了!(附文档和实战视频)中的 十五、如果有大量的 key 需要设置同一时间过期,一般需要注意什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 答:如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

  • 以下回答由chatgpt基于相关博客总结生成:
    • noeviction:禁止淘汰策略,当内存不足时,对写操作进行拒绝。
    • volatile-lru:在设置了过期时间的key中,优先删除最近最少使用的key。
    • volatile-ttl:在设置了过期时间的key中,优先删除剩余过期时间较短的key。
    • volatile-random:在设置了过期时间的key中,随机删除一个key。
    • allkeys-lru:在所有的key中,优先删除最近最少使用的key。
    • allkeys-random:在所有的key中,随机删除一个key。

    段落1:有序集合有两种排序方式:而成员按照从小到大排序,然后分数从大到小排序,或者成员按照从大到小排序,然后分数从小到大排序。我们可以利用有序集合中的成员按照分数排序的特性来实现高效的清除缓存操作。

    参考资料:
    - https://redis.io/topics/lru-cache#how-keys-expire-in-redis