Springboot 2.0——集成redis

2021-01-08 Java爛豬皮

最近在入門SpringBoot,然後在感慨 SpringBoot較於Spring真的方便多時,順便記錄下自己在集成redis時的一些想法。

從springboot官網查看redis的依賴包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

操作redis

/* 操作k-v都是字符串的 */@AutowiredStringRedisTemplate stringRedisTemplet;/* 操作k-v都是對象的 */@AutowiredRedisTemplate redisTemplate;

redis的包中提供了兩個可以操作方法,根據不同類型的值相對應選擇。

兩個操作方法對應的redis操作都是相同的

stringRedisTemplet.opsForValue() // 字符串 stringRedisTemplet.opsForList() // 列表 stringRedisTemplet.opsForSet() // 集合 stringRedisTemplet.opsForHash() // 哈希 stringRedisTemplet.opsForZSet() // 有序集合

修改數據的存儲方式

在StringRedisTemplet中,默認都是存儲字符串的形式;在RedisTemplet中,值可以是某個對象,而redis默認把對象序列化後存儲在redis中(所以存放的對象默認情況下需要序列化)

如果需要更改數據的存儲方式,如採用json來存儲在redis中,而不是以序列化後的形式。

1)自己創建一個RedisTemplate實例,在該實例中自己定義json的序列化格式(org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer)

// 這裡傳入的是employee對象(employee 要求可以序列化)Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);

2)把定義的格式放進自己定義的RedisTemplate實例中

RedisTemplate<Object,Employee> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// 定義格式Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);// 放入RedisTemplate實例中template.setDefaultSerializer(jackson2JsonRedisSerializer);

參考代碼:

@Beanpublic RedisTemplate<Object,Employee> employeeRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException{ RedisTemplate<Object,Employee> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);template.setDefaultSerializer(jackson2JsonRedisSerializer);returntemplate; }

原理:

@Configuration@ConditionalOnClass({RedisOperations.class})@EnableConfigurationProperties({RedisProperties.class})@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})publicclassRedisAutoConfiguration{publicRedisAutoConfiguration(){ }@Bean@ConditionalOnMissingBean( name = {"redisTemplate"} ) // 在容器當前沒有redisTemplate時運行public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory);return template; }@Bean@ConditionalOnMissingBean// 在容器當前沒有stringRedisTemplate時運行public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory);return template; }}

如果你自己定義了RedisTemplate後並添加@Bean註解,(要在配置類中定義),那麼默認的RedisTemplate就不會被添加到容器中,運行的就是自己定義的ReidsTemplate實例,而你在實例中自己定義了序列化格式,所以就會以你採用的格式定義存放在redis中的對象。

更改默認的緩衝

springboot默認提供基於註解的緩衝,只要在主程序類(xxxApplication)標註@EnableCaching,緩衝註解有

@Cachingable、@CachingEvict、@CachingPut,並且該緩衝默認使用的是ConcurrentHashMapCacheManager

當引入redis的starter後,容器中保存的是RedisCacheManager ,RedisCacheManager創建RedisCache作為緩衝組件,RedisCache通過操縱redis緩衝數據

修改redis緩衝的序列化機制

在SpringBoot中,如果要修改序列化機制,可以直接建立一個配置類,在配置類中自定義CacheManager,在CacheManager中可以自定義序列化的規則,默認的序列化規則是採用jdk的序列化

註:在SpringBoot 1.5.6 和SpringBoot 2.0.5 的版本中自定義CacheManager存在差異

參考代碼:

// springboot 1.x的版本public RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory){// 1、自定義RedisTemplate RedisTemplate<Object,Employee> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);template.setDefaultSerializer(jackson2JsonRedisSerializer);// 2、自定義RedisCacheManager RedisCacheManager cacheManager = new RedisCacheManager(template); cacheManager.setUsePrefix(true); // 會將CacheName作為key的前綴return cacheManager;}// springboot 2.x的版本/** * serializeKeysWith() 修改key的序列化規則,這裡採用的是StringRedisSerializer() * serializeValuesWith() 修改value的序列化規則,這裡採用的是Jackson2JsonRedisSerializer<Employee>(Employee.class) * @param factory * @return */@Beanpublic RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory){RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<Employee>(Employee.class))); RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();return cacheManager; }

tip:可以通過查看各版本的org.springframework.data.redis.cache.RedisCacheConfiguration去自定義CacheManager.因為不同版本的SpringBoot對應的Redis版本也是不同的,所以要重寫時可以查看官方是怎麼定義CacheManager,才知道怎樣去自定義CacheManager。

國慶的由來

每年國慶,各國都要舉行不同形式的慶祝活動,以加強本國人民的愛國意識,增強國家的凝聚力。各國之間也都要相互表示祝賀。

相關焦點

  • Redis詳解:sets數據類型及操作
    2、srem  刪除名稱為key的set中的元素member:  redis 127.0.0.1:6379> sadd myset2 "one"  (integer) 1  redis 127.0.0.1:6379> sadd myset2 "two"  (
  • sa-token v1.8.0 已經發布,輕量級權限認證框架
    sa-token v1.8.0 已經發布,這是一個輕量級權限認證框架。
  • 架構秘笈:移花接木,使用MySQL模擬Redis
    大家都知道redis速度快,但它的容量和內存容量有關,很容易達到瓶頸。有些網際網路公司,直接使用redis作為後端資料庫(在下佩服)。當業務量暴增,就面臨一個redis容量和價格的權衡問題。改業務代碼是來不及了,只好用一些持久化存儲 ,來模擬redis的一些數據結構。redis支持近十種數據類型,最常用的有5種。string、hash、zset、set、list等。本文將針對幾種常見的數據結構,探討一下常用操作的模擬實現。
  • Redis是如何實現點讚、取消點讚的?
    一個牛逼的多級緩存實現方案基於redis分布式鎖實現「秒殺」(含代碼)百億數據量下,掌握這些Redis技巧你就能Hold全場9個提升逼格的redis命令get個新技能:redis實現自動補全利用 Redis 實現「附近的人」功能!私藏!我是如何用redis做實時訂閱推送的?
  • Redis RESP 協議與 AOF 持久化有什麼關係?
    AOF 文件裡存的是什麼我在本地的測試 redis 環境中隨便刷了幾條命令,然後打開 appendonly.aof 文件查看,發現裡面的內容像下面這樣子。一般情況下我們會使用 redis-cli或者一些客戶端工具連接 Redis 服務端。./redis-cli複製代碼然後整個交互過程的命令發送和返回結果像下面這樣,綠色部分為發送的命令,紅色部分為返回的結果。這就是我們再熟悉不過的部分了。
  • Redis 的 8 大數據類型,寫得非常好!(建議收藏)
    key3 # 剩餘過期時間(integer) 25127.0.0.1:6379> setnx mykey "redis" # mykey 不存在時設置成功(integer) 1127.0.0.1:6379> keys *1) "key2"2) "key1"3) "views"4) "mykey"127.0.0.1:6379> setnx mykey "mongoDB"
  • 新入職的妹子問我Redis是如何實現點讚、取消點讚的?
    說下Docker 安裝運行 Redisdockerrun-d-p6379:6379redis:4.0.8如果已經安裝了 Redis,打開命令行,輸入啟動 Redis 的命令redis-server1.2 Redis 與 SpringBoot 項目的整合1.在 pom.xml 中引入依賴2.在啟動類上添加注釋
  • hmtool-generator-online 1.6.0,基於 hmtool 代碼在線生成平臺發布
    在線代碼生成平臺基於interchan 1.6.0版第一版在線代碼生成平臺已發布、主要解決在使用hmtool 重複crud等相關等工作、可自行配置對應資料庫類型(暫時只支持mysql
  • 京東T8純手寫JavaEE開發的顛覆者SpringBoot完整版,學完太厲害了
    對於剛剛接觸springboot的小夥伴來說,這無疑是你最好的學習資料,對於哪些使用boot框架開發過一段時間的人來說,這一份文檔就相當於是你查漏補缺的工具,無論你開發多久,相信都能夠在這份文檔中學習到你想要的知識如果你想要這一份文檔!請你動動手指在文末留言+轉發關注後私信作者【學習】即可免費獲取到這份Spring Boot學習文檔!
  • 十大集成吊頂(暖通)品牌:今頂
    2017 年7月13日,「2017首屆中國家居品牌大會」在北京舉行,在50位行業頂級大咖、500位家居精英的共同見證下,發布「2016-2017十大集成吊頂其中今頂以在集成吊頂領域的突出表現榮膺「十大集成吊頂(暖通)品牌」。浙江今頂集成吊頂有限公司前身是成立於2006年的嘉興市今頂電器科技有限公司,是中國目前技術實力雄厚、生產規模超前的專業化集成吊頂生產企業,公司在集成吊頂產品的研發、設計、生產、營銷上始終處於行業領先地位,尤其是在復古集成吊頂方面更是獨領風騷。
  • 裝配式集成打包箱式房屋行業標準正式發布
    4.2 標記4.2.1 單個集成打包箱式房屋示意圖如圖3所示。6.4.3.2 荷載取值集成打包箱式房屋結構的荷載標準值應按下列規定取值:a)箱頂恆荷載標準值應取0.15kN/m,箱頂活荷載標準值應取0.5kN/m;b)箱頂應在最不利位置施加標準值為1kN的施工集中荷載;
  • 架構師技術文檔:Redis+Nginx+Spring全家桶+Dubbo精選
    一、Redis技術好文精選整理Redis哨兵、複製、集群的設計原理,以及區別Spring+Redis+Docker+Dubbo深入了解redis如何解決Redis緩存雪崩、緩存穿透、緩存並發等5大難題二、Nginx技術好文精選整理Nginx實戰Nginx教程從入門到精通三、Spring全家桶技術好文精選整理Spring
  • 新型裝飾材料——竹木纖維集成牆
    集成牆板是近幾年流行起來的一種新型裝修材料。由於它材料環保,施工簡單,顏色亮麗,保溫隔熱,防水防火,樣式新穎等特點深受消費者喜愛。它的學名叫竹木纖維集成牆板,我們習慣叫集成牆。下面讓我們逐步了解一下集成牆。
  • 集成牆面生產廠家
    這篇文章內容關鍵字:牆面裝修|生產廠|集成化在室內裝修的情況下,有很多的家裝材料,如今銷售市場上的家裝材料十分的多,但是最近幾年來集成牆板的室內裝修十分的火,集成牆板不但安裝便捷,非常容易維護保養,不容易形變,防火安全防水等益處,最都要的是集成牆板十分的環境保護,0室內甲醛,安裝好啦之後就可以搬入
  • 集成牆面裡面全是蟲子 集成牆面裝修的優缺點
    大家都知道什麼是集成牆面吧,是牆面裝修的一種方式,而且這種材質比較方便,而且造價也比較低。那麼集成牆面裡面全是蟲子是真的嗎,這種牆面的優勢是什麼呢。集成牆面裝修的優缺點是什麼,這些相關的內容在了解集成牆面這個問題上會有很好的參考作用,下面小編就來做具體的介紹。
  • Python簡化代碼機器學習庫PyCaret 2.0發布
    2.0發布英語原文:Announcing PyCaret 2.0翻譯:雷鋒字幕組(Shangru)我們激動的宣布,PyCaret第二版今天發布!2.0 功能安裝PyCaret 2.0安裝PyCaret非常簡單,只需要幾分鐘時間。
  • 山東竹木纖維集成牆板
    山東竹木纖維集成牆板近幾年,集成牆面十分火爆受到了廣大消費者的熱烈歡迎,集成牆面環保、防水防火、隔音的特性使得它適合安裝在任何空間中。」成牆面是零甲醛嗎?集成牆面作為室內裝修材料,經***檢測它的甲醛釋放量在0.2毫克每升,達到了E0級標準。