zoukankan      html  css  js  c++  java
  • 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, "*"));
        }
    }
  • 相关阅读:
    configbody
    add log to ldap
    registerComponent announceExist
    ldap
    6485 commands
    Titled Motor Entry
    ldap pkg
    remove rpm pkg
    创建自定义验证控件,以验证多行文本框中内容长度为例
    ASP.NET利用CustomValidator的ClientValidationFunction与OnServerValidate来double check资料输入的正确性
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/13275512.html
Copyright © 2011-2022 走看看