当前位置: 首页 > 编程笔记 >

spring使用redis操作key-value的示例代码

林绪
2023-03-14
本文向大家介绍spring使用redis操作key-value的示例代码,包括了spring使用redis操作key-value的示例代码的使用技巧和注意事项,需要的朋友参考一下

连接到 Redis

Redis 连接工厂会生成到 Redis 数据库服务器的连接。Spring Data Redis 为四种 Redis 客户端实现提供了连接工厂:

  • JedisConnectionFactory
  • JredisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

具体选择哪一个取决于你。我建议你自行测试并建立基准,进而确定哪一种 Redis 客户端和连接工厂最适合你的需求。从 Spring Data Redis 的角度来看,这些连接工厂在适用性上都是相同的。
在做出决策之后,我们就可以将连接工厂配置为 Spring 中的 bean。例如,如下展示了如何配置 JedisConnectionFactory bean

package cn.com.sm.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

@Configuration
public class RedisConfig {
  //通过默认构造器创建的连接工厂会向 localhost 上的 6379 端口创建连接,并且没有密码。
  @Bean
  public RedisConnectionFactory redisCF() {
    return new JedisConnectionFactory();
  }

  //如果你所使用的 value 和 key 都是 String 类型,那么可以考虑使用 StringRedisTemplate 来代替 RedisTemplate:
  @Bean
  public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
    return new StringRedisTemplate(cf);
  }
}

假如你配置redis服务器需要用户认证、运行在其他的主机或端口上:

 @Bean
  public RedisConnectionFactory redisCF() {
    JedisConnectionFactory cf = new JedisConnectionFactory();
    cf.setHostName("redis-server");
    cf.setPort(7379);
    cf.setPassword("foobared");
    return cf;
  }

Spring Data Redis 以模板的形式提供了较高等级的数据访问方案。实际上,Spring Data Redis 提供了两个模板:

  • RedisTemplate
  • StringRedisTemplate

RedisTemplate 可以极大地简化 Redis 数据访问,能够让我们持久化各种类型的 key 和 value,并不局限于字节数组。在认识到 key 和 value 通常是 String 类型之后,StringRedisTemplate 扩展了 RedisTemplate,只关注 String 类型。

可以按照如下方式来构建StringRedisTemplate:

ApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
RedisConnectionFactory cf = (RedisConnectionFactory) ctx.getBean("redisCF"); 
RedisTemplate redis = new StringRedisTemplate(); 
redis.setConnectionFactory(cf);       

也可以按照如下方式构建RedisTemplate:

//我这里创建了一个Product的java对象
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);

尽管这并非必须的,但是如果你经常使用 RedisTemplate 或 StringRedisTemplate 的话,你可以考虑将其配置为 bean,然后注入到需要的地方。如下就是一个声明 RedisTemplate 的简单 @Bean 方法:

  @Bean
  public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
    return new StringRedisTemplate(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() 方法从列表中弹出一个元素:

Product first = redis.opsForList().leftPop("cart");
Product last = redis.opsForList().rightPop("cart");

除了从列表中获取值以外,这两个方法还有一个副作用就是从列表中移除所弹出的元素。如果你只是想获取值的话(甚至可能要在列表的中间获取),那么可以使用 range() 方法:

range() 方法不会从列表中移除任何元素,但是它会根据指定的 key 和索引范围,获取范围内的一个或多个值。前面的样例中,会获取 11 个元素,从索引为 2 的元素到索引为 12 的元素(不包含)。如果范围超出了列表的边界,那么只会返回索引在范围内的元素。如果该索引范围内没有元素的话,将会返回一个空的列表。

List<Product> products = redis.opsForList().range("cart", 2, 12);

在 Set 上执行操作

添加一个元素:

redis.opsForSet().add("cart", product);

绑定到某个 key 上

BoundListOperations<String, Product> cart = redis.boundListOps("cart"); 
Product popped = cart.rightPop(); 
Product product1 = null; 
cart.rightPush(product1); 
Product product2 = null; 
cart.rightPush(product2); 
Product product3 = null; 
cart.rightPush(product3);

我们只在一个地方使用了条目的 key,也就是调用 boundListOps() 的时候。对返回的 BoundListOperations 执行的所有操作都会应用到这个 key 上。

使用 key 和 value 的序列化器

当某个条目保存到 Redis key-value 存储的时候,key 和 value 都会使用 Redis 的序列化器(serializer)进行序列化。Spring Data Redis 提供了多个这样的序列化器,包括:

  • GenericToStringSerializer:使用 Spring 转换服务进行序列化;
  • JacksonJsonRedisSerializer:使用 Jackson 1,将对象序列化为 JSON;
  • Jackson2JsonRedisSerializer:使用 Jackson 2,将对象序列化为JSON;
  • JdkSerializationRedisSerializer:使用 Java 序列化;
  • OxmSerializer:使用 Spring O/X 映射的编排器和解排器 (marshaler 和 unmarshaler)实现序列化,用于 XML 序列化;
  • StringRedisSerializer:序列化 String 类型的 key 和 value。

这些序列化器都实现了 RedisSerializer 接口,如果其中没有符合需求的序列化器,那么你还可以自行创建。

例如,假设当使用 RedisTemplate 的时候,我们希望将 Product 类型的 value 序列化为 JSON,而 key 是 String 类型。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;
}

到此这篇关于spring使用redis操作key-value的示例代码的文章就介绍到这了,更多相关spring redis操作key-value 内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍php操作redis常见方法示例【key与value操作】,包括了php操作redis常见方法示例【key与value操作】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php操作redis常见方法。分享给大家供大家参考,具体如下: 关于key的操作: 1、获取所有key,不包括值; 2、获取一个或多个key的值,【不限制数据类型】; 3、设置指定key的生命周期; 4、获

  • 本文向大家介绍Java中使用Jedis操作Redis的示例代码,包括了Java中使用Jedis操作Redis的示例代码的使用技巧和注意事项,需要的朋友参考一下 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:jedis-2.1.0.jar 如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar,下载地址:commons-pool-1.5.4.ja

  • type key 返回 none 表示不存在key。string字符类型,list 链表类型 set 无序集合类型…

  • 本文向大家介绍在c#中使用servicestackredis操作redis的实例代码,包括了在c#中使用servicestackredis操作redis的实例代码的使用技巧和注意事项,需要的朋友参考一下 声明一个客户端对象: 一 .基本KEY/VALUE键值对操作: 1. 添加/获取: 2. 获取数据 3. 获取指定索引位置数据 4. 移除: 二.存储对象: 1.通常方式(底层使用json序列化

  • 本文向大家介绍spring boot+redis 监听过期Key的操作方法,包括了spring boot+redis 监听过期Key的操作方法的使用技巧和注意事项,需要的朋友参考一下 前言: 在订单业务中,有时候需要对订单设置有效期,有效期到了后如果还未支付,就需要修改订单状态。对于这种业务的实现,有多种不同的办法,比如: 1、使用querytz,每次生成一个订单,就创建一个定时任务,到期后执行业

  • 不是说好的示例代码吗?怎么是个类名. 没错的,就是一个类哦,而且是一个完整的testcase. 它涵盖了95%以上的常用操作. 它的地址是 DaoUpTest 如果您访问github有"难度", 那么,还有osc上的镜像 DaoUpTest 如何使用 看它的注释,非常非常详细,几乎是一行代码一行注释. 例如准备说明 // 请在src或maven的resources下面添加一个文件叫nutz-te