文章目录
- 连接Redis
- 使用RedisTemplate
- 操作简单值
- 操作List类型值
- 操作Set类型的值
- 绑定到某个key
- 使用key和value的序列化器
Spring Data Redis中包含了多个模板实现,用来完成Redis数据库的存储功能。
需要使用连接工厂来创建模板,Spring Data Redis提供了四个连接工厂:
- JedisConnectionFactory
- JRedisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory
连接Redis
决定好用哪个连接工厂之后,只需要将它配置成Bean就可以使用了:
@Bean
public RedisConnectionFactory redisCF(){
JedisConnectionFactory cf = new JedisConnectionFactory(); //其它的连接工厂配置方法相同
cf.setHostName("redis-server");//设置主机名,默认localhost
cf.setPort(6379);//设置端口,默认是6379
//cf.setPassword("password");如果需要客户端认证的话
return cf;
}
使用RedisTemplate
Spring Data Redis提供了两个模板进行数据访问操作:
- RedisTemplate
- StringRedisTemplate
RedisTemplate用法:
@Bean
public RedisTemplate<String, Product> redistemplate(RedisConnectionFactory cf){
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
return redis;
}
RedisTemplate使用了两个类型进行参数化,String代表key的类型,Product代表value的类型。
RedisTemplate是通过set的方式注入连接工厂。
如果key和value都是String类型,那么就可以用StringRedisTemplate模板:
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf){
return new StringRedisTemplate(cf);
}
RedisTemplate(StringRedisTemplate)的方法和子API接口:
方法 | 子API接口 | 描述 |
opsForValue() | ValueOperations<K, V> | 操作具有简单值的条目 |
opsForList() | ListOperations<K, V> | 操作具有list值的条目 |
opsForSet | SettOperations<K, V> | 操作具有set值的条目 |
opsFotZSet | ZSetOperations<K, V> | 操作具有ZSet值(排序的set)的条目 |
opsForHash | HashOperations<K, HK, HV> | 操作具有hash值的条目 |
boundValueOps(K) | BoundValueOperations<K, V> | 以绑定指定key的方式,操作具有简单值的条目 |
boundListOps(K) | BoundListOperations<K, V> | 以绑定指定key的方式,操作具有list值的条目 |
boundSetOps(K) | BoundSetOperations<K, V> | 以绑定指定key的方式,操作具有set值的条目 |
boundZSetOps(K) | BoundZSetOperations<K, V> | 以绑定指定key的方式,操作具有ZSet值的条目 |
boundHashOps(K) | BoundHashOperations<K, V> | 以绑定指定key的方式,操作具有hash值的条目 |
操作简单值
例如,通过RedisTemplate<String, Product> redis保存和获取Product,其中key是sku属性的值:
redis.opsForValue().set(Product.getSku(), product);//存Product
Product product = redis.opsForValue().get("12345");//取sku属性值为12345的产品
操作List类型值
使用opsForList()方法,例如向一个List类型的条目尾部添加一个值,rightPush和leftPush:
//已注入RedisTemplate<String, Product> redis
redis.opsForList().rightPush("cart", product);
//向key为cart的列表尾部添加一个Product,如果没有,将会创建一个。
redis.opsForList().leftPush("cart", product);
向key为cart的列表头部添加一个Product,如果没有,将会创建一个。
从列表中取元素可以用leftPop和rightPop:
Product product = redis.opsForList().rightPop("cart");
Product product = redis.opsForList().leftPop("cart");
//Pop会弹出元素,也就是从列表中移除了该元素
如果只需要取值而不移除,可以使用range(key, start, end):
List<Product> products = redis.opsForList().range("cart", 2, 12);
//索引为2的元素到索引为12的元素(不包括),共取11个元素;
//如果范围超出,只返回在范围内的元素;如果范围内没有元素,返回null
操作Set类型的值
添加操作,opsForSet().add:
//已注入RedisTemplate<String, Product> redis
redis.opsForSet().add("cart", product);
取差集、交集、并集:
//已注入RedisTemplate<String, Product> redis
List<Product> diff = redis.opsForSet().difference("cart1", "cart2");
List<Product> union = redis.opsForSet().union("cart1", "cart2");
List<Product> isect = redis.opsForSet().isect("cart1", "cart2");
redis.opsForSet().remove(product)//移除元素
Product random = redis.opsForSet().randomMember("cart");//随机获取cart中的一个元素
因为set没有索引和内部排序,所以无法精确定位某个元素。
绑定到某个key
例如,将Product对象保存到一个List上,且key为cart,并从list右侧弹出一个元素,添加三个元素,我们可以使用boundListOps()方法所返回的BoundListOperations:
//已注入RedisTemplate<String, Product> redis
BoundListOperations<String, Product> cart = redis.boundListOps("cart");//绑定key
Product popped = cart.rightPop();
cart.rightPush(Product1);
cart.rightPush(Product2);
cart.rightPush(Product3);
使用key和value的序列化器
(暂时不懂,抄书)
当某个条目保存到Redis key-value 存储的时候,key和value都会使用Redis的序列化器(serializer)进行序列化。Spring Data Redis提供了多个这样的序列化器,包括:
序列化器 | 作用 |
GenericToStringSerializer | 使用Spring转换服务进行序列化 |
JacksonJsonRedisSerializer | 使用Jackson1,将对象序列化为JSON |
Jackson2JsonRedisSerializer | 使用Jackson1,将对象序列化为JSON |
JdkSerializationRedisSerializer | 使用java序列化 |
OxmSerializer | 使用Spring O/X映射的编排器和解排器实现序列化,用于XML序列化 |
StringRedisSerializer | 序列化String类型的key和value |
这些序列化器都实现了RedisSerializer接口,如果其中没有符合需求的序列化器,那么还可以自行创建。
RedisTemplate会使用JdkSerializationRedisSerializer,这意味着key和value都会通过Java进行序列化。StringRedisTemplate默认会使用StringRedisSerializer,它实际上就是实现String与byte数组之间的相互转换。
可以设置使用不同的序列化器来序列化一个对象,通过setKeySerializer()和setValueSerializer()方法:
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf){
RedisTemoplate<String, Product> redis = new RedisTemoplate<String, Product>();
redis.setConnectionFactory(cf);
redis.setKeySerializer(new StringRedisSerializer());
redis.setValueSerializer(new Jackson2JsonRedisSerializer<Product>(Product.class));
return redis
}
这里因为Product的key为String类型,所以设置RedisTemplate序列化key使用StringRedisSerializer,而希望将value序列化为JSON,使用Jackson2JsonRedisSerializer。