日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

RedisTemplate 使用 Redis 缓存

發(fā)布時(shí)間:2024/4/13 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RedisTemplate 使用 Redis 缓存 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

與使用注解方式不同,注解方式可以零配置,只需引入依賴并在啟動(dòng)類上加上 @EnableCaching 注解就可以使用;而使用 RedisTemplate 方式麻煩些,需要做一些配置。

Redis 配置

第一步還是引入依賴和在啟動(dòng)類上加上 @EnableCaching 注解。

然后在 application.yml 文件中配置 Redis

spring:redis:port: 6379database: 0host: 127.0.0.1password:jedis:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0timeout: 5000ms

然后寫個(gè) RedisConfig.java 配置類

import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import java.net.UnknownHostException;@Configuration public class RedisConfig {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(jackson2JsonRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}@Bean@ConditionalOnMissingBean(StringRedisTemplate.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;} }

Redis 的配置就完成了。

Redis 的數(shù)據(jù)結(jié)構(gòu)類型

Redis 可以存儲(chǔ)鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這5種數(shù)據(jù)結(jié)構(gòu)類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。

下面來對這5種數(shù)據(jù)結(jié)構(gòu)類型作簡單的介紹:

結(jié)構(gòu)類型結(jié)構(gòu)存儲(chǔ)的值結(jié)構(gòu)的讀寫能力
String可以是字符串、整數(shù)或者浮點(diǎn)數(shù)對整個(gè)字符串或者字符串的其中一部分執(zhí)行操作;對象和浮點(diǎn)數(shù)執(zhí)行自增(increment)或者自減(decrement)
List一個(gè)鏈表,鏈表上的每個(gè)節(jié)點(diǎn)都包含了一個(gè)字符串從鏈表的兩端推入或者彈出元素;根據(jù)偏移量對鏈表進(jìn)行修剪(trim);讀取單個(gè)或者多個(gè)元素;根據(jù)值來查找或者移除元素
Set包含字符串的無序收集器(unorderedcollection),并且被包含的每個(gè)字符串都是獨(dú)一無二的、各不相同添加、獲取、移除單個(gè)元素;檢查一個(gè)元素是否存在于某個(gè)集合中;計(jì)算交集、并集、差集;從集合里賣弄隨機(jī)獲取元素
Hash包含鍵值對的無序散列表添加、獲取、移除單個(gè)鍵值對;獲取所有鍵值對
Zset字符串成員(member)與浮點(diǎn)數(shù)分值(score)之間的有序映射,元素的排列順序由分值的大小決定添加、獲取、刪除單個(gè)元素;根據(jù)分值范圍(range)或者成員來獲取元素

StringRedisTemplate 與 RedisTemplate

RedisTemplate 對五種數(shù)據(jù)結(jié)構(gòu)分別定義了操作

  • redisTemplate.opsForValue();

    操作字符串

  • redisTemplate.opsForHash();

    操作hash

  • redisTemplate.opsForList();

    操作list

  • redisTemplate.opsForSet();

    操作set

  • redisTemplate.opsForZSet();

    操作有序set

如果操作字符串的話,建議用 StringRedisTemplate 。

StringRedisTemplate 與 RedisTemplate 的區(qū)別

  • StringRedisTemplate 繼承了 RedisTemplate。

  • RedisTemplate 是一個(gè)泛型類,而 StringRedisTemplate 則不是。

  • StringRedisTemplate 只能對 key=String,value=String 的鍵值對進(jìn)行操作,RedisTemplate 可以對任何類型的 key-value 鍵值對操作。

  • 他們各自序列化的方式不同,但最終都是得到了一個(gè)字節(jié)數(shù)組,殊途同歸,StringRedisTemplate 使用的是 StringRedisSerializer 類;RedisTemplate 使用的是 JdkSerializationRedisSerializer 類。反序列化,則是一個(gè)得到 String,一個(gè)得到 Object

  • 兩者的數(shù)據(jù)是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的數(shù)據(jù),RedisTemplate 只能管理 RedisTemplate中 的數(shù)據(jù)。

  • 項(xiàng)目中使用

    在需要使用 Redis 的地方,用 @Autowired 注入進(jìn)來

    @Autowired RedisTemplate redisTemplate;@Autowired StringRedisTemplate stringRedisTemplate;

    由于項(xiàng)目中暫時(shí)僅用到了 StringRedisTemplate 與 RedisTemplate 的 Hash 結(jié)構(gòu),StringRedisTemplate 比較簡單就不貼代碼了,下面僅對操作 Hash 進(jìn)行舉例。

    關(guān)于 RedisTemplate 的詳細(xì)用法,有一篇文章已經(jīng)講的很細(xì)很好了,我覺得沒必要再去寫了。傳送門

    用 RedisTemplate 操作 Hash

    package io.redis.demo;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@SpringBootTest @RunWith(SpringRunner.class) public class RedisTemplateTest {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test1(){redisTemplate.opsForValue().set("name","zhangsan");String name = (String)redisTemplate.opsForValue().get("name");System.out.println(name);}@Testpublic void test2(){stringRedisTemplate.opsForValue().set("name","zhangsan");String name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);}@Testpublic void test3(){redisTemplate.opsForHash().put("produce","1","電視機(jī)");redisTemplate.opsForHash().put("produce","2","冰箱");redisTemplate.opsForHash().put("produce","3","彩電");redisTemplate.opsForHash().put("produce","4","自行車");String name = (String) redisTemplate.opsForHash().get("produce", "4");System.out.println(name);}@Testpublic void test4(){redisTemplate.opsForList().leftPush("name","zhangfei");redisTemplate.opsForList().leftPush("name","liubei");redisTemplate.opsForList().leftPush("name","guanyu");List names = redisTemplate.opsForList().range("name", 0, -1);for (Object name : names) {System.out.println(name);}} }

    ?

    超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的RedisTemplate 使用 Redis 缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。