您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring Boot中的操作怎么使用Redis實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Spring Boot中的操作怎么使用Redis實(shí)現(xiàn)”吧!
maven依賴(lài)如下,需要說(shuō)明的是,spring-boot-starter-data-redis里默認(rèn)是使用lettuce作為redis客戶(hù)端的驅(qū)動(dòng),但是lettuce其實(shí)用的比較少,我們常用的還是jedis作為客戶(hù)端的驅(qū)動(dòng),所以這里排除掉lettuce,引入jedis:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
spring data redis中依賴(lài)的關(guān)系:
這個(gè)依賴(lài)關(guān)系想表達(dá)的是,Spring 是通過(guò) RedisConnection操作Redis的,RedisConnection 則對(duì)原生的 Jedis 行封裝。要獲取RedisConnection接口對(duì)象是通過(guò)RedisConnectionFactory 生成的 。
配置文件進(jìn)行配置:
# Redis 連接配置
# Redis 連接配置
# 單機(jī) Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 連接池配置
spring.redis.jedis.pool.max-idle=30
spring.redis.jedis.pool.max-total=50
spring.redis.jedis.pool.max-wait=2000ms
代碼進(jìn)行配置:
@Configuration public class RedisConfig { private RedisConnectionFactory connectionFactory = null; @Bean public RedisConnectionFactory initRedisConnectionFactory(){ if(connectionFactory!=null){ return connectionFactory; } JedisPoolConfig poolConfig =new JedisPoolConfig(); //最大空閑數(shù) poolConfig.setMaxIdle(30); //最大連接數(shù) poolConfig.setMaxTotal(50); //最大等待毫秒數(shù) poolConfig.setMaxWaitMillis(2000); //創(chuàng)建Jedis連接工廠 JedisConnectionFactory connectionFactory=new JedisConnectionFactory(poolConfig); //獲取單機(jī)的redis配置,如果是集群的話用集群配置類(lèi) RedisStandaloneConfiguration rscfg=connectionFactory.getStandaloneConfiguration(); connectionFactory.setHostName("127.0.0.1"); connectionFactory.setPort(6379); return connectionFactory; } }
這里要說(shuō)明的是如果是直接使用RedisConnection來(lái)操作redis就需要我們手動(dòng)去找RedisConnectionFactory拿RedisConnection,并且需要每次手動(dòng)關(guān)閉RedisConnection。所以Spring Data Redis里面提供了RedisTemplate來(lái)方便操作,其封裝自jedis,屏蔽了資源獲取和釋放的步驟。
使用RedisTemplate的時(shí)候要注意的核心是它的序列化器,RedisTemplate有多種序列化器,不同的序列化器在鍵值寫(xiě)入、讀出redis的過(guò)程中使用的序列化方式會(huì)不同,序列化出來(lái)的結(jié)果也會(huì)不同。比如處理字符就需要用字符串專(zhuān)用的序列化器、處理對(duì)象需要使用對(duì)象專(zhuān)用的序列化器。
目前有的序列化器如下:
StringRedisSerializer:
StringRedisSerializer 是 RedisTemplate 默認(rèn)使用的 Key 和 Value 的序列化器,它將字符串序列化為字節(jié)數(shù)組,使用 UTF-8 編碼。由于 Redis 中 Key 和 Value 都是字符串,因此默認(rèn)的 StringRedisSerializer 序列化器已經(jīng)可以滿足大部分情況的需要。
Jackson2JsonRedisSerializer:
Jackson2JsonRedisSerializer 是一個(gè)基于 Jackson 的 Redis Key 和 Value 的序列化器,它可以將對(duì)象序列化為 JSON 格式的字符串,并存儲(chǔ)到 Redis 中。使用 Jackson2JsonRedisSerializer 序列化器需要添加 Jackson 的依賴(lài),可以將對(duì)象轉(zhuǎn)換為 JSON 格式的字符串,也可以將 JSON 格式的字符串轉(zhuǎn)換為對(duì)象。
JdkSerializationRedisSerializer:
JdkSerializationRedisSerializer 是一種基于 Java 自帶的序列化方式的序列化器,它可以將對(duì)象序列化為字節(jié)數(shù)組進(jìn)行存儲(chǔ)。雖然 JdkSerializationRedisSerializer 簡(jiǎn)單易用,但是它的效率比較低,序列化后的字節(jié)數(shù)組也比較大,不適合存儲(chǔ)大量的數(shù)據(jù)。
GenericJackson2JsonRedisSerializer:
GenericJackson2JsonRedisSerializer 是一個(gè)支持泛型的 Jackson2JsonRedisSerializer,它可以序列化任意類(lèi)型的對(duì)象,并將對(duì)象序列化為 JSON 格式的字符串。它在序列化和反序列化時(shí)都需要指定目標(biāo)類(lèi)型。
OxmSerializer:
OxmSerializer 是一種基于 Spring 的 O/X 映射框架的序列化器,它支持將對(duì)象序列化為 XML 格式的字符串。雖然 OxmSerializer 靈活性較高,但是序列化和反序列化的性能比較低,不適合存儲(chǔ)大量的數(shù)據(jù)。
總之,在選擇序列化器時(shí)需要根據(jù)實(shí)際情況進(jìn)行選擇,根據(jù)數(shù)據(jù)類(lèi)型和性能要求選擇合適的序列化器。
使用的時(shí)候直接set進(jìn)去即可,set的時(shí)候給了很多生效粒度選擇,是對(duì)所有redis類(lèi)型的數(shù)據(jù)結(jié)構(gòu)都生效,還是對(duì)某一類(lèi)redis的數(shù)據(jù)結(jié)構(gòu)類(lèi)型生效:
比如我想使用String序列化器,在全局都生效:
@Bean public RedisTemplate<Object,Object> initRedisTemplate(){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setDefaultSerializer(new StringRedisSerializer()); return redisTemplate; }
以下是使用RedisTemplate操作redis基本數(shù)據(jù)類(lèi)型的代碼示例:
要注意的是@Bean定義RedisTemplate的時(shí)候泛型要和使用時(shí)的泛型對(duì)齊。
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class RedisService { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private StringRedisTemplate stringRedisTemplate; public void setString(String key, String value) { stringRedisTemplate.opsForValue().set(key, value); } public String getString(String key) { return stringRedisTemplate.opsForValue().get(key); } public void setHash(String key, String hashKey, Object value) { HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash(); hashOps.put(key, hashKey, value); } public Object getHash(String key, String hashKey) { HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash(); return hashOps.get(key, hashKey); } public void setList(String key, Object value) { ListOperations<String, Object> listOps = redisTemplate.opsForList(); listOps.rightPush(key, value); } public Object getList(String key, long index) { ListOperations<String, Object> listOps = redisTemplate.opsForList(); return listOps.index(key, index); } public void setSet(String key, Object value) { SetOperations<String, Object> setOps = redisTemplate.opsForSet(); setOps.add(key, value); } public Object getSet(String key) { SetOperations<String, Object> setOps = redisTemplate.opsForSet(); return setOps.members(key); } public void setZSet(String key, Object value, double score) { ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet(); zsetOps.add(key, value, score); } public Object getZSet(String key, long start, long end) { ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet(); return zsetOps.range(key, start, end); } }
以下是使用事務(wù)的代碼示例:
@Autowired private RedisTemplate<String, String> redisTemplate; public void transactionalOperation() { // 開(kāi)啟 Redis 事務(wù) redisTemplate.multi(); try { // 執(zhí)行多個(gè) Redis 命令 redisTemplate.opsForValue().set("key1", "value1"); redisTemplate.opsForValue().set("key2", "value2"); // 提交事務(wù) redisTemplate.exec(); } catch (Exception e) { // 回滾事務(wù) redisTemplate.discard(); } }
感謝各位的閱讀,以上就是“Spring Boot中的操作怎么使用Redis實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Spring Boot中的操作怎么使用Redis實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。