谈谈使用Redis缓存时批量删除的几种实现
原文:谈谈使用Redis缓存时批量删除的几种实现

前言

在使用缓存的时候,我们时不时会遇到这样一个需求,根据缓存键的规则去批量删除这些数据,比较常见的就是按前缀去删除。

举个简单的例子,Redis中现在有几百个商品的数据,这些数据的key值是有一定规律的,都是以product:id的形式存在的。

现在由于不得以为的原因要删除这几百个商品的数据,这个时候我们肯定就要把缓存键以product:开头的给全部删除掉。

其实这个需求在Redis中是可以很容易去实现的。

来看看几种常见的做法。

常见的几种做法

  1. 用Keys命令找到key之后执行删除操作
  2. 用Scan命令找到key之后执行删除操作(2.8.0版本之后)
  3. 添加缓存数据的时候,可以同时将key存放到一个SET中,然后依据这个SET来执行删除操作

对于Keys命令,网上有不少血的教训,对于生产环境还是要谨慎谨慎再谨慎!能不用就别用。

Scan命令的话是大部分人推荐的做法,是增量式迭代的一个命令。

存到SET中就相对繁琐一点,而且额外占用了一部分内存。而且在进行删除的时候还要从这里读取出相应的key,同时也要移除这部分key的数据。

下面来看看如何在.NET Core中来处理,主要还是针对SCAN的做法。

示例操作Redis用的是StackExchange.Redis

使用IServer.Keys

可能有人会有疑惑,不是说Keys命令尽量不要用吗?怎么你还用?

这个还真的要解释一下!

可能从方法上,我们找遍所有IServer和IDataBase接口都找不到纯粹的SCAN命令(SetScan,HashScan等除外)。

但是如果看过里面的实现,你就会知道是为什么了!

传送门:Keys

可以看看下图高亮的两行代码:

大致意思就是,如果你用的Redis的版本支持SCAN命令,走的就是SCAN,反之只能是KEYS了。

下面定义一个查找RedisKey的方法。

private static RedisKey[] SearchRedisKeys(IServer server, string pattern)
{var keys = server.Keys(pattern: pattern).ToArray();Console.WriteLine("Search Count-{0}",keys.Length);return keys;
}

知道那些Key要删除,剩下的就比较简单了!

private static void KeysOrScanSolution(IServer server,IDatabase db, string pattern)
{            db.KeyDelete(SearchRedisKeys(server, pattern));
}

使用IDatabase.Execute

IServer.Keys可以说是隐式的调用了SCAN命令,那么我们自然也可以显式的去调用这个命令来完成这些。

private static RedisKey[] SearchRedisKeys(IDatabase db,string pattern)
{var keys = new HashSet<RedisKey>();int nextCursor = 0;do{RedisResult redisResult = db.Execute("SCAN", nextCursor.ToString(), "MATCH", pattern, "COUNT", "1000");var innerResult = (RedisResult[])redisResult;nextCursor = int.Parse((string)innerResult[0]);List<RedisKey> resultLines = ((RedisKey[])innerResult[1]).ToList();keys.UnionWith(resultLines);}while (nextCursor != 0);return keys.ToArray();
}

删除的代码。

private static void ExecuteSolution(IDatabase db, string pattern)
{db.KeyDelete(SearchRedisKeys(db, pattern));
}

当然还有一种做法是调用lua脚本去完成,这里就不细说了。

总结

虽然上面几种做法能比较简单的处理这个问题,但是在拿出这些Keys的时候,客户端的内存占用可能会比较大,尤其是有大量符合条件的缓存项的时候。

涉及缓存的诸多操作(包含根据前缀去删除缓存项),我也在EasyCaching中实现了相应的操作,后面也会不断的抽时间来完善这一项目,有兴趣的朋友可以关注一下。

文中的示例代码 RedisBatchRemoveSolution

posted on 2018-05-21 16:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9068023.html

谈谈使用Redis缓存时批量删除的几种实现相关推荐

  1. redis优雅的批量删除key

    redis优雅的批量删除key 近期在处理redis的故障中,发现需要删除大量的历史数据(也是bigkeys),好在符合正则表达式.要不然就很痛苦,这也体现了在设计key的时候遵循规范带来的维护好处之 ...

  2. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  3. redis集群批量删除指定的key

    工作中遇到一个问题,redis中存储了大量的key,而且没有设置时效,其中很大一部分后来都没用了,导致redis体积庞大,查询缓慢.服务器版本为windows,网上搜索到很多批量删除的方法都是Linu ...

  4. Redis 按关键字批量删除

    redis按关键字批量删除的方法 1.执行命令 redis-cli -h ip -p 端口 -a 密码 keys 关键字* | xargs redis-cli -h ip -p 端口 -a 密码 de ...

  5. concurrentbag 删除指定元素_Python实现列表索引批量删除的5种方法_python

    这篇文章主要介绍了Python实现列表索引批量删除的5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 最近用Java做项目 ...

  6. 批量删除的三种实现方式

    vue+springboot实现批量删除的三种实现方式 1.Post请求方式 前端代码 //参数封装 handleSelectionChange(val){this.multipleSelection ...

  7. java redis 批量删除_在Spring中使用Redis Lua脚本批量删除缓存

    背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...

  8. Redis集群批量删除key

    一.说明 通常为了减轻数据库的压力提高性能,我们会使用数据缓存(我使用的redis).但是有时出于各种目的(比如有个配置需要立即刷新)我们需要将redis中某种类型(通常是有固定的前缀)的数据批量删除 ...

  9. memcache 缓存的批量删除方案(转)

    memcache 默认只支持使用delete(key)和 flush_all,这两种方法都太极端了,不能满足用户的特定需求,如:批量删除'aaaaaaaa_'开头的所有缓存,这个时候该怎么办? 1 g ...

最新文章

  1. 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:小技能 DeleteMark)...
  2. leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
  3. Hadoop动态扩容,增加节点
  4. Unity3D入门其实很简单
  5. 上百个Android开源项目分享
  6. 一图看懂软件缺陷检查涉及的内容
  7. 易筋经:现代化支付系统脉络梳理
  8. 史上最全IT技能学习大全公众号
  9. 34款Firefox渗透测试插件
  10. excel锁定单元格不能修改_3步让表格只能输入不能修改,保护表格格式,快速搞定数据汇总...
  11. 【渝粤教育】电大中专学前教育学作业 题库
  12. 黑客突破防火墙常用的几种技术(转)
  13. 怎样记账才能清楚、简单
  14. 山科大 6-1 sdust-Java-可实现多种排序的Book类 (20 分)(18 软件 期中考试函数1)
  15. 【Lilishop商城】No3-3.模块详细设计,会员信息(会员基本信息)、店铺设置(店铺信息、配送模板)的详细设计
  16. XX nm制造工艺是什么概念?实现7nm制程工艺为什么这么困难?
  17. 开启「浏览器多线程下载」选项
  18. ubuntu16.04截图工具Shutter安装,设置快捷键
  19. mysql master status_mysql show master status为空值
  20. 【论文笔记】Regional Differential Information Entropy for Super-Resolution ImageQuality Assessment

热门文章

  1. JavaScript浏览器对象模型常用事件(2)
  2. PAT—1082 射击比赛(20)
  3. android马赛克代码,android图片马赛克 mosaic
  4. python 请求头_Python爬虫:将headers请求头字符串转为字典
  5. select默认选中的option_技巧:MacOS 中 Option 键的隐藏功能
  6. 操作系统—进程控制和进程通信
  7. Csrf漏洞概述及其原理
  8. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)
  9. 绘制图像直方图 matplotlib
  10. matlab2c使用c++实现matlab函数系列教程-unique函数