redis通过key模糊搜索_Redis中关于Key的模糊查
最近使⽤Redis优化项⽬功能,其中有⼀部分为模糊查询,了很多帖⼦,也没有到很好的解决⽅案和思路,最终皇天不负有⼼⼈啊,终于让我到了
jdbctemplate查询一条数据可以通过Redis中keys命令进⾏获取key值,具体命令格式:keys pattern
⽂中提到redis中允许模糊查询的有3个通配符,分别是:*,?,[]
其中:
*:通配任意多个字符
:通配单个字符
[]:通配括号内的某⼀个字符
=========================================================================
在实际项⽬中有可能会使⽤spring集成redis的RedisTemplate进⾏操作,这样在注⼊模板时可能会出现模糊查询不好⽤的情况,是因为keys⽅法是存在于StringRedisTemplate⼦类中(⽗类-RedisTemplate)的
在spring配置时,⼀定要注意
=========================================================================
实际操作中具体的思路:
1. 将要查询的条件当做key进⾏ZSet存储
2. 在获取时,调⽤StringRedisTemplate.keys(pattern),例:
1
2
3
4
5
publicSet keys(String pattern){
returnstringRedisTemplate.keys(“*”+ pattern + “*”);
// return stringRedisTemplate.keys(“?” + pattern);
// return stringRedisTemplate.keys(“[” + pattern + “]”);
}
ps:模糊查适⽤于 String数据结构,对redis⽀持的其他结构(List、set等),没有 验证是否⽀持。
实践代码:
/**
* redis缓存操作类
*/
@Service
publicclassRedisCacheServiceimplementsInitializingBean{
privateValueOperations valueOperations;
@Autowired
privateStringRedisTemplate redisTemplate;
@SuppressWarnings(“unchecked”)
@Override
publicvoidafterPropertiesSet()throwsException{
RedisSerializer redisSerializer =newStringRedisSerializer();
valueOperations = redisTemplate.opsForValue();
}
/**
* 从缓存中获取资源信息
*@paramkey
*@return
*/
publicListgetCacheResource(String key){
Set keys = redisTemplate.keys(key);
if(CollectionUtils.isEmpty(keys)) {
returnnewArrayList<>();
}
List resourceCacheBOList =newArrayList<>();
for(String accurateKey : keys) {
String cacheValue = (accurateKey);
List sub = JSONArray.parseArray(cacheValue, ResourceCacheBO.class);
resourceCacheBOList.addAll(sub);
}
returnresourceCacheBOList;
}
遇到问题:存在key:“A_091_JPFX”,但是⽤ 模糊key:“A_*_JPFX”匹配时,却匹配不到;有资料说是编码问题,按下⾯⽅式解决:在使⽤redisTemplate.keys查keys时,发现明明相应的key是存在的,模糊查询就是查不出来;原因有⼆:
1.确定你的查询字符串是否正确
2.就是的你key值有可能是乱码了就是遇到\xca\xed加上你key之类的乱码!例如:这⾥写图⽚描述
你需要重新定义key
@Bean
publicRedisTemplateredisTemplate(RedisConnectionFactory factory){
RedisTemplate redisTemplate =newRedisTemplate();
redisTemplate.setConnectionFactory(factory);
//key序列化⽅式;(不然会出现乱码;),但是如果⽅法上有Long等⾮String类型的话,会报类型转换错误;
//所以在没有⾃⼰定义key⽣成策略的时候,以下这个代码建议不要这么写,可以不配置或者⾃⼰实现ObjectRedisSerializer //或者JdkSerializationRedisSerializer序列化⽅式;
RedisSerializer redisSerializer =newStringRedisSerializer();//Long类型不可以会出现异常信息;
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashKeySerializer(redisSerializer);
returnredisTemplate;
}
完整代码:
importcom.alibaba.fastjson.JSONArray;
importorg.springframework.beans.factory.InitializingBean;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.StringRedisTemplate;
importorg.ValueOperations;
importorg.dis.serializer.RedisSerializer;
importorg.dis.serializer.StringRedisSerializer;
importorg.springframework.stereotype.Service;
importorg.springframework.util.CollectionUtils;
importorg.springframework.util.StringUtils;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.List;
importjava.util.Set;
/**
* redis缓存操作类
*/
@Service
publicclassRedisCacheServiceimplementsInitializingBean{
privateValueOperations valueOperations;
@Autowired
privateStringRedisTemplate redisTemplate;
@SuppressWarnings(“unchecked”)
@Override
publicvoidafterPropertiesSet()throwsException{
RedisSerializer redisSerializer =newStringRedisSerializer();//Long类型不可以会出现异常信息; redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashKeySerializer(redisSerializer);
valueOperations = redisTemplate.opsForValue();
}
/**
* 缓存资源
*@paramkey
*@paramresourceCacheBOList
*/
publicvoidcacheResource(String key, List resourceCacheBOList){
// 参数校验
if(CollectionUtils.isEmpty(resourceCacheBOList)) {
thrownewBizException(1,”参数有误”);
}
/
/ 缓存
String resourceCacheValue = JacksonJsonUtil.objectToString(resourceCacheBOList); valueOperations.set(key, resourceCacheValue);
}
/**
* 从缓存中获取资源信息
*@paramkey
*@return
*/
// TODO 待测试
publicListgetCacheResource(String key){
Set keys = redisTemplate.keys(key);
if(CollectionUtils.isEmpty(keys)) {
returnnewArrayList<>();
}
List resourceCacheBOList =newArrayList<>();
for(String accurateKey : keys) {
String cacheValue = (accurateKey);
List sub = JSONArray.parseArray(cacheValue, ResourceCacheBO.class); resourceCacheBOList.addAll(sub);
}
returnresourceCacheBOList;
}
/**
* 缓存 关键字的编码
*@paramkey
*@return
*/
publicvoidcacheKeyWordCode(String key, String code){
// 参数校验
if(StringUtils.isEmpty(key) || StringUtils.isEmpty(code)) { thrownewBizException(1,”参数有误”);
}
// 缓存
valueOperations.set(key, code);
}
/
**
* 获取 关键字的编码
*@paramkey
*@return
*/
publicStringgetKeyWordCode(String key){
String keyWordCode = (key);
if(StringUtils.isEmpty(keyWordCode)) {
returnnull;
}else{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论