《Spring实战》学习笔记-------使用Redis数据库


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值的条目
opsForSetSettOperations<K, V>操作具有set值的条目
opsFotZSetZSetOperations<K, V>操作具有ZSet值(排序的set)的条目
opsForHashHashOperations<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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值