redis-redisTemplate模糊匹配删除 通过key模糊删除,批量删除,批量查询,批量GET,批量设置相关数据

  • A+
所属分类:Java redis

redis-redisTemplate模糊匹配删除

前几天需要一个模糊删除redis中key的功能, 没有多想,  直接


  1.         String key = "noteUserListenedPoi:*";


  2. redisTemplate.delete(key);


  3. LOGGER.info("redis中用户收听历史被清空");

结果发现不行, 

后来测试发现模糊查询是可以用的, 找了下资料, 改成


  1. Set<String> keys = redisTemplate.keys("noteUserListenedPoi:" + "*");


  2. redisTemplate.delete(keys);


  3. LOGGER.info("{}, redis中用户收听历史被清空"

可以用了

Redis模糊查询

可以通过Redis中keys命令进行获取key值,具体命令格式:keys pattern

文中提到redis中允许模糊查询的有3个通配符,分别是:*,?,[]

其中:

*:通配任意多个字符

?:通配单个字符

[]:通配括号内的某一个字符


  1. public Set keys(String pattern){


  2.   return stringRedisTemplate.keys("*" + pattern + "*");


  3. // return stringRedisTemplate.keys("?" + pattern);


  4.   // return stringRedisTemplate.keys("[" + pattern + "]");


  5. }

批量查询


  1. Set<String> keysList = stringRedisTemplate.keys(keys);


  2. List<String> strings = stringRedisTemplate.opsForValue().multiGet(keysList);

单个

 redisTemplate.opsForValue().set(keys+1,"this is a test content!",1000,TimeUnit.SECONDS);
        String content=redisTemplate.opsForValue().get(keys+1).toString();
        System.out.println("---------》获取到缓存的内容为:"+content);
        redisTemplate.delete(redisTemplate.keys(keys+"*"));
        Object msg=redisTemplate.opsForValue().get(keys+1);

批量设置或者查询

1、利用mGet



  1. List<String> keys = new ArrayList<>();


  2. //初始keys


  3. List<YourObject> list = this.redisTemplate.opsForValue().multiGet(keys);

2、利用PipeLine


  1. public void getBatch(List<String> keys, long expireTime) {


  2. //使用pipeline方式


  3. redisTemplate.executePipelined(new RedisCallback<List<Object>>() {


  4. @Override


  5. public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {


  6. keys.forEach(e -> {


  7. connection.get(redisTemplate.getKeySerializer().serialize(e))


  8. });



  9. return null;


  10. }


  11. });




  12. }

其实2者底层都是用到execute方法,multiGet在使用连接是没用到pipeline,一条命令直接传给Redis,Redis返回结果。而executePipelined实际上一条或多条命令,但是共用一个连接。

还有一点,就是查询返回的结果,和键的顺序是一一对应的,如果没查到,会返回null值。

批量设置Set 

1、利用mSet



  1. Map<String,String> map= new HashMap<>();



  2. this.redisTemplate.opsForValue().multiSet(map);

2、利用PipeLine


  1. public void setBatch(Map<String, Map> map, long expireTime) {


  2. //使用pipeline方式


  3. redisTemplate.executePipelined(new RedisCallback<List<Object>>() {


  4. @Override


  5. public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {


  6. map.forEach((key, value) -> {


  7. if (expireTime > 0) {


  8. connection.setEx(redisTemplate.getKeySerializer().serialize(key), expireTime, redisTemplate.getValueSerializer().serialize(value));


  9. } else {


  10. connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value));


  11. }



  12. });


  13. return null;


  14. }


  15. });

}

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: