Redis缓存批量删除设计思路

需求如下,一个看板中包含多个工作表,每个工作表的数据可以设置缓存,缓存失效时间均不相同,有一个按钮,可以清除整个大盘下所有工作表的缓存。
在这里插入图片描述

方案1:使用String类型存储

工作表的缓存key=board_id+"_"+widgetId,用redis中的string类型;清除整个看板下所有缓存,模糊匹配boardId前缀的key删除缓存。

存在问题:性能瓶颈在模糊删除(获取)keys

Redis非集群模式:
1、keys方法模糊获取key,
2、scan方法模糊获取key,性能比keys方法好
Redis 集群模式:
1、遍历每个节点再用keys方法模糊匹配获取key,再删除
2、Hash-Tag方式

方案2:使用Hash类型存储

鉴于方案1的性能瓶颈在批量获取key上,考虑用hash类型,key=boardId,hashKey=widgetId,删除看板下所有工作表的缓存只要根据boardId为key进行删除即可。

存在问题:
1、每个工作表的缓存都有失效时间,且失效时间各不相同,hash类型不支持hashKey失效
2、因为未对key做超时设置,所以整个key=boardId的数据会在redis中一直存在。

问题1解决方案:在设置值的时候把失效时间给带上,取值的时候先判断下是不是已经失效了,如果失效则把该hashKey删除,直接从数据库中查询数据。
问题2解决方案:加一个定时任务定时(比如10分钟一次)去捞缓存的数据,判断数据是否失效,若数据失效,则清除hashKey

方案3:使用List类型存储

值存储使用方案1的方式,不同之处至于,再额外使用list结构存储某个boardId下的所有key。产生的问题跟方案2的问题2一样,解决方法亦可参考。

最后……以上方法一个都没用,一叶障目……

实际的情况是,一个工作表因为查询sql不一样,所以会产生多条数据,即实际在redis中会有多条记录。这种情况,选择hash结构即可,key为widgetId,hash_key=“MD5(sql)”;至于删除,根据boardId在数据库中可以查到下属所有widgetId,加个事务一把删除即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值