Java 中,通过 Redisson 客户端操作 redis


Java 中,通过 Redisson 客户端操作 redis

在 Spring boot 项目中引入了 Redis 和 Redisson之后,就可以通过 Redisson提供的客户端来操作 Redis数据了。

Redisson 是一个 Java 操作 Redis 的客户端:

  • 提供了大量的分布式数据集来简化对 Redis 的操作和使用可以让开发者像使用Java代码里的集合一样使用 Redis,
  • 完全感知不到 Redis 的存在(或者说使用过程中感知不到是在操作一个额外的东西)

有 Redis 操作基础的都了解,定义 ValueOperations valueOperations = redisTemplate.opsForValue();之后,可以通过setget方法来设置和获取 redis 的 key-value。

自定义RedisTemplate,配置类

@Configuration
public class RedisTemplateConfig {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        // 指定RedisTemplate泛型中,k-v 的数据结构 String-object
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 必须指定 redis 连接器,构造工厂
        redisTemplate.setConnectionFactory(connectionFactory);
        // 指定 key 的序列化器 RedisSerializer.string(),以utf8的字符编码格式
        redisTemplate.setKeySerializer(RedisSerializer.string());
        return redisTemplate;
    }
}

测试类

@SpringBootTest
public class RedisTest {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void test() {
        // 操作redis,增删改查
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("mingString", "dong", 10, TimeUnit.SECONDS);
        valueOperations.set("mingInt", 1);
        valueOperations.set("mingDouble", 2.1);

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        valueOperations.set("list1", list, 10, TimeUnit.SECONDS);

        User user = new User();
        user.setId(1L);
        user.setUserName("mingdongdong");
        valueOperations.set("mingUser", user);

        // 查
        String mingString = (String) valueOperations.get("mingString");
        int mingInt = (Integer)valueOperations.get("mingInt");
        Object mingDouble = valueOperations.get("mingDouble");
        System.out.println(valueOperations.get("mingUser"));
        System.out.println(mingString);
        System.out.println(mingInt);
        System.out.println(mingDouble);

    }
}

以上是 redis 操作数据的基本代码,那 Redisson呢?


1.Redisson 配置相关信息

@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissonConfig {
    /**
     * 定义redis连接地址
     */
    private String host;
    /**
     *定义redis连接端口号
     */
    private String port;

    @Bean
    public RedissonClient redissonClient() {
        // 1. 创建配置
        Config config = new Config();
        /**
         * String redissonAddress = "redis:127.0.0.1:6379";
         * 这里可以不写死,用在yml配置文件的配置,动态读取redis配置
         * @ConfigurationProperties(prefix = "spring.redis") prefix 添加读取的前缀
         */
        String redissonAddress = String.format("redis://%s:%s", host, port);
        config.useSingleServer()
                .setAddress(redissonAddress)
                // 分布式锁的存储可以和其他的缓存数据隔开,选择其他的库
                .setDatabase(1);
        // 2. 创建实例
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }
}

Redisson 测试类

@SpringBootTest
public class RedissonTest {
    @Resource
    private RedissonClient redissonClient;

    @Test
    void test() {
        // list jvm
        List<String> list = new ArrayList<>();
        list.add("ming");
        System.out.println(list.get(0));
        list.remove(0);

        // redis
        RList<String> rList = redissonClient.getList("test-list");
        rList.add("mmm");
        System.out.println(rList.get(0));
        // Duration 更灵活的时间控制,可以选择使用相对时间 比如单纯的设置 10 秒后过期
        rList.expire(Duration.ofMillis(10));
        // Instance 绝对时间,精确控制过期时间,可以选择使用绝对时间
//        rList.expire(Instant.ofEpochMilli(100));

//        rList.remove(0);

        // map
        Map<String, Integer> map = new HashMap<>();
        map.put("ming", 12);
        map.get("ming");

        RMap<Object, Object> rMap = redissonClient.getMap("test-map");
        rMap.put("ming", 12);

        // set
    }
}

根据代码可以看出,Redisson 往 Redis 中添加数据的方式确实可以像 Java中操作 List、Map、Set集合一样操作。

这和 Redis 直接操作数据的方式有些区别:

  1. Redis 可以在 set 的同时指定key的过期时间,而 Redisson 不是。

  2. Redisson 操作 Redis 数据是通过集合的方式,和 Redis 对比有些区别

  3. Redisson 给存储的数据设置过期的语法有不同

    • Redisson 是通过提供的 集合的 expire() 方法来设置过期时间
    • expire方法中又主要分为两大类,分别重载了不同的使用场景
    @Deprecated
    boolean expire(long timeToLive, TimeUnit timeUnit);
    
    @Deprecated
    boolean expireAt(long timestamp);
    
    @Deprecated
    boolean expireAt(Date timestamp);
    
    // 类似指定的是相对时间
    boolean expire(Duration duration);
    // 类似指定的是绝对时间,侧重点在于某个时间点
    boolean expire(Instant time)
    

    @Deprecated标记的方法是早期版本提供的,仍然可以用,只是在往后升级的版本中会更推荐expire(Duration duration)expire(Instant time)这两类。

总结一下:

介绍了Redisson如何往Redis中操作数据、给数据设置过期时间。

SpringBoot
JAVA-技能点
Redis