spring使用redis操作key-value的示例代碼
連接到 Redis
Redis 連接工廠會生成到 Redis 數(shù)據(jù)庫服務器的連接。Spring Data Redis 為四種 Redis 客戶端實現(xiàn)提供了連接工廠:
- JedisConnectionFactory
- JredisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory
具體選擇哪一個取決于你。我建議你自行測試并建立基準,進而確定哪一種 Redis 客戶端和連接工廠最適合你的需求。從 Spring Data Redis 的角度來看,這些連接工廠在適用性上都是相同的。
在做出決策之后,我們就可以將連接工廠配置為 Spring 中的 bean。例如,如下展示了如何配置 JedisConnectionFactory bean:
package cn.com.sm.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration
public class RedisConfig {
//通過默認構造器創(chuàng)建的連接工廠會向 localhost 上的 6379 端口創(chuàng)建連接,并且沒有密碼。
@Bean
public RedisConnectionFactory redisCF() {
return new JedisConnectionFactory();
}
//如果你所使用的 value 和 key 都是 String 類型,那么可以考慮使用 StringRedisTemplate 來代替 RedisTemplate:
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
return new StringRedisTemplate(cf);
}
}
假如你配置redis服務器需要用戶認證、運行在其他的主機或端口上:
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("redis-server");
cf.setPort(7379);
cf.setPassword("foobared");
return cf;
}
Spring Data Redis 以模板的形式提供了較高等級的數(shù)據(jù)訪問方案。實際上,Spring Data Redis 提供了兩個模板:
- RedisTemplate
- StringRedisTemplate
RedisTemplate 可以極大地簡化 Redis 數(shù)據(jù)訪問,能夠讓我們持久化各種類型的 key 和 value,并不局限于字節(jié)數(shù)組。在認識到 key 和 value 通常是 String 類型之后,StringRedisTemplate 擴展了 RedisTemplate,只關注 String 類型。
可以按照如下方式來構建StringRedisTemplate:
ApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
RedisConnectionFactory cf = (RedisConnectionFactory) ctx.getBean("redisCF");
RedisTemplate redis = new StringRedisTemplate();
redis.setConnectionFactory(cf);
也可以按照如下方式構建RedisTemplate:
//我這里創(chuàng)建了一個Product的java對象 RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>(); redis.setConnectionFactory(cf);
盡管這并非必須的,但是如果你經(jīng)常使用 RedisTemplate 或 StringRedisTemplate 的話,你可以考慮將其配置為 bean,然后注入到需要的地方。如下就是一個聲明 RedisTemplate 的簡單 @Bean 方法:
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
return new StringRedisTemplate(cf);
}
有了 RedisTemplate(或 StringRedisTemplate)之后,我們就可以開始保存、獲取以及刪除 key-value 條目了。
使用簡單的值
//設置值
redis.opsForValue().set("key1","value1");
//獲取值
redis.opsForValue().get("key1");
使用 List 類型的值
例如,我們可以在一個 List 類型的條目尾部添加一個值:
redis.opsForList().rightPush("cart", product);
而 leftPush() 則會在列表的頭部添加一個值:
redis.opsForList().leftPush("cart", product);
可以通過 leftPop() 或 rightPop() 方法從列表中彈出一個元素:
Product first = redis.opsForList().leftPop("cart");
Product last = redis.opsForList().rightPop("cart");
除了從列表中獲取值以外,這兩個方法還有一個副作用就是從列表中移除所彈出的元素。如果你只是想獲取值的話(甚至可能要在列表的中間獲取),那么可以使用 range() 方法:
range() 方法不會從列表中移除任何元素,但是它會根據(jù)指定的 key 和索引范圍,獲取范圍內(nèi)的一個或多個值。前面的樣例中,會獲取 11 個元素,從索引為 2 的元素到索引為 12 的元素(不包含)。如果范圍超出了列表的邊界,那么只會返回索引在范圍內(nèi)的元素。如果該索引范圍內(nèi)沒有元素的話,將會返回一個空的列表。
List<Product> products = redis.opsForList().range("cart", 2, 12);
在 Set 上執(zhí)行操作
添加一個元素:
redis.opsForSet().add("cart", product);
綁定到某個 key 上
BoundListOperations<String, Product> cart = redis.boundListOps("cart");
Product popped = cart.rightPop();
Product product1 = null;
cart.rightPush(product1);
Product product2 = null;
cart.rightPush(product2);
Product product3 = null;
cart.rightPush(product3);
我們只在一個地方使用了條目的 key,也就是調用 boundListOps() 的時候。對返回的 BoundListOperations 執(zhí)行的所有操作都會應用到這個 key 上。
使用 key 和 value 的序列化器
當某個條目保存到 Redis key-value 存儲的時候,key 和 value 都會使用 Redis 的序列化器(serializer)進行序列化。Spring Data Redis 提供了多個這樣的序列化器,包括:
- GenericToStringSerializer:使用 Spring 轉換服務進行序列化;
- JacksonJsonRedisSerializer:使用 Jackson 1,將對象序列化為 JSON;
- Jackson2JsonRedisSerializer:使用 Jackson 2,將對象序列化為JSON;
- JdkSerializationRedisSerializer:使用 Java 序列化;
- OxmSerializer:使用 Spring O/X 映射的編排器和解排器 (marshaler 和 unmarshaler)實現(xiàn)序列化,用于 XML 序列化;
- StringRedisSerializer:序列化 String 類型的 key 和 value。
這些序列化器都實現(xiàn)了 RedisSerializer 接口,如果其中沒有符合需求的序列化器,那么你還可以自行創(chuàng)建。
例如,假設當使用 RedisTemplate 的時候,我們希望將 Product 類型的 value 序列化為 JSON,而 key 是 String 類型。RedisTemplate 的 setKeySerializer() 和 setValueSerializer() 方法就需要如下所示:
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
redis.setKeySerializer(new StringRedisSerializer());
redis.setValueSerializer(new Jackson2JsonRedisSerializer<Product>(Product.class));
return redis;
}
到此這篇關于spring使用redis操作key-value的示例代碼的文章就介紹到這了,更多相關spring redis操作key-value 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用jackson實現(xiàn)對象json之間的相互轉換(spring boot)
這篇文章主要介紹了使用jackson實現(xiàn)對象json之間的相互轉換(spring boot),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
springboot利用aspose預覽office文件的實現(xiàn)過程
這篇文章主要給大家介紹了關于springboot利用aspose預覽office文件的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,需要的朋友可以參考下2021-06-06
Spring Data JPA踩坑記錄(@id @GeneratedValue)
這篇文章主要介紹了Spring Data JPA踩坑記錄(@id @GeneratedValue),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot?MongoCustomConversions自定義轉換方式
這篇文章主要介紹了SpringBoot?MongoCustomConversions自定義轉換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Java編寫時間工具類ZTDateTimeUtil的示例代碼
這篇文章主要為大家詳細介紹了如何利用Java編寫時間工具類ZTDateTimeUtil,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學習一下2023-11-11

