redis-redisTemplate模糊匹配删除

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

        String key = "noteUserListenedPoi:*";
            redisTemplate.delete(key);
            LOGGER.info("redis中用户收听历史被清空");

结果发现不行, 

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

Set<String> keys = redisTemplate.keys("noteUserListenedPoi:" + "*");
            redisTemplate.delete(keys);
            LOGGER.info("{}, redis中用户收听历史被清空"

可以用了

Redis模糊查询

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

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

其中:

*:通配任意多个字符

?:通配单个字符

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

public Set keys(String pattern){
  return stringRedisTemplate.keys("*" + pattern + "*");
   // return stringRedisTemplate.keys("?" + pattern);
  // return stringRedisTemplate.keys("[" + pattern + "]");
}

批量查询

Set<String> keysList = stringRedisTemplate.keys(keys);
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


List<String> keys = new ArrayList<>();
//初始keys
List<YourObject> list = this.redisTemplate.opsForValue().multiGet(keys);

2、利用PipeLine

public void getBatch(List<String> keys, long expireTime) {
        //使用pipeline方式
        redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
                keys.forEach(e -> {
                    connection.get(redisTemplate.getKeySerializer().serialize(e))
                });
               
                return null;
            }
        });


    }

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

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

批量设置Set 

1、利用mSet


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

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

2、利用PipeLine

public void setBatch(Map<String, Map> map, long expireTime) {
        //使用pipeline方式
        redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
                map.forEach((key, value) -> {
                    if (expireTime > 0) {
                        connection.setEx(redisTemplate.getKeySerializer().serialize(key), expireTime, redisTemplate.getValueSerializer().serialize(value));
                    } else {
                        connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value));
                    }

                });
                return null;
            }
        });


    }

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐