2022-05-12 redis删除key
redis的key删除的时候,是一个阻塞操作;
为什么会阻塞呢,是在删除key的时候,首先要寻找的key,然后进行删除,然而当key已经过期了,或者被他人删除之后,在删除的时候,就找不到这个key,那么它就一直寻找,新版的redis 有最大重试次数(以前的版本直接死循环),那么就会导致一直阻塞.这对于一线上项目来说,阻塞的这段时间可能是致命的;
如何避免??
1 删除普通key,删除key的时候,可以提前判断是否存在,在的时候再进行删除,这样就可以很大概率减少此类事件发生,例如这样:
if (redisTemplate.hasKey(RedisConstant.CASCADE_CHECK_COUNT + cascadeDownTask.getId())) {redisTemplate.delete(RedisConstant.CASCADE_CHECK_COUNT + cascadeDownTask.getId());}
不要直接删除
2 其实还有一种情况,删除的这个key为大 key,什么是大key,不是key有多大,而是key对应的value 很大,例如 redis有五种数据类型,有四个是集合,那么当key对应的集合 非常大的时候,此key 就叫做大key,那么删除的时候,也会导致阻塞问题;
我们可以利用类如 分段处理的方式去处理,例如: 目前redis中对应的数据类型是hash,然后hash中有大量 hk ,我们可以分段去删除,然后每次删除休眠一下,这样可以有效减少redis的压力
@SpringBootTest
@Slf4j
class AreaDemoControllerTest {// @Autowired
// IAreaDemoService areaDemoService;
//
// @Autowired
// AreaDemoMapper areaDemoMapper;// @Test
// public void aaa(){
// List<AreaDemo> list = areaDemoService.list();
//
// List<AreaDemo> areaDemos1 = list.subList(0, 10);
// areaDemos1.forEach(demo -> demo.setId(null));
// areaDemoMapper.updateBatch(areaDemos1);
// }@AutowiredRedisTemplate redisTemplate;/*** @Description 模拟批量删除大key* @Author FL* @Date 11:08 2022/5/12* @Param []**/@Testpublic void tetsts() {String key = "mapKey";redisTemplate.opsForHash().put(key, "NAME", "小明");redisTemplate.opsForHash().put(key, "age", "32");redisTemplate.opsForHash().put(key, "add", "西湖");redisTemplate.opsForHash().put(key, "tianqi", "晴朗");redisTemplate.opsForHash().put(key, "heart", "nice");redisTemplate.opsForHash().put(key, "shoot", "nike");redisTemplate.opsForHash().put(key, "sex", "男");Cursor scan = redisTemplate.opsForHash().scan(key, ScanOptions.NONE);int i = 0;while (scan.hasNext()) {Object next = scan.next();System.out.println(++i);}
// redisTemplate.opsForHash().delete(key);removeBigKey(key, 2, 100);// 每次删除两个 休眠100ms}public void removeBigKey(String key, int scanCount, long intervalMills) throws CacheException {final ScanOptions scanOptions = ScanOptions.scanOptions().count(scanCount).build();// 避免内存泄漏// 执行循环删除List<String> fieldKeyList = new ArrayList<>();try {Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan(key, scanOptions);if (ObjectUtil.isNotNull(cursor)) {while (cursor.hasNext()) {String fieldKey = String.valueOf(cursor.next().getKey());fieldKeyList.add(fieldKey);if (fieldKeyList.size() >= scanCount) {// 批量删除Object[] fields = fieldKeyList.toArray();redisTemplate.opsForHash().delete(key, fields);log.info("[Big key] remove key: {}, fields size: {}", key, fields.length);// 清空列表,重置操作fieldKeyList.clear();// 沉睡等待,避免对 redis 压力太大
// DateUtil.sleepInterval(intervalMills, TimeUnit.MILLISECONDS);Thread.sleep(intervalMills);}}}// 最后 fieldKeyList 中可能还有剩余,不过一般数量不大,直接删除速度不会很慢// 执行 key 本身的删除
// redisTemplate.opsForHash().delete(key,fieldKeyList);redisTemplate.opsForHash().delete(key, fieldKeyList.toArray());} catch (Exception e) {// log.error();}}}
代码均在 test中
2022-05-12 redis删除key相关推荐
- php redis 删除key 通配符,php中redis批量删除key的方法是什么
php中redis批量删除key的方法是什么 发布时间:2020-08-28 14:42:05 来源:亿速云 阅读:159 作者:小新 小编给大家分享一下php中redis批量删除key的方法是什么, ...
- Redis删除key
Redis 删除 key 的方式分为两种,一种是单独删除指定的 key ,另一种是根据通配符进行批量删除. 1.删除指定的 key 1.登录 Redis 客户端 redis-cli 注:如果提示&qu ...
- pythonredis实例_python redis 删除key脚本的实例
单机模式 代码片段 安装 pip install redis import redis r = redis.Redis(host='192.168.1.3', port=6188,db=0,decod ...
- redis 删除key下特定内容
redis 删除key下特定内容 import redis def del_hkeys(pattern) : cnt = redis.Redis(host='xxxx',port=6379,db=0) ...
- Redis 删除Key命令会导致阻塞么?
Redis 删除Key命令会导致阻塞么? 会的 如果删除大字符串类型,比如几个G,几百M. 删除单个元素多的列表.集合.有序列表或者哈希表类型的Key 都会导致Redis阻塞发生 如有错误欢迎指正
- redis 删除key的命令_面试官问:Redis变慢了,你会怎么排查?
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右.但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头 ...
- php redis 删除key 通配符,php redis 批量删除keys的方法
php redis批量删除keys的方法:首先打开命令窗口:然后通过命令"redis-cli keys video* | xargs redis-cli del"实现批量删除key ...
- redis删除key命令
如何批量删除redis中keys 在linux中批量操作redis中的keys的方法: 1.统计个数: redis中名称含有OMP_OFFLINE的key的个数: src/redis-clikeys& ...
- 系统性能优化 1-1 Redis删除key和字符串拼接
个人资源分享网站:首页-小草资源分享网站 1.问题描述 再清除redis缓存的时候,虽然del key名称 用于删除已存在的key,不存在的key会被忽略,但是再循环体里面,会严重影响代码执行效率 ...
最新文章
- 在node.js中一次读取一行文件?
- 大连理工大学c语言第三次上机作业答案,大连理工大学软件学院C语言上机第五六章课后题...
- 自由自在公司冰淇淋甜美的健康文化
- UAC 实现原理及绕过方法
- 微博上的网红,为什么更能红得发紫?
- WordPress5.7版本下载及更新内容
- “3D几何与视觉技术”全球在线研讨会第四期~几何深度学习
- pandas流式读取数据,不再担心内存炸裂
- java基础01-java历史
- C#狂想曲(1):去类型化与弱化语法
- ArcMAP 设置图层透明度
- 苹果专用视频播放器Elmedia Video Player pro
- Unity3d UI自适应之Canvas Scaler详细说明和测试项目源码
- 多线程任务超时的处理机制
- 拼多多推广中出价是越高效果越好吗?
- [置顶]我的2011体会--不是每个程序员都是适合创业,即使你工作了十年
- html如何控制图片自动放缩,如何用js控制图片放大缩小
- 喷泉设备中的水幕效果
- php这个符号怎么打,怎么打出圈2符号
- 【数据结构】栈的实现(C语言)
热门文章
- 达势股份冲刺港股:年营收16亿 达美乐比萨是重要股东
- kali重置登录密码(附镜像)
- 再学C语言26:分支和跳转——goto语句
- html5media使用api,html5中media(播放器)的api使用指南.pdf
- c++Analyse-继承中的对象模型分析
- 每日10行代码65:python操作淘宝做淘金币能量任务(11月7日可用)
- 在微型计算机中l o是指,微机中的I/O设备是指_______。
- Orthogonal Matrix Integration
- K-core和K-truss概念和python基本实现
- k8s部署MongoDB集群(李作强)