文章目录

  • 连接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。