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相关推荐

  1. php redis 删除key 通配符,php中redis批量删除key的方法是什么

    php中redis批量删除key的方法是什么 发布时间:2020-08-28 14:42:05 来源:亿速云 阅读:159 作者:小新 小编给大家分享一下php中redis批量删除key的方法是什么, ...

  2. Redis删除key

    Redis 删除 key 的方式分为两种,一种是单独删除指定的 key ,另一种是根据通配符进行批量删除. 1.删除指定的 key 1.登录 Redis 客户端 redis-cli 注:如果提示&qu ...

  3. pythonredis实例_python redis 删除key脚本的实例

    单机模式 代码片段 安装 pip install redis import redis r = redis.Redis(host='192.168.1.3', port=6188,db=0,decod ...

  4. redis 删除key下特定内容

    redis 删除key下特定内容 import redis def del_hkeys(pattern) : cnt = redis.Redis(host='xxxx',port=6379,db=0) ...

  5. Redis 删除Key命令会导致阻塞么?

    Redis 删除Key命令会导致阻塞么? 会的 如果删除大字符串类型,比如几个G,几百M. 删除单个元素多的列表.集合.有序列表或者哈希表类型的Key 都会导致Redis阻塞发生 如有错误欢迎指正

  6. redis 删除key的命令_面试官问:Redis变慢了,你会怎么排查?

    Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右.但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头 ...

  7. php redis 删除key 通配符,php redis 批量删除keys的方法

    php redis批量删除keys的方法:首先打开命令窗口:然后通过命令"redis-cli keys video* | xargs redis-cli del"实现批量删除key ...

  8. redis删除key命令

    如何批量删除redis中keys 在linux中批量操作redis中的keys的方法: 1.统计个数: redis中名称含有OMP_OFFLINE的key的个数: src/redis-clikeys& ...

  9. 系统性能优化 1-1 Redis删除key和字符串拼接

    个人资源分享网站:首页-小草资源分享网站 1.问题描述 再清除redis缓存的时候,虽然del  key名称  用于删除已存在的key,不存在的key会被忽略,但是再循环体里面,会严重影响代码执行效率 ...

最新文章

  1. 在node.js中一次读取一行文件?
  2. 大连理工大学c语言第三次上机作业答案,大连理工大学软件学院C语言上机第五六章课后题...
  3. 自由自在公司冰淇淋甜美的健康文化
  4. UAC 实现原理及绕过方法
  5. 微博上的网红,为什么更能红得发紫?
  6. WordPress5.7版本下载及更新内容
  7. “3D几何与视觉技术”全球在线研讨会第四期~几何深度学习
  8. pandas流式读取数据,不再担心内存炸裂
  9. java基础01-java历史
  10. C#狂想曲(1):去类型化与弱化语法
  11. ArcMAP 设置图层透明度
  12. 苹果专用视频播放器Elmedia Video Player pro
  13. Unity3d UI自适应之Canvas Scaler详细说明和测试项目源码
  14. 多线程任务超时的处理机制
  15. 拼多多推广中出价是越高效果越好吗?
  16. [置顶]我的2011体会--不是每个程序员都是适合创业,即使你工作了十年
  17. html如何控制图片自动放缩,如何用js控制图片放大缩小
  18. 喷泉设备中的水幕效果
  19. php这个符号怎么打,怎么打出圈2符号
  20. 【数据结构】栈的实现(C语言)

热门文章

  1. 达势股份冲刺港股:年营收16亿 达美乐比萨是重要股东
  2. kali重置登录密码(附镜像)
  3. 再学C语言26:分支和跳转——goto语句
  4. html5media使用api,html5中media(播放器)的api使用指南.pdf
  5. c++Analyse-继承中的对象模型分析
  6. 每日10行代码65:python操作淘宝做淘金币能量任务(11月7日可用)
  7. 在微型计算机中l o是指,微机中的I/O设备是指_______。
  8. Orthogonal Matrix Integration
  9. K-core和K-truss概念和python基本实现
  10. k8s部署MongoDB集群(李作强)