redis模糊查找

article/2025/9/23 21:13:48

 

 

【redis模糊查找】

原文链接:https://www.cnblogs.com/commissar-Xia/p/7759484.html

最近使用Redis优化项目功能,其中有一部分为模糊查询,找了很多帖子,也没有找到很好的解决方案和思路,最终皇天不负有心人啊,终于让我找到了!!!

感谢该帖作者:WalkerAlone  原文链接:http://blog.csdn.net/qq_28893679/article/details/53005057

可以通过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

public Set keys(String pattern){

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

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

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

}

 

ps:模糊查找适用于 String数据结构,对redis支持的其他结构(List、set等),没有 验证是否支持。

 

实践代码:

/*** redis缓存操作类*/
@Service
public class RedisCacheService implements InitializingBean {private ValueOperations<String, String> valueOperations;@Autowiredprivate StringRedisTemplate redisTemplate;@SuppressWarnings("unchecked")@Overridepublic void afterPropertiesSet() throws Exception {RedisSerializer<String> redisSerializer = new StringRedisSerializer();valueOperations = redisTemplate.opsForValue();}/*** 从缓存中获取资源信息* @param key* @return*/public List<ResourceCacheBO> getCacheResource(String key) {Set<String> keys = redisTemplate.keys(key);if (CollectionUtils.isEmpty(keys)) {return new ArrayList<>();}List<ResourceCacheBO> resourceCacheBOList = new ArrayList<>();for (String accurateKey : keys) {String cacheValue = valueOperations.get(accurateKey);List<ResourceCacheBO> sub = JSONArray.parseArray(cacheValue, ResourceCacheBO.class);resourceCacheBOList.addAll(sub);}return resourceCacheBOList;}

 

【key存在,而redisTemplate查找不到】

遇到问题:存在key:“A_091_JPFX”,但是用 模糊key:“A_*_JPFX”匹配时,却匹配不到;有资料说是编码问题,按下面方式解决:

原文链接:redisTemplate.keys(pattern)模糊查询找不到keys:https://blog.csdn.net/cutterwolf/article/details/77990112

 

在使用redisTemplate.keys查找keys时,发现明明相应的key是存在的,模糊查询就是查找不出来;原因有二: 
1.确定你的查询字符串是否正确 
2.就是的你key值有可能是乱码了就是遇到\xca\xed加上你key之类的乱码!例如:这里写图片描述 
你需要重新定义key

 @Bean  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {  RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();  redisTemplate.setConnectionFactory(factory);  //key序列化方式;(不然会出现乱码;),但是如果方法上有Long等非String类型的话,会报类型转换错误;  //所以在没有自己定义key生成策略的时候,以下这个代码建议不要这么写,可以不配置或者自己实现ObjectRedisSerializer  //或者JdkSerializationRedisSerializer序列化方式;  RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;  redisTemplate.setKeySerializer(redisSerializer);  redisTemplate.setHashKeySerializer(redisSerializer);  return redisTemplate;  }   

 

 

完整代码:

package cn.xxt.word.analysis.service;import cn.xxt.ssm.commons.exception.BizException;
import cn.xxt.ssm.commons.json.JacksonJsonUtil;
import cn.xxt.word.analysis.pojo.bo.QuestCacheBO;
import cn.xxt.word.analysis.pojo.bo.ResourceCacheBO;
import com.alibaba.fastjson.JSONArray;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;/*** redis缓存操作类*/
@Service
public class RedisCacheService implements InitializingBean {private ValueOperations<String, String> valueOperations;@Autowiredprivate StringRedisTemplate redisTemplate;@SuppressWarnings("unchecked")@Overridepublic void afterPropertiesSet() throws Exception {RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以会出现异常信息;redisTemplate.setKeySerializer(redisSerializer);redisTemplate.setHashKeySerializer(redisSerializer);valueOperations = redisTemplate.opsForValue();}/*** 缓存资源* @param key* @param resourceCacheBOList*/public void cacheResource(String key, List<ResourceCacheBO> resourceCacheBOList) {// 参数校验if (CollectionUtils.isEmpty(resourceCacheBOList)) {throw new BizException(1, "参数有误");}// 缓存String resourceCacheValue = JacksonJsonUtil.objectToString(resourceCacheBOList);valueOperations.set(key, resourceCacheValue);}/*** 从缓存中获取资源信息* @param key* @return*/// TODO 待测试public List<ResourceCacheBO> getCacheResource(String key) {Set<String> keys = redisTemplate.keys(key);if (CollectionUtils.isEmpty(keys)) {return new ArrayList<>();}List<ResourceCacheBO> resourceCacheBOList = new ArrayList<>();for (String accurateKey : keys) {String cacheValue = valueOperations.get(accurateKey);List<ResourceCacheBO> sub = JSONArray.parseArray(cacheValue, ResourceCacheBO.class);resourceCacheBOList.addAll(sub);}return resourceCacheBOList;}/*** 缓存 关键字的编码* @param key* @return*/public void cacheKeyWordCode(String key, String code) {// 参数校验if (StringUtils.isEmpty(key) || StringUtils.isEmpty(code)) {throw new BizException(1, "参数有误");}// 缓存valueOperations.set(key, code);}/*** 获取 关键字的编码* @param key* @return*/public String getKeyWordCode(String key) {String keyWordCode = valueOperations.get(key);if (StringUtils.isEmpty(keyWordCode)) {return null;} else {return keyWordCode;}}/*** 批量获取 关键字的编码* @param keys* @return*/public List<String> batchGetKeyWordCode(List<String> keys) {List<String> codes = valueOperations.multiGet(keys);if (CollectionUtils.isEmpty(codes)) {return new ArrayList<>();} else {codes.removeAll(Collections.singleton(null));return codes;}}}

 

【RedisTemplate和StringRedisTemplate的区别】

原文链接:https://blog.csdn.net/notsaltedfish/article/details/75948281

 

最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了。

我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate和StringRedisTemplate

他们两者之间的区别,以及该怎么使用。

RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?其实他们两者之间的区别主要在于他们使用的序列化类。

  • RedisTemplate使用的是 JdkSerializationRedisSerializer
  • StringRedisTemplate使用的是 StringRedisSerializer

 

RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组

然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式

展现的,而是以字节数组显示,类似下面


当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的

数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据

注:使用的软件是RedisDesktopManager

RedisTemplate就无法获取导数据,这个时候获取到的值就是NULL。这个时候StringRedisTempate就派上了用场

 

当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。

所以当你使用RedisTemplate获取不到数据的时候请检查一下是不是Redis里面的数据是可读形式而非字节数组

 

另外我在测试的时候即使把StringRedisTemplate的序列化类修改成RedisTemplate的JdkSerializationRedisSerializer

最后还是无法获取被序列化的对象数据,即使是没有转化为对象的字节数组,代码如下

@Testpublic void testRedisSerializer(){User u = new User();u.setName("java");u.setSex("male");redisTemplate.opsForHash().put("user:","1",u);/*查看redisTemplate 的Serializer*/System.out.println(redisTemplate.getKeySerializer());System.out.println(redisTemplate.getValueSerializer());/*查看StringRedisTemplate 的Serializer*/System.out.println(stringRedisTemplate.getValueSerializer());System.out.println(stringRedisTemplate.getValueSerializer());/*将stringRedisTemplate序列化类设置成RedisTemplate的序列化类*/stringRedisTemplate.setKeySerializer(new JdkSerializationRedisSerializer());stringRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());/*即使在更换stringRedisTemplate的的Serializer和redisTemplate一致的* JdkSerializationRedisSerializer* 最后还是无法从redis中获取序列化的数据* */System.out.println(stringRedisTemplate.getValueSerializer());System.out.println(stringRedisTemplate.getValueSerializer());User user = (User) redisTemplate.opsForHash().get("user:","1");User user2 = (User) stringRedisTemplate.opsForHash().get("user:","1");System.out.println("dsd");}

总结:

当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可,

但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

 

 


http://chatgpt.dhexx.cn/article/C6rCLB4d.shtml

相关文章

C++的模糊查找的实现(简版)

string::size_type pos 0;if (this->w_emparray[j]->w_name.find(sname, pos) ! string::npos){cout << "编号&#xff1a; " << this->w_emparray[j]->w_id << "\t";cout << "姓名&#xff1a;" <<…

final cut pro快捷键

转自&#xff1a;http://www.mfcpx.com/keyboard/

mac端fcpx视频剪辑 Final Cut Pro for Mac10.6.7

Final Cut Pro是一款功能强大、操作简单的专业视频编辑软件&#xff0c;深受广大影视工作者和爱好者的喜爱 影片剪接师可以快捷轻松地制作抢眼的动态图像&#xff0c;图像会随着影片中的面孔或物件移动。 在全新16 吋MacBook Pro 上进行物件追踪分析快达5 倍&#xff0c;这项功…

Final Cut Pro X 清除缓存方法

当我们制作完视频时候&#xff0c;会发现源文件想当大&#xff0c;我这个128的Mac Pro 根本无法吃消&#xff0c;必须给它来个猪变猴子大瘦身。 清除缓存方法 打开FCPX&#xff0c;选择资源库&#xff0c;右键在访达中显示&#xff0c;如图&#xff1a; 选择源文件&#xff0c…

后期制作?推荐几款Final Cut Pro 必备插件给你们~

在我们用 Final Cut Pro 做视频后期制作时&#xff0c;如果想做出好的效果&#xff0c;我们总是离不开那些功能强大的插件&#xff0c;它们不仅能大大的提高我们工作效率&#xff0c;还能使整个视频更加精美&#xff0c;所以今天废鱼就推荐几款比好用的插件给大家。 Final Cut…

VSCode常用快捷键(Mac版)

1. 代码格式自动整理 Shift Option F 2. 查找与替换 单文件查找&#xff1a; Cmd F 所有文件查找&#xff1a; Cmd Shift F 同时选中多个相同单词&#xff1a; Cmd D 3. 复制粘贴 快速复制粘贴一行 Shift Option ↑ / ↓ 4. 光标定位 定位到行首尾&#xff1a; Fn …

【转】23个常用的VSCode快捷键(动图演示)

尽管我们经常使用 VS Code中的许多快捷方式&#xff0c;但是我们有可能会忘记它们。 这里用可视化制作了一些GIF&#xff0c;以便更好地记住它们&#xff0c;希望对你有所帮助。 VSCode中的每个命令也可以通过使用CTRL SHIFT P和搜索查询的命令提示符来执行。 但是知道直接快…

Final Cut Pro中文新手教程 (52绿幕抠图)FCPX透明通道基础使用方法

今天小编为大家分享的是FCPX透明通道基础教程&#xff0c;究竟什么是透明通道呢&#xff1f;透明通道就是一个阿尔法(alpha)通道&#xff0c;也叫做通明阿尔法通道。只要带有alpha的图片或者视频&#xff0c;他们的背景就是透明的只会显示他们的形状和内容。这种技术经常应用在…

fcpx如何清除缓存?Final Cut Pro X 清除缓存方法

当我们制作完视频时候&#xff0c;会发现源文件相当大&#xff0c;连128的Mac Pro 也根本无法吃消&#xff0c;必须给它来个瘦身&#xff01;给大家带来Final Cut Pro X 清除缓存的方法。 打开fcpx&#xff0c;选择资源库&#xff0c;右键在访达中显示 选择源文件&#xff0c;右…

Final Cut pro快捷键大全

Fianl Cut Pro 快捷键大全 系统 ⌘, -------------------偏好设置⌥⌘K ---------------自定义…⌘H ------------------隐藏Final Cut Pro⌥⌘H ---------------隐藏其他⌘Q ------------------退出Final Cut Pro⌥⌘Q ---------------退出并保留窗口 文件 ⌘N -----------…

Final Cut Pro X 快捷键

文章目录 一、片段编辑二、导出/导入媒体三、选取/选择片段四、修剪&#xff08;一&#xff09;修剪模式的三种修剪效果 五、其它编辑快捷键六、光标功能状态切换七、移动播放头八、播放九、插入媒体素材到时间线十、更改片段在时间线的外观十一、为片段添加/删除效果十二、为片…

10.1 ifconfig:配置或显示网络接口信息

ifconfig命令 用于配置网卡IP地址等网络参数或显示当前网络的接口状态&#xff0c;其类似于Windows下的ipconfig命令&#xff0c;这两个命令很容易混淆&#xff0c;读者需要区分一下。此外&#xff0c;ifconfig命令在配置网卡信息时必须以root用户的身份来执行。 如果系统中没有…

linux网卡eth0关闭,Linux CentOS关闭iptables及设置ifcfg-eth0文件

关闭CentOS默认防火墙 1.清空CentOS版本下iptables规则 iptables -F 2.保存CentOS版本下iptables规则 service iptables save 3.编辑/etc/selinux/config 文件&#xff0c;改SELINUXenforcing级别变为SELINUXdisabled级别(也就是关闭防火墙)&#xff0c;保存该文件。 如下图所示…

渗透测试 完全初学者指南 读书笔记 【七】流量捕获、缓存攻击

【七】流量捕获、缓存攻击 1.Wireshark的使用1.1 启动Wireshark&#xff0c;捕获流量1.2 登录靶机FTP服务1.3 捕获成功1.4 流量过滤1.4.1过滤器1.4.2过滤器,指定目标ip 1.5 查看TCP会话1.6 数据包解析 2. ARP 缓存攻击2.1 查看Kali系统中的ARP缓存记录2.2 IP传发2.3 ARP缓存攻击…

Linux文件系统构建

一、什么是文件系统 文件系统可以简单理解为两个部分&#xff0c;一个是文件&#xff0c;另一个是系统。文件系统是一个用来组织和管理文件的系统&#xff0c;有了文件系统之后&#xff0c;就可以轻松操作存储在存储介质上的文件&#xff0c;比如文件的增、删、查、改等基本操作…

关于虚拟机设置静态ip和克隆后重启网关报错的问题以及配置DNS

1.首先&#xff0c;用 ifconfig 命令查询是否存在eth0网卡 2.vi /etc/sysconfig/network-scripts/ifcfg-eth0 编辑ifcfg-eth0文件&#xff0c;如图&#xff1a; 加入如下配置 BOOTPROTOstatic IPADDR192.168.183.201 NETMASK255.255.255.0 GATEWAY192.168.183.1#网关 DNS1114…

linux上bridge vlan etho

Linux 接口bridge及vlan架构 一、组网结构图如下&#xff1a; 1、SW交换机和HUB 1)、交换机连接HUB的端口为trunk模式&#xff0c;trunk vlan100&#xff0c;交换机上的外网网段为10.10.100.0/24&#xff0c;vlan为100&#xff0c;分配iptables服务器的IP是10.10.100.100&#…

linux系统出现“Bring up interface etho”错误

linux系统启动网络服务出现以下两个错误的情况&#xff1a; 1、​Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization. 2、Bring up interface etho:Error :No suitable device found:no device found for connection ‘System…

虚拟机启动以后linux的etho网卡没有ip

查看windows的服务进程中&#xff0c;VM的DHCP服务是否启动&#xff0c;启动即可~ 转载于:https://www.cnblogs.com/leite/p/9332946.html

Linux网络配置ifcfg etho不生效

Linux网络配置ifcfg etho不生效 1.在RHEL4上&#xff0c;在ifcfg-eth0上配置IP地址等信息。详细配置如下 /etc/sysconfig/network-scripts/ifcfg-eth0 2.在shell上&#xff0c;ifconfig查看eth0网卡信息&#xff0c;发现ip地址并没有生效 3.ping地址报错如下&#xff1a; …