解决spring中redistemplate不能用通配符keys查出相应Key的问题

 更新时间:2020年11月24日 09:45:08   作者:大树叶  
这篇文章主要介绍了解决spring中redistemplate不能用通配符keys查出相应Key的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除。

但是在keys(patten+"*")时每次取出的都为空。

解决问题:

spring中redis配置中,引入StringRedisTemplate而不是RedisTemplate,StringRedisTemplate本身继承自RedisTemplate,

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>

改为

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>

补充知识:RedisTemplate使用SCAN命令扫描key替代KEYS避免redis服务器阻塞,无坑!完美解决方案

先来鄙视下博客上很多人不懂瞎几把乱说还有大量转载误导群众,本文原创亲自验证方案。

话不多说先上代码,拿走即用。

long start = System.currentTimeMillis();
 //需要匹配的key
 String patternKey = "pay:*";
 ScanOptions options = ScanOptions.scanOptions()
  //这里指定每次扫描key的数量(很多博客瞎说要指定Integer.MAX_VALUE,这样的话跟 keys有什么区别?)
  .count(10000)
  .match(patternKey).build();
 RedisSerializer<String> redisSerializer = (RedisSerializer<String>) redisTemplate.getKeySerializer();
 Cursor cursor = (Cursor) redisTemplate.executeWithStickyConnection(redisConnection -> new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize));
 List<String> result = new ArrayList<>();
 while(cursor.hasNext()){
  result.add(cursor.next().toString());
 }
 //切记这里一定要关闭,否则会耗尽连接数。报Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a 
 cursor.close();
 log.info("scan扫描共耗时:{} ms key数量:{}",System.currentTimeMillis()-start,result.size());

以上这篇解决spring中redistemplate不能用通配符keys查出相应Key的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java用邻接表存储图的示例代码

    Java用邻接表存储图的示例代码

    邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点。本文将用邻接表实现存储图,感兴趣的小伙伴可以了解一下
    2022-06-06
  • 详解java中的四种代码块

    详解java中的四种代码块

    这篇文章主要介绍了详解java中的四种代码块,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java实现批量修改txt文件名称的方法示例

    Java实现批量修改txt文件名称的方法示例

    这篇文章主要介绍了Java实现批量修改txt文件名称的方法,结合实例形式分析了Java针对目录文件遍历及文件读写、属性操作等相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • Mybatis执行Update返回行数为负数的问题

    Mybatis执行Update返回行数为负数的问题

    这篇文章主要介绍了Mybatis执行Update返回行数为负数的问题,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java根据开始时间和结束时间及周几计算日期的示例代码

    Java根据开始时间和结束时间及周几计算日期的示例代码

    在Java 7中,java.time包不存在,所以我们需要使用java.util.Calendar和java.util.Date类来实现类似的功能,这篇文章主要介绍了Java根据开始时间和结束时间及周几计算出日期的示例代码,需要的朋友可以参考下
    2024-06-06
  • 浅谈Java中的final关键字与C#中的const, readonly关键字

    浅谈Java中的final关键字与C#中的const, readonly关键字

    下面小编就为大家带来一篇浅谈Java中的final关键字与C#中的const, readonly关键字。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • SpringBoot配置动态数据源的实战详解

    SpringBoot配置动态数据源的实战详解

    Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map<String, DataSource>,当JDBC操作数据库之时,会根据不同的key值选择不同的数据源,本文介绍了SpringBoot配置动态数据源的方法,需要的朋友可以参考下
    2024-08-08
  • Java object类及正则表达式原理解析

    Java object类及正则表达式原理解析

    这篇文章主要介绍了Java object类及正则表达式原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java Spring AOP详解

    Java Spring AOP详解

    这篇文章主要介绍了Java的Spring框架中的AOP实现实例,AOP面向切面编程其实也可以被看作是一个设计模式去规范项目的结构,需要的朋友可以参考下
    2021-09-09
  • mybatis新增到数据库后返回当前ID问题

    mybatis新增到数据库后返回当前ID问题

    这篇文章主要介绍了mybatis新增到数据库后返回当前ID问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论