記自己在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.pswp.cn/news/388445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388445.shtml
英文地址,請注明出處:http://en.pswp.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; 根據西安科技…