微信可以上網(wǎng)長沙正規(guī)競價優(yōu)化服務(wù)
一、介紹
1、簡介
RedisTemplate 是 Spring Data Redis 提供的一個高級抽象,由 Spring 官方提供的方便操作 Redis 數(shù)據(jù)庫的一個工具類,支持模板設(shè)計模式,使得操作 Redis 更加符合 Spring 的編程模型。還支持序列化機(jī)制,可以處理 Java 對象的存取。其本質(zhì)屬于?Spring-Data?模塊下的?Spring-Data-Redis?部分,它提供了從 Spring 應(yīng)用程序輕松配置和訪問 Redis的功能。
2、原理
Spring-Data-Redis?是通過整合Lettuce和Jedis這倆種Redis客戶端產(chǎn)生的,對外則提供了RedisTemplate這樣統(tǒng)一的API來供調(diào)用者訪問。它既支持Luttuce的響應(yīng)式編程也支持JDK中集合的實(shí)現(xiàn)。
3、和Jedis的區(qū)別
Jedis 是一個用于直接與 Redis 服務(wù)器通信的 Java 客戶端庫,它提供了 Redis 所有基本功能的直接 API,需要手動管理連接(如創(chuàng)建 Jedis
實(shí)例和處理連接關(guān)閉等),并且需要在項(xiàng)目中引入 Jedis 的相關(guān) Maven 依賴,Jedis 適合需要精細(xì)控制 Redis 操作的場景,直接提供 Redis 命令的操作方式;
RedisTemplate 更加適合與 Spring 框架集成的應(yīng)用,提供了更高層次的抽象和便利的方法來簡化 Redis 操作。
具體選用客戶端還是模板,根據(jù)項(xiàng)目實(shí)際需要即可。
二、使用
1、引入依賴
<!--Redis依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--連接池依賴--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version></dependency>
2、配置連接
由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置連接池的時候需要進(jìn)行選擇是使用Lettuce還是Jedis(默認(rèn)是Lettuce)
#Redis cache setting
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password=
#最大連接數(shù)
spring.data.redis.lettuce.pool.max-active=8
#等待時長
spring.data.redis.lettuce.pool.max-wait=-1
#最大空閑連接
spring.data.redis.lettuce.pool.max-idle=8
#最小空閑連接
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.enabled=true
spring.data.redis.lettuce.pool.time-between-eviction-runs=30s
3、使用
通過依賴注入就可以直接使用
@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString(){String key = "name";//存String value = "這是value123";redisTemplate.opsForValue().set(key,value);//取Object valueObj = redisTemplate.opsForValue().get(key);System.out.println("value為:" + valueObj);}
執(zhí)行打印:value為:這是value123?
4、序列化
注意點(diǎn):上面存入的數(shù)據(jù)打開Redis圖形化工具查看發(fā)現(xiàn)是一堆亂碼
這是因?yàn)镽edis的序列化并沒有按照我們預(yù)期的進(jìn)行轉(zhuǎn)化,我們需要自己去重寫一個序列化,如下將key設(shè)置為String類型、value設(shè)置為json類型,最后將這個對象交給Spring管理,之后在調(diào)用該對象的時候就會自動選擇我們配置的這個:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {//創(chuàng)建RedisTemplate對象RedisTemplate<String, Object> template = new RedisTemplate<>();//設(shè)置連接工廠template.setConnectionFactory(connectionFactory);//創(chuàng)建JSON序列化工具GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();//設(shè)置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashValueSerializer(RedisSerializer.string());//設(shè)置value的序列化template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);return template;}
}
?對于JSON序列化工具也需要引入依賴:
<!--jackson依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.1</version></dependency>
此時存儲正常:
redis的序列化方式有:
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {@Resource private LettuceConnectionFactory factory;@Bean(name = "redisTemplateForRateLimit")public RedisTemplate<String, Object> redisTemplate() {Assert.notNull(factory, "can not initialise [RedisConnectionFactory]");Jackson2JsonRedisSerializer<Object> jacksonSerializer =new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = getObjectMapper();jacksonSerializer.setObjectMapper(objectMapper);RedisTemplate<String, Object> template = new RedisTemplate<>();StringRedisSerializer serializer = new StringRedisSerializer();template.setKeySerializer(serializer);template.setHashKeySerializer(serializer);template.setValueSerializer(jacksonSerializer);template.setHashValueSerializer(jacksonSerializer);template.setDefaultSerializer(jacksonSerializer);template.setConnectionFactory(factory);template.afterPropertiesSet();return template;}
}
?三、API
RedisTemplate 提供了豐富的方法來實(shí)現(xiàn)對 Redis 的各種操作,包括但不限于字符串、哈希、列表、集合和有序集合等數(shù)據(jù)結(jié)構(gòu)的操作。以下是一些常用的 RedisTemplate API:
1、字符串操作
opsForValue().set(key, value)
: 設(shè)置字符串值。opsForValue().get(key)
: 獲取字符串值。opsForValue().incr(key)
: 字符串值自增。opsForValue().decr(key)
: 字符串值自減。
2、哈希操作
opsForHash().getOperations().put(key, hashKey, value): 向哈希中添加鍵值對。
opsForHash().getOperations().get(key, hashKey): 獲取哈希中的值。
opsForHash().getOperations().entries(key): 獲取哈希中的所有鍵值對。
3、列表操作
opsForList().leftPush(key, value): 從列表左側(cè)添加元素。
opsForList().rightPush(key, value): 從列表右側(cè)添加元素。
opsForList().leftPop(key): 從列表左側(cè)彈出元素。
opsForList().rightPop(key): 從列表右側(cè)彈出元素。
4、集合操作
opsForSet().add(key, value)
: 向集合中添加元素。opsForSet().members(key)
: 獲取集合中的所有元素。opsForSet().remove(key, value)
: 從集合中移除元素。
5、有序集合操作
opsForZSet().add(key, value, score): 向有序集合中添加元素,并指定分?jǐn)?shù)。
opsForZSet().range(key, start, end): 獲取有序集合中指定分?jǐn)?shù)范圍內(nèi)的元素。
opsForZSet().removeRangeByScore(key, minScore, maxScore): 按分?jǐn)?shù)范圍移除有序集合中的元素。
6、鍵操作
delete(key)
: 刪除鍵。hasKey(key)
: 檢查鍵是否存在。keys(pattern)
: 根據(jù)模式匹配獲取所有鍵。
7、事務(wù)
multi()
: 開啟事務(wù)。exec()
: 提交事務(wù)。
8、發(fā)布/訂閱
convertAndSend(channel, message)
: 發(fā)布消息。subscribe(RedisMessageListenerContainer, MessageListener)
: 訂閱消息。
9、連接管理
getConnectionFactory()
: 獲取連接工廠。getExecutor()
: 獲取執(zhí)行器。
10、序列化
setKeySerializer(Serializer)
: 設(shè)置鍵的序列化器。setValueSerializer(Serializer)
: 設(shè)置值的序列化器。
更多操作可以查看官方提供的API文檔:RedisTemplate (Spring Data Redis 3.3.2 API)