首先需要使用Redis连接工厂获取Redis连接。
接着使用Redis连接创建Redis模板。
最后Redis模板进行Redis操作。
根据Redis连接工厂创建Redis模板。
使用Redis模板进行Redis操作。
Spring提供了4个Redis连接工厂类,我们根据需要使用。
这4个类都继承了RedisConnectionFactory接口
下面我们以JedisConnectionFactory为例,其他的都是类似的。
将JedisConnectionFactory bean将给Spring管理。
@Bean
public RedisConnectionFactory redisCF() {
return new JedisConnectionFactory();
}
如果使用默认的构造器,那么Redis连接会建立在localhost的6379端口,并且没有密码。
如果Redis服务器部署在其主机上和其他端口上,那么我们可以进行配置。同样,如果需要客户端认证(密码),我们可以配置密码。
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("redis-server");
cf.setPort(7379);
cf.setPassword("abc");
return cf;
}
现在,我们可以根据Redis连接工厂创建Redis Template。
Spring提供了2个Redis Template模板:
RedisConnectionFactory cf = ...;
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
RedisConnectionFactory cf = ...;
StringRedisTemplate redis = new StringRedisTemplate(cf);
如果Redis模板经常使用,那么我们可以设置为Spring的bean。
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
return redis;
}
@Bean
public RedisConnectionFactory redisConnectionFactory(RedisConnectionFactory cf) {
return new RedisConnectionFactory(cf);
}
RedisTemplate的大多数操作都是如下子API提供的
以opsFor开头的方法是直接操作Redis,以bound开头的方法是绑定到某个key的key-value。
下面将会使用一些常用的操作
redisTemplate.opsForValue().set(key, value)
//demo
redisTemplate.opsForValue().set(product.getSku, product);
获取sku为"123456"的value
Value v = redisTemplate.opsForValue().get(key)
//demo
Product product = redisTemplate.opsForValue().get("123456");
如果没有key为"123456"的键值对,那么会返回null。
redisTemplate.opsForList().rightPush(key, value)
//demo
redisTemplate.opsForList().rightPush("cart", product);
在list的尾部放入value。如果没有这个key,那么会创建一个。
redisTemplate.opsForList().leftPush(key, value)
//demo
redisTemplate.opsForList().leftPush("cart", product);
Value v = redisTemplate.opsForList().leftPop(key)
Value v = redisTemplate.opsForList().rightPop(key)
//demo
Product first = redisTemplate.opsForList().leftPop("cart");
Product last = redisTemplate.opsForList().rightPop("cart");
List<Value> list = redisTemplate.opsForList().range(key, startIndex, endIndex)
//从startIndex到endIndex,这两个索引都包含
//demo
List<Product> list = redisTemplate.opsForList()/range("cart", 2, 12);
//获取索引从2到12的11个元素
对于Set,我们不能像list一样根据索引获取元素,Set是无序的。
redisTemplate.opsForSet().add(key, value)
//demo
redisTemplate.opsForSet().add("cart", product);
redisTemplate.opsForSet().different(key1, key2)
redisTemplate.opsForSet().union(key1, key2)
redisTemplate.opsForSet().isect(key1, key2)
//demo
redisTemplate.opsForSet().different("cart1", "cart2")
redisTemplate.opsForSet().union("cart1", "cart2")
redisTemplate.opsForSet().isect("cart1", "cart2")
Value v = redisTemplate.opsForSet().randomMember(key)
//demo
Product product = redisTemplate.opsForSet().randomMember("cart");
如果某个key的value经常使用,那么我们可以用一个变量绑定某个key的value,然后对这个变量的操作就是对value的操作。
下面以List为例
BoundListOperations<String, Product> cart = redisTemplate.boundListOps("cart");
Product product = cart.rightPop();
cart.rightPush(product1);
cart.rightPush(product2);
cart.rightPush(product3);
当把数据保存到Redis key-value存储的时候,序列化器会对key和value进行序列化。Spring Data Redis提供了一下的序列化器:
这些序列化器都实现了RedisSerializer接口。
RedisTemplate使用JdkSerializationRedisSerializer;StringRedisTemplate默认使用StringRedisSerializer。
但是我们可以根据需要分别设置key和value的序列化器。例如:现在我们想设置key为String保存,value以JSON格式保存。我们可以使用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;
}