spring使用redis操作key-value的示例代码
连接到Redis
Redis连接工厂会生成到Redis数据库服务器的连接。SpringDataRedis为四种Redis客户端实现提供了连接工厂:
- JedisConnectionFactory
- JredisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory
具体选择哪一个取决于你。我建议你自行测试并建立基准,进而确定哪一种Redis客户端和连接工厂最适合你的需求。从SpringDataRedis的角度来看,这些连接工厂在适用性上都是相同的。
在做出决策之后,我们就可以将连接工厂配置为Spring中的bean。例如,如下展示了如何配置JedisConnectionFactorybean:
packagecn.com.sm.config; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.data.redis.connection.RedisConnectionFactory; importorg.springframework.data.redis.connection.jedis.JedisConnectionFactory; importorg.springframework.data.redis.core.StringRedisTemplate; @Configuration publicclassRedisConfig{ //通过默认构造器创建的连接工厂会向localhost上的6379端口创建连接,并且没有密码。 @Bean publicRedisConnectionFactoryredisCF(){ returnnewJedisConnectionFactory(); } //如果你所使用的value和key都是String类型,那么可以考虑使用StringRedisTemplate来代替RedisTemplate: @Bean publicStringRedisTemplatestringRedisTemplate(RedisConnectionFactorycf){ returnnewStringRedisTemplate(cf); } }
假如你配置redis服务器需要用户认证、运行在其他的主机或端口上:
@Bean publicRedisConnectionFactoryredisCF(){ JedisConnectionFactorycf=newJedisConnectionFactory(); cf.setHostName("redis-server"); cf.setPort(7379); cf.setPassword("foobared"); returncf; }
SpringDataRedis以模板的形式提供了较高等级的数据访问方案。实际上,SpringDataRedis提供了两个模板:
- RedisTemplate
- StringRedisTemplate
RedisTemplate可以极大地简化Redis数据访问,能够让我们持久化各种类型的key和value,并不局限于字节数组。在认识到key和value通常是String类型之后,StringRedisTemplate扩展了RedisTemplate,只关注String类型。
可以按照如下方式来构建StringRedisTemplate:
ApplicationContextctx=newAnnotationConfigApplicationContext(RedisConfig.class); RedisConnectionFactorycf=(RedisConnectionFactory)ctx.getBean("redisCF"); RedisTemplateredis=newStringRedisTemplate(); redis.setConnectionFactory(cf);
也可以按照如下方式构建RedisTemplate:
//我这里创建了一个Product的java对象 RedisTemplateredis=newRedisTemplate (); redis.setConnectionFactory(cf);
尽管这并非必须的,但是如果你经常使用RedisTemplate或StringRedisTemplate的话,你可以考虑将其配置为bean,然后注入到需要的地方。如下就是一个声明RedisTemplate的简单@Bean方法:
@Bean publicStringRedisTemplatestringRedisTemplate(RedisConnectionFactorycf){ returnnewStringRedisTemplate(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()方法从列表中弹出一个元素:
Productfirst=redis.opsForList().leftPop("cart"); Productlast=redis.opsForList().rightPop("cart");
除了从列表中获取值以外,这两个方法还有一个副作用就是从列表中移除所弹出的元素。如果你只是想获取值的话(甚至可能要在列表的中间获取),那么可以使用range()方法:
range()方法不会从列表中移除任何元素,但是它会根据指定的key和索引范围,获取范围内的一个或多个值。前面的样例中,会获取11个元素,从索引为2的元素到索引为12的元素(不包含)。如果范围超出了列表的边界,那么只会返回索引在范围内的元素。如果该索引范围内没有元素的话,将会返回一个空的列表。
Listproducts=redis.opsForList().range("cart",2,12);
在Set上执行操作
添加一个元素:
redis.opsForSet().add("cart",product);
绑定到某个key上
BoundListOperationscart=redis.boundListOps("cart"); Productpopped=cart.rightPop(); Productproduct1=null; cart.rightPush(product1); Productproduct2=null; cart.rightPush(product2); Productproduct3=null; cart.rightPush(product3);
我们只在一个地方使用了条目的key,也就是调用boundListOps()的时候。对返回的BoundListOperations执行的所有操作都会应用到这个key上。
使用key和value的序列化器
当某个条目保存到Rediskey-value存储的时候,key和value都会使用Redis的序列化器(serializer)进行序列化。SpringDataRedis提供了多个这样的序列化器,包括:
- GenericToStringSerializer:使用Spring转换服务进行序列化;
- JacksonJsonRedisSerializer:使用Jackson1,将对象序列化为JSON;
- Jackson2JsonRedisSerializer:使用Jackson2,将对象序列化为JSON;
- JdkSerializationRedisSerializer:使用Java序列化;
- OxmSerializer:使用SpringO/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;
- StringRedisSerializer:序列化String类型的key和value。
这些序列化器都实现了RedisSerializer接口,如果其中没有符合需求的序列化器,那么你还可以自行创建。
例如,假设当使用RedisTemplate的时候,我们希望将Product类型的value序列化为JSON,而key是String类型。RedisTemplate的setKeySerializer()和setValueSerializer()方法就需要如下所示:
@Bean publicRedisTemplateredisTemplate(RedisConnectionFactorycf){ RedisTemplate redis=newRedisTemplate (); redis.setConnectionFactory(cf); redis.setKeySerializer(newStringRedisSerializer()); redis.setValueSerializer(newJackson2JsonRedisSerializer (Product.class)); returnredis; }
到此这篇关于spring使用redis操作key-value的示例代码的文章就介绍到这了,更多相关springredis操作key-value内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。