1. 程式人生 > 程式設計 >spring使用redis操作key-value的示例程式碼

spring使用redis操作key-value的示例程式碼

連線到 Redis

Redis 連線工廠會生成到 Redis 資料庫伺服器的連線。Spring Data Redis 為四種 Redis 客戶端實現提供了連線工廠:

  • 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 {
  //通過預設構造器建立的連線工廠會向 localhost 上的 6379 埠建立連線,並且沒有密碼。
  @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 以模板的形式提供了較高等級的資料訪問方案。實際上,Spring Data Redis 提供了兩個模板:

  • RedisTemplate
  • StringRedisTemplate

RedisTemplate 可以極大地簡化 Redis 資料訪問,能夠讓我們持久化各種型別的 key 和 value,並不侷限於位元組陣列。在認識到 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:

//我這裡建立了一個Product的java物件
RedisTemplate<String,Product> redis = new RedisTemplate<String,Product>();
redis.setConnectionFactory(cf);

儘管這並非必須的,但是如果你經常使用 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() 方法不會從列表中移除任何元素,但是它會根據指定的 key 和索引範圍,獲取範圍內的一個或多個值。前面的樣例中,會獲取 11 個元素,從索引為 2 的元素到索引為 12 的元素(不包含)。如果範圍超出了列表的邊界,那麼只會返回索引在範圍內的元素。如果該索引範圍內沒有元素的話,將會返回一個空的列表。

List<Product> products = redis.opsForList().range("cart",2,12);

在 Set 上執行操作

新增一個元素:

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 執行的所有操作都會應用到這個 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)實現序列化,用於 XML 序列化;
  • StringRedisSerializer:序列化 String 型別的 key 和 value。

這些序列化器都實現了 RedisSerializer 介面,如果其中沒有符合需求的序列化器,那麼你還可以自行建立。

例如,假設當使用 RedisTemplate 的時候,我們希望將 Product 型別的 value 序列化為 JSON,而 key 是 String 型別。RedisTemplate 的 setKeySerializer() 和 setValueSerializer() 方法就需要如下所示:

@Bean
public RedisTemplate<String,Product> redisTemplate(RedisConnectionFactory cf) {
 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 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!