Redis入门实战(7)-SpringDataRedis操作redis

Spring Data Redis是的Spring Data家族的一部分,可轻松配置并访问Redis。 本文主要介绍在SpringBoot中使用Spring Data Redis操作redis,使用到的软件版本:Java 1.8.0_191、Redis 5.0.8、Spring Data Redis 2.2.5。

1、Spring Data Redis功能介绍

a. 连接池自动管理,提供了一个高度封装的RedisTemplate类
b. 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
c. 提供了对key的bound便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须再次指定Key,即BoundKeyOperations:
BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations
d. 将事务操作封装,有容器控制。
e. 针对数据的序列化/反序列化,提供了多种可选择策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列,是目前最常用的序列化策略。
StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是new String(bytes, charset)和string.getBytes(charset)的直接封装,是最轻量级和高效的策略。
JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。(需要jackson-mapper-asl工具支持)
OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml格式。不过使用此策略,编程将会有些难度,而且效率最低,不建议使用。(需要spring-oxm模块的支持)

2、SpringBoot工程中引入Spring Data Redis依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3、Spring Data Redis配置(application.yml)

3.1、单点配置

spring:
  redis:
    password: 123456
    host: 10.49.196.10
    port: 6379

3.2、哨兵模式配置

spring:
  redis:
    sentinel:
      password: 123456
      master: mymaster
      nodes: 10.49.196.20:26379,10.49.196.21:26379,10.49.196.22:26379

3.3、集群模式配置

spring:
  redis:
    password: 123456
    cluster:
      nodes: 10.49.196.20:7000,10.49.196.20:7001,10.49.196.21:7000,10.49.196.21:7001,10.49.196.22:7000,10.49.196.22:7001

4、Spring Data Redis操作Redis

package com.inspur.demo.general.redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisClusterNode;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * RedisTemplate操作reids
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringDataRedisCase {
    @Autowired
    private RedisTemplate<String, String> template;

    /**
     * Key-Value操作
     */
    @Test
    public void value() {
        template.opsForValue().set("name", "赵云");
        System.out.println(template.opsForValue().get("name"));

        template.boundValueOps("age").set("10");
        template.boundValueOps("age").increment(5);
        System.out.println(template.boundValueOps("age").get());
    }

    /**
     * Set操作
     */
    @Test
    public void set() {
        template.opsForSet().add("setkey", "v1", "v2", "v3");
        System.out.println(template.opsForSet().members("setkey"));

        template.boundSetOps("setkey2").add("v1", "v2", "v3");
        System.out.println(template.boundSetOps("setkey2").members());
    }

    /**
     * ZSet操作
     */
    @Test
    public void zset() {
        template.opsForZSet().add("zsetkey", "v1" , 1);
        template.opsForZSet().add("zsetkey", "v2" , 2);
        template.opsForZSet().add("zsetkey", "v3" , 3);
        System.out.println(template.opsForZSet().range("zsetkey", 1, 3));

        template.boundZSetOps("zsetkey2").add("v1" , 1);
        template.boundZSetOps("zsetkey2").add("v2" , 2);
        template.boundZSetOps("zsetkey2").add("v3" , 3);
        System.out.println(template.boundZSetOps("zsetkey").range(1, 3));
    }

    /**
     * List操作
     */
    @Test
    public void list() {
        template.opsForList().leftPush("list", "v1");
        template.opsForList().leftPush("list", "v2");
        template.opsForList().leftPush("list", "v3");
        System.out.println(template.opsForList().range("list", 1, 3));

        template.boundListOps("list2").leftPush("v1");
        template.boundListOps("list2").leftPush("v2");
        template.boundListOps("list2").leftPush("v3");
        System.out.println(template.boundListOps("list2").range(0, 3));
    }

    /**
     * Hash操作
     */
    @Test
    public void hash() {
        template.opsForHash().put("hash", "k1", "v1");
        template.opsForHash().put("hash", "k2", "v2");
        template.opsForHash().put("hash", "k3", "v3");
        System.out.println(template.opsForHash().entries("hash"));

        template.boundHashOps("hash2").put( "k1", "v1");
        template.boundHashOps("hash2").put( "k2", "v2");
        template.boundHashOps("hash2").put( "k3", "v3");
        System.out.println(template.boundHashOps("hash2").entries());
    }

    /**
     * Key操作
     */
    @Test
    public void key() {
        //获取所有key
        Set<String> keys = template.keys("*");
        System.out.println(keys);

        //判断key是否存在
        System.out.println(template.hasKey("name"));

        //设置过期时间
        template.expire("name", 10, TimeUnit.MINUTES);
        //获取过期时间
        System.out.println(template.getExpire("name"));

        //删除key
        template.delete("age");
    }

    /**
     * 管道操作
     */
    @Test
    public void pipelined() {
        List<Object> results = template.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                StringRedisConnection stringRedisConn = (StringRedisConnection)redisConnection;
                for (int i = 0; i < 10; i++) {
                    stringRedisConn.set("key" + i, i + "");
                }
                return null;
            }
        });
        System.out.println(results);
    }

    /**
     * 集群管理操作,只有集群模式下才能操作
     */
    @Test
    public void cluster() {
        RedisClusterNode node = new RedisClusterNode("10.49.196.20", 7001);
        //获取主节点对应的从节点
        System.out.println(template.opsForCluster().getSlaves(node));

        //获取节点的key
        System.out.println(template.opsForCluster().keys(node, "*"));
    }
}
原文地址:https://www.cnblogs.com/wuyongyin/p/13275512.html