记自己在spring中使用redis遇到的两个坑

 

本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅;

 

一、配置文件

 1 <!-- 加载Properties文件 -->
 2     <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 3         <property name="locations">
 4             <list>
 5                 <value>classpath*:config.properties</value>
 6             </list>
 7         </property>
 8         <property name="ignoreUnresolvablePlaceholders" value="true"/>
 9     </bean>
10 
11     <!-- 配置JedisPoolConfig实例 -->
12     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
13         <!--最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制-->
14         <property name="maxIdle" value="300" />
15         <!--连接池的最大数据库连接数。设为0表示无限制-->
16         <property name="maxTotal" value="600" />
17         <!--最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制-->
18         <property name="maxWaitMillis" value="1000" />
19         <!--在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的-->
20         <property name="testOnBorrow" value="true" />
21         <!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->
22         <property name="numTestsPerEvictionRun" value="3"/>
23         <!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->
24         <property name="minEvictableIdleTimeMillis" value="300000"/>
25         <!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->
26         <property name="timeBetweenEvictionRunsMillis" value="60000"/>
27         <!--在空闲时检查有效性, 默认false  -->
28         <property name="testWhileIdle" value="true" />
29     </bean>
30 
31     <!-- 配置JedisConnectionFactory,类似于数据库的连接池 -->
32     <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
33         <property name="hostName" value="${redis.host}"></property>
34         <property name="port" value="${redis.port}"></property>
35         <property name="password" value="${redis.password}"></property>
36         <property name="database" value="${redis.dbIndex}"></property>
37         <property name="poolConfig" ref="jedisPoolConfig"></property>
38         <property name="timeout" value="100000"></property>
39     </bean>
40 
41     <!-- 配置RedisTemplate -->
42     <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
43         <property name="connectionFactory" ref="jedisConnectionFactory"></property>
44         <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! -->
45         <property name="keySerializer" >
46             <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
47         </property>
48         <property name="valueSerializer" >
49             <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
50         </property>
51         <property name="hashKeySerializer">
52             <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
53         </property>
54         <property name="hashValueSerializer">
55             <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
56         </property>
57         <!--开启事务  -->
58         <property name="enableTransactionSupport" value="true"></property>
59     </bean>
View Code

  注:可以看到我redis的配置中,对于hash的key使用的是StringRedisSerializer序列化,而对于value使用的是GenericJackson2JsonRedisSerializer序列化。

 

二、坑一

// 源代码
HashOperations ho = redisTemplate.opsForHash();
Boolean flag = ho.hasKey(“key”, "key1");
if (flag) {// 处理逻辑
}

  上面这段代码,当redis中值不存在时,按照官方的说明文档,应该返回false。但是我使用的时候,hasKey方法时而返回的是null,时而返回的false,导致空指针异常。搞了半天我也没搞明白为啥返回false,最后没办法我妥协了(大神如果知道可以回复我)。

// 妥协后代码
HashOperations ho = redisTemplate.opsForHash();
Boolean flag = ho.hasKey(“key”, "key1");
if (flag != null && flag) {// 处理逻辑
}

 

三、坑二

    // 将Map放到redis的hash中public void putRedisHash1(){HashOperations ho = redisTemplate.opsForHash();Map<String, Boolean> tempMap = new HashMap<String, Boolean>(3){{put("isRegistered",false);put("isWeChat",false);put("isAliPay",false);}};ho.put("key", "key1", tempMap);}// 将Map放到redis的hash中public void putRedisHash2(){HashOperations ho = redisTemplate.opsForHash();Map<String, Boolean> tempMap = new HashMap<String, Boolean>(3);tempMap.put("isRegistered",false);tempMap.put("isWeChat",false);tempMap.put("isAliPay",false);ho.put("key", "key1", tempMap);}

  这两个方法的功能是一样的,但是第一个方法是在Map初始化同时将值放入其中,第二个方法是Map初始化以后将值放入其中,执行结果是一样,但是在redis中的存储形式完全不同。由于Hash的value使用的是GenericJackson2JsonRedisSerializer序列化,所以为了反序列化方便,它会存储

@class“”这个字段,由于Map初始化时机不同,导致相同内容在redis中@class内容不一致,为了使用方便,推荐第二种,即在Map初始化以后将值放入其中。

 

转载于:https://www.cnblogs.com/DDgougou/p/9685712.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure实践之如何批量为资源组虚拟机创建alert

通过上一篇的简介&#xff0c;相信各位对于简单的创建alert&#xff0c;以及Azure monitor使用以及大概有个印象了。基础的使用总是非常简单的&#xff0c;这里再分享一个常用的alert使用方法实际工作中&#xff0c;不管是日常运维还是做项目&#xff0c;我们都需要知道VM的实际…

南信大滨江学院计算机基础,南京信息工程大学滨江学院计算机基础期末复习知识点...

《计算机基础》期末考试复习知识点第一章计算机基础知识1.第一台电子计算机的名称、诞生时间及运算性能&#xff1b;名称&#xff1a;电子数字积分计算机ENIAC(埃尼阿克)。诞生时间&#xff1a;1946年2月14日。运算性能&#xff1a;运算速度为每秒5000次加法。2.计算机发展四个…

nginx集群

今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点。 略看了一下&#xff0c;感觉太复杂&#xff0c;要配置的东西太多&#xff0c;因此在这里写出一种更简洁的方法。 要集群tomcat主要是解决SESSION共享的问题&#xff0c;因此我利用memc…

管道过滤模式 大数据_大数据管道配方

管道过滤模式 大数据介绍 (Introduction) If you are starting with Big Data it is common to feel overwhelmed by the large number of tools, frameworks and options to choose from. In this article, I will try to summarize the ingredients and the basic recipe to …

DevOps时代,企业数字化转型需要强大的工具链

伴随时代的飞速进步&#xff0c;中国的人口红利带来了互联网业务的快速发展&#xff0c;巨大的流量也带动了技术的不断革新&#xff0c;研发的模式也在不断变化。传统企业纷纷效仿互联网的做法&#xff0c;结合DevOps进行数字化的转型。通常提到DevOps&#xff0c;大家浮现在脑…

2018.09.21 atcoder An Invisible Hand(贪心)

传送门 简单贪心啊。 这题显然跟t并没有关系&#xff0c;取差量最大的几组买入卖出就行了。 于是我们统计一下有几组差量是最大的就行了。 代码&#xff1a; #include<bits/stdc.h> #define N 100005 using namespace std; inline int read(){int ans0;char chgetchar();…

嘉应学院专插本计算机专业考纲,2015年嘉应学院汉语言文学专插本写作大纲.pdf...

.2015 专插本基础写作辅导部分分为五个部分&#xff0c;共 42 道题目。 50 &#xfe6a;-60 &#xfe6a;﹙填空&#xff0c;选择&#xff0c;判断&#xff0c;名词解释&#xff0c;简答&#xff0c;鉴赏﹚&#xff0c; 40 &#xfe6a;﹙作文﹚。1、什么是文章写作。文章写作是…

绿色版本Tomcat

解压版Tomcat配置(本例Tomcat6)&#xff1a;一 配置Tomcat1 下载Tomcat Zip压缩包&#xff0c;解压。如果增加tomcat的用户名和密码&#xff0c;则修改/conf/tomcat-user.xml<?xml version1.0 encodingutf-8?><tomcat-users><role rolename"manager"…

[ BZOJ 2160 ] 拉拉队排练

\(\\\) \(Description\) 一个由小写字母构成的长为\(N\)的字符串&#xff0c;求前\(K\)长的奇数长度回文子串长度之积&#xff0c;对\(19930726\)取模后的答案。 \(N\in [1,10^6]\)&#xff0c;\(K\in [1,10^{12}]\)\(\\\) \(Solution\) \(Manacher\)处理出所有位置的回文半径&…

用户体验可视化指南pdf_R中增强可视化的初学者指南

用户体验可视化指南pdfLearning to build complete visualizations in R is like any other data science skill, it’s a journey. RStudio’s ggplot2 is a useful package for telling data’s story, so if you are newer to ggplot2 and would love to develop your visua…

nodeJS 开发微信公众号

准备测试公众号 mp.weixin.qq.com/debug/cgi-b… 关注&#xff0c;获取测试公众号 内网渗透工具 natapp.cn/login 按照教程下载客户端进行配置 后台服务接入公众号 有netapp 生成的映射外网IP > URL 搭建express开发环境 这个网上有教程&#xff0c;自行百度 接口配置和签名…

单招计算机应用基础知识考试,四川邮电职业技术学院单招计算机应用基础考试大纲...

2021年高职单招升学一对一咨询小艺老师:18290437291(微信)四川邮电职业技术学院单招计算机应用基础考试大纲一、考试性质本技能考试是中等职业学校(含普通中专、职业高中、技工学校和成人中专)信息技术类专业毕业生参加四川邮电职业技术学院2016年单独招生考试。二、考试依据1.…

linux挂载磁盘阵列

linux挂载磁盘阵列 在许多项目中&#xff0c;都会把数据存放于磁盘阵列&#xff0c;以确保数据安全或者实现负载均衡。在初始安装数据库系统和数据恢复时&#xff0c;都需要先挂载磁盘阵列到系统中。本文记录一次在linux系统中挂载磁盘的操作步骤&#xff0c;以及注意事项。 此…

dedecms ---m站功能基础详解

织梦2015年6月8日更新后&#xff0c;就添加了很多针对手机移动端的设计&#xff0c;最大的设计就是添加了生成二维码的织梦标签和织梦手机模板功能&#xff0c;织梦更新后&#xff0c;默认的 default模板中就包含手机模板&#xff0c;所以我们可以给织梦网站设计双模板&#xf…

一个小菜鸟给未来的菜鸟们的一丢丢建议

写这篇文章的主要原因是有个建筑行业的朋友觉得搞建筑身累心累&#xff0c;想转到我们这个it行业来加入我们的编程大军中&#xff0c;找我咨询了一哈。在我了解了他的逻辑和理科这方面只是一般般的基础上&#xff0c;我给他的建议是&#xff1a;学习前端&#xff0c;而不是后端…

sql横着连接起来sql_SQL联接的简要介绍(到目前为止)

sql横着连接起来sqlSQL Join是什么意思&#xff1f; (What does a SQL Join mean?) A SQL join describes the process of merging rows in two different tables or files together.SQL连接描述了将两个不同表或文件中的行合并在一起的过程。 Rows of data are combined bas…

霸县计算机学校,廊坊中专排名2021

一、招生专业类别专业名称r制招生人政培养日标备注预备技师数控加工(中心操做工)340格养掌握先进敛p加ot知识&#xff0c;是部创新精神和较a空际操作能力&#xff0c;4了ftc71h0iwro感娶显型人于-宇缺毕让生培养具备电气白动化oirm和o技能&#xff0c;丛事电气设督安装、调试、…

《Python》进程收尾线程初识

一、数据共享 from multiprocessing import Manager 把所有实现了数据共享的比较便捷的类都重新又封装了一遍&#xff0c;并且在原有的multiprocessing基础上增加了新的机制list、dict 机制&#xff1a;支持的数据类型非常有限 list、dict都不是数据安全的&#xff0c;需要自己…

北京修复宕机故障之旅

2012-12-18日 下午开会探讨北京项目出现的一些问题&#xff0c;当时记录的问题是由可能因为有一定数量的客户上来后&#xff0c;就造成了Web服务器宕机&#xff0c;而且没有任何时间上的规律性&#xff0c;让我准备出差到北京&#xff0c;限定三天时间&#xff0c;以及准备测试…

计算机学院李世杰,有关办理2016级转专业学生相关手续通知

《有关办理2016级转专业学生相关手续通知》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《有关办理2016级转专业学生相关手续通知(4页珍藏版)》请在技术文库上搜索。1、1 关于办理 2016 级转专业学生相关手续的通知 各学院(部)、各相关部门&#xff1a; 根据西安科技…