RedisTemplate 使用 Redis 缓存
與使用注解方式不同,注解方式可以零配置,只需引入依賴并在啟動(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然后寫(xiě)個(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(有序集合)。
下面來(lái)對(duì)這5種數(shù)據(jù)結(jié)構(gòu)類型作簡(jiǎn)單的介紹:
| String | 可以是字符串、整數(shù)或者浮點(diǎn)數(shù) | 對(duì)整個(gè)字符串或者字符串的其中一部分執(zhí)行操作;對(duì)象和浮點(diǎn)數(shù)執(zhí)行自增(increment)或者自減(decrement) |
| List | 一個(gè)鏈表,鏈表上的每個(gè)節(jié)點(diǎn)都包含了一個(gè)字符串 | 從鏈表的兩端推入或者彈出元素;根據(jù)偏移量對(duì)鏈表進(jìn)行修剪(trim);讀取單個(gè)或者多個(gè)元素;根據(jù)值來(lái)查找或者移除元素 |
| Set | 包含字符串的無(wú)序收集器(unorderedcollection),并且被包含的每個(gè)字符串都是獨(dú)一無(wú)二的、各不相同 | 添加、獲取、移除單個(gè)元素;檢查一個(gè)元素是否存在于某個(gè)集合中;計(jì)算交集、并集、差集;從集合里賣弄隨機(jī)獲取元素 |
| Hash | 包含鍵值對(duì)的無(wú)序散列表 | 添加、獲取、移除單個(gè)鍵值對(duì);獲取所有鍵值對(duì) |
| Zset | 字符串成員(member)與浮點(diǎn)數(shù)分值(score)之間的有序映射,元素的排列順序由分值的大小決定 | 添加、獲取、刪除單個(gè)元素;根據(jù)分值范圍(range)或者成員來(lái)獲取元素 |
StringRedisTemplate 與 RedisTemplate
RedisTemplate 對(duì)五種數(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 只能對(duì) key=String,value=String 的鍵值對(duì)進(jìn)行操作,RedisTemplate 可以對(duì)任何類型的 key-value 鍵值對(duì)操作。
他們各自序列化的方式不同,但最終都是得到了一個(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)來(lái)
@Autowired RedisTemplate redisTemplate;@Autowired StringRedisTemplate stringRedisTemplate;由于項(xiàng)目中暫時(shí)僅用到了 StringRedisTemplate 與 RedisTemplate 的 Hash 結(jié)構(gòu),StringRedisTemplate 比較簡(jiǎn)單就不貼代碼了,下面僅對(duì)操作 Hash 進(jìn)行舉例。
關(guān)于 RedisTemplate 的詳細(xì)用法,有一篇文章已經(jīng)講的很細(xì)很好了,我覺(jué)得沒(méi)必要再去寫(xiě)了。傳送門(mén)
用 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)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的RedisTemplate 使用 Redis 缓存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 注解方式使用 Redis 缓存
- 下一篇: Redis高可用方案-哨兵模式-Spri