方案一:Spring Data Redis創建工程
創建工程,引入Redis 依賴:
創建成功後,還需要手動引入commos-pool2 的依賴,因此最終完整的pom.xml 依賴如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> </dependencies> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-pool2</artifactid> </dependency>
這裡主要是引入了Spring Data Redis 連接池。
設定Redis 訊息
接下來設定Redis 的訊息,訊息包含兩方面,一方面是Redis 的基本訊息,另一方面則是連結池訊息:
spring.redis.database=0 spring.redis.password=123 spring.redis.port=6379 spring.redis.host=192.168.66.128 spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-idle=10 spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-wait=1ms spring.redis.lettuce.shutdown-timeout=100ms
自動配置
當開發者在專案中引入了Spring Data Redis ,並且配置了Redis 的基本信息,此時,自動化配置就會生效。
我們從Spring Boot 中Redis 的自動化設定類別中就可以看出端倪:
@Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<object> redisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } }</object></object>
這個自動化設定類別很好理解:
首先標記這個是一個配置類,同時該配置在RedisOperations 存在的情況下才會生效(即專案中引入了Spring Data Redis)
然後導入在application.properties 中配置的屬性
然後再導入連接池資訊(如果存在的話)
最後,提供了兩個Bean ,RedisTemplate 和StringRedisTemplate ,其中StringRedisTemplate 是RedisTemplate 的子類,兩個的方法基本上一致,不同之處主要體現在操作的資料類型不同,RedisTemplate 中的兩個泛型都是Object ,意味者儲存的key 和value 都可以是一個對象,而StringRedisTemplate 的兩個泛型都是String ,意義者StringRedisTemplate 的key 和value 都只能是字串。只有在開發者沒有提供相關的 Bean 時,這兩個配置才會生效。如果有提供相關的 Bean,則不會生效。
使用
接下來,可以直接在Service 中註入StringRedisTemplate 或RedisTemplate 來使用:
@Service public class HelloService { @Autowired RedisTemplate redisTemplate; public void hello() { ValueOperations ops = redisTemplate.opsForValue(); ops.set("k1", "v1"); Object k1 = ops.get("k1"); System.out.println(k1); } }
Redis 中的資料操作,大體上來說,可以分為兩種:
針對key 的操作,相關的方法就在RedisTemplate 中
針對具體資料類型的操作,相關的方法需要先取得對應的資料類型,取得對應資料類型的操作方法是opsForXXX
呼叫就可以將資料儲存到Redis 中去了,如下:
k1 前面的字元是由於使用了RedisTemplate 導致的,RedisTemplate 對key 進行序列化之後的結果。
RedisTemplate 中,key 預設的序列化方案是 JdkSerializationRedisSerializer 。
而在 StringRedisTemplate 中,key 預設的序列化方案是 StringRedisSerializer ,因此,如果使用 StringRedisTemplate ,預設 key 前面不會有前綴。
不過開發者也可以自行修改RedisTemplate 中的序列化方案,如下:
@Service public class HelloService { @Autowired RedisTemplate redisTemplate; public void hello() { redisTemplate.setKeySerializer(new StringRedisSerializer()); ValueOperations ops = redisTemplate.opsForValue(); ops.set("k1", "v1"); Object k1 = ops.get("k1"); System.out.println(k1); } }
當然也可以直接使用StringRedisTemplate:
@Service public class HelloService { @Autowired StringRedisTemplate stringRedisTemplate; public void hello2() { ValueOperations ops = stringRedisTemplate.opsForValue(); ops.set("k2", "v2"); Object k1 = ops.get("k2"); System.out.println(k1); } }
另外需要注意,Spring Boot 的自動化配置,只能配置單機的Redis ,如果是Redis 集群,則所有的東西都需要自己手動配置,關於如何操作Redis 集群,松哥以後再來和大家分享。
方案二:Spring Cache
透過Spring Cache 的形式來操作Redis,Spring Cache 統一了緩存江湖的門面,這種方案,松哥之前有過一篇專門的文章介紹,小夥伴可以移步這裡:Spring Boot中,Redis快取還能這麼用! 。
方案三:回歸原始時代
第三種方案,就是直接使用Jedis 或其他的客戶端工具來操作Redis ,這種方案在Spring Boot 中也是支援的,雖然操作麻煩,但是支援
以上是SpringBoot中如何操作Redis的詳細內容。更多資訊請關注PHP中文網其他相關文章!