redis-redisTemplate模糊匹配删除 通过key模糊删除,批量删除,批量查询,批量GET,批量设置相关数据
redis-redisTemplate模糊匹配删除前几天需要一个模糊删除redis中key的功能, 没有多想, 直接 String key = "noteUserListenedPoi:*";redisTemplate.delete(key);LOGGER.info("redis中用户收听历史被清空");结果发现不行...
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;
}
});
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)