Spring Data Redis 单节点和集群配置和RedisTemplate用法

Spring Data Redis 单节点和集群配置和RedisTemplate用法

标签(空格分隔): Spring-Data


使用SpringData更加方便我们对关系型数据库和非关系型数据库更好的操作,封装了通用的代码,使得操作更加快捷简单。

一、Spring Data Redis的配置

引入相关jar包,注意依赖和冲突问题。
maven 引入pom.xml:
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!--spring-data-redis相关,会自动引入相关jar-->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.7.4.RELEASE</version>
    </dependency>

    <!--spring测试相关-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.2.8.RELEASE</version>
    </dependency>

    <!--redis相关-->
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>

手动添加jar包 相关jar下载地址

这里写图片描述

配置文件

可以使用引入外部文件的方式也可以通过在xml文件中配置的方式

单节点配置方式

properties文件

#JedisPoolConfig的参数
#最大连接数
redis.pool.maxTotal=30
#最大空闲时间
redis.pool.maxIdle=10
#每次最大连接数
redis.pool.numTestsPerEvictionRun=1024
#释放扫描的扫描间隔
redis.pool.timeBetweenEvictionRunsMillis=30000
#连接的最小空闲时间
redis.pool.minEvictableIdleTimeMillis=1800000
#连接控歘按时间多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放
redis.pool.softMinEvictableIdleTimeMillis=10000
#获得链接时的最大等待毫秒数,小于0:阻塞不确定时间,默认-1
redis.pool.maxWaitMillis=1500
#在获得链接的时候检查有效性,默认false
redis.pool.testOnBorrow=true
#在空闲时检查有效性,默认false
redis.pool.testWhileIdle=true
#连接耗尽时是否阻塞,false报异常,true阻塞超时,默认true
redis.pool.blockWhenExhausted=false

#JedisConnectionFactory的参数
#主机地址,默认:localhost
redis.hostName=192.168.200.128
#主机端口,默认:6379
redis.port=6379
#超时时间,默认:2000
redis.timeout=3000
#密码
#redis.password
#是否使用连接池,默认true
redis.usePool=true
#使用数据库的索引,0-15之间的数字,默认:0
redis.dbIndex=0
#是否使用数据类型的转换,默认:true
#redis.convertPipelineAndTxResults
#哨兵配置
#redis.sentinelConfig
#集群配置
#redis.clusterConfig

xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--引入配置文件-->
    <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="1"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>

    <!--配置 jedis pool-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="${redis.pool.maxTotal}"/>
        <!-- 最大空闲时间 -->
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <!-- 每次最大连接数 -->
        <property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}"/>
        <!-- 释放扫描的扫描间隔 -->
        <property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"/>
        <!-- 连接的最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"/>
        <!-- 连接控歘按时间多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放 -->
        <property name="softMinEvictableIdleTimeMillis" value="${redis.pool.softMinEvictableIdleTimeMillis}"/>
        <!-- 获得链接时的最大等待毫秒数,小于0:阻塞不确定时间,默认-1 -->
        <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
        <!-- 在获得链接的时候检查有效性,默认false -->
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
        <!-- 在空闲时检查有效性,默认false -->
        <property name="testWhileIdle" value="${redis.pool.testWhileIdle}"/>
        <!-- 连接耗尽时是否阻塞,false报异常,true阻塞超时 默认:true-->
        <property name="blockWhenExhausted" value="${redis.pool.blockWhenExhausted}"/>
    </bean>

    <!--spring data redis -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.hostName}"/>
        <property name="port" value="${redis.port}"/>
        <property name="timeout" value="${redis.timeout}"/>
        <property name="database" value="${redis.dbIndex}"/>
        <property name="usePool" value="${redis.usePool}"/>
        <!--可以通过构造注入或者Set注入两种方式-->
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>

    <!--redisTemplate-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>

</beans>

集群配置方式
properties文件

#JedisPoolConfig的参数
#最大连接数
redis.pool.maxTotal=30
#最大空闲时间
redis.pool.maxIdle=10
#每次最大连接数
redis.pool.numTestsPerEvictionRun=1024
#释放扫描的扫描间隔
redis.pool.timeBetweenEvictionRunsMillis=30000
#连接的最小空闲时间
redis.pool.minEvictableIdleTimeMillis=1800000
#连接控歘按时间多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放
redis.pool.softMinEvictableIdleTimeMillis=10000
#获得链接时的最大等待毫秒数,小于0:阻塞不确定时间,默认-1
redis.pool.maxWaitMillis=1500
#在获得链接的时候检查有效性,默认false
redis.pool.testOnBorrow=true
#在空闲时检查有效性,默认false
redis.pool.testWhileIdle=true
#连接耗尽时是否阻塞,false报异常,true阻塞超时,默认true
redis.pool.blockWhenExhausted=false
#RedisClusterConfiguration配置
redis.maxRedirects=5
#主机和端口号
redis.host1=192.168.200.128
redis.port1=7000
redis.host2=192.168.200.128
redis.port2=7001
redis.host3=192.168.200.128
redis.port3=7002
redis.host4=192.168.200.128
redis.port4=7003
redis.host5=192.168.200.128
redis.port5=7004
redis.host6=192.168.200.128
redis.port6=7005

xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--引入配置文件-->
    <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="1"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:redis-cluster.properties</value>
            </list>
        </property>
    </bean>

    <!--配置 jedis pool-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="${redis.pool.maxTotal}"/>
        <!-- 最大空闲时间 -->
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <!-- 每次最大连接数 -->
        <property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}"/>
        <!-- 释放扫描的扫描间隔 -->
        <property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"/>
        <!-- 连接的最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"/>
        <!-- 连接控歘按时间多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放 -->
        <property name="softMinEvictableIdleTimeMillis" value="${redis.pool.softMinEvictableIdleTimeMillis}"/>
        <!-- 获得链接时的最大等待毫秒数,小于0:阻塞不确定时间,默认-1 -->
        <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
        <!-- 在获得链接的时候检查有效性,默认false -->
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
        <!-- 在空闲时检查有效性,默认false -->
        <property name="testWhileIdle" value="${redis.pool.testWhileIdle}"/>
        <!-- 连接耗尽时是否阻塞,false报异常,true阻塞超时 默认:true-->
        <property name="blockWhenExhausted" value="${redis.pool.blockWhenExhausted}"/>
    </bean>


    <!--配置RedisClusterConfiguration-->
    <bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
        <property name="maxRedirects" value="${redis.maxRedirects}"></property>
        <property name="clusterNodes">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host1}"/>
                    <constructor-arg name="port" value="${redis.port1}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host2}"/>
                    <constructor-arg name="port" value="${redis.port2}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host3}"/>
                    <constructor-arg name="port" value="${redis.port3}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host4}"/>
                    <constructor-arg name="port" value="${redis.port4}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host5}"/>
                    <constructor-arg name="port" value="${redis.port5}"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="${redis.host6}"/>
                    <constructor-arg name="port" value="${redis.port6}"/>
                </bean>
            </set>
        </property>
    </bean>

    <!--配置JedisConnectionFactory-->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <constructor-arg name="clusterConfig" ref="redisClusterConfiguration"/>
    </bean>

    <!--redisTemplate-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>

</beans>

二、RedisTemplate的用法

  1. Operations

        opsForXXX和boundXXXOps的区别?
    XXX为Value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定的对象(key)的operator,在一个连接(事务)内只能操作这个对应的key。
        关于计数API(increment)中有个小问题需要注意,通过increment计数后,通过get方式获取计数值的时候可能会抛出EOF异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundValueOps(key).get(0,-1)获得计数值。
    
  2. ValueOperations和BoundValueOperations

    ValueOperations operations = redisTemplate.opsForValue();
            String key = "XXX";
            BoundValueOperations boundValueOperations = redisTemplate.boundValueOps(key);
    类:ValueOperations可以理解为:Map<Object,Object>
    方法:set(key,value)保存
          get(key)获取
    类:BoundValueOperations可以理解为,预先设置好了Key,可以对此key进行其他操作,如设置value,修改value,获得value等
    

    简单示例:

    ValueOperations operations = redisTemplate.opsForValue();
    String key = "name";
    //存入key-value
    operations.set("name","zhangsan");
    //根据key取出Value
    Object name = operations.get("name");
    System.out.println("name:"+name);
    //追加
    operations.append("name","is man");
    //获得并修改
    operations.getAndSet("name","zhangsan-1");
    Object name1 = operations.get("name");
    System.out.println("修改后:"+name1);
    
    String key = "name-1";
    BoundValueOperations boundValueOperations = redisTemplate.boundValueOps(key);
    //和ValueOperations类似
  3. ListOperations 和 BoundListOperations

     ListOperations listOperations = redisTemplate.opsForList();
        String key = "springData";
        BoundListOperations boundListOperations = redisTemplate.boundListOps(key);
    类:ListOperations可以理解为:List<Object>
    BoundListOperations可以理解为,预先设置好了Key,可以对此key进行其他操作,如设置value,修改value,获得value等
    

    简单示例:

    ListOperations listOperations = redisTemplate.opsForList();
    
    //push键值对
    listOperations.leftPush(key,"aaa");
    listOperations.leftPush(key,"bbb");
    
    listOperations.index(1,1000);
    
    //pop值
    Object leftPop = listOperations.leftPop(key);
    System.out.println(leftPop);
    listOperations.set(key,100,"测试数据");
    
    //ListOperations可以设置泛型
    ListOperations<String,Integer> listOperations1 = redisTemplate.opsForList();
    
    String key = "springData";
    BoundListOperations boundListOperations = redisTemplate.boundListOps(key);
    //和ListOperations类似
  4. SetOperations 和 BoundSetOperations

    SetOperations setOperations = redisTemplate.opsForSet();
        String key = "springData";
        BoundSetOperations boundSetOperations = redisTemplate.boundSetOps(key);
    类:SetOperations可以理解为:Set<Object>
    BoundSetOperations可以理解为,预先设置好了Key,可以对此key进行其他操作,如设置value,修改value,获得value等
    

    简单示例和解释:

    /**
     * Set集合,类似于
     *
     *  Map<Object, Set<Object>> map = new HashMap<Object, Set<Object>>();
     *  Set<Object> set = new HashSet<Object>();
     */
    @Test
    public void test04(){
        SetOperations setOperations = redisTemplate.opsForSet();
    
        /**
         * 添加,类似于
         *
         *  Map<Object, Set<Object>> map = new HashMap<Object, Set<Object>>();
         *  Set<Object> set = new HashSet<Object>();
         *  map.put(key,set);
         *  Set<Object> set = map.get(key);
         *  set.add(value);
         */
        setOperations.add("springData","redis");
        //获取
        Set springData = setOperations.members("springData");
    
        //获取两个key的value(Set)交集
        setOperations.intersect("springData","SpringData1");
    
        //获取两个key的value(Set)补集
        setOperations.difference("springData","SpringData1");
    
        //获取两个key的value(Set)并集
        setOperations.union("springData","SpringData1");
    
        String key = "springData";
        BoundSetOperations boundSetOperations = redisTemplate.boundSetOps(key);
        //和SetOperations操作类似
    }
  5. ZSetOperations 和 BoundZSetOperations

    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        String key = "springData";
        BoundZSetOperations boundZSetOperations = redisTemplate.boundZSetOps(key);
    类:SetOperations可以理解为:Set<Object>
            BoundSetOperations可以理解为,预先设置好了Key,可以对此key进行其他操作,如设置value,修改value,获得value等
    
  6. HashOperations 和 BoundHashOperations

        HashOperations hashOperations = redisTemplate.opsForHash();
        String key = "springData";
        BoundHashOperations boundHashOperations = redisTemplate.boundHashOps(key);

    说明:APi中的方法很多,大家可以自行测试。源码下载 【源码下载连接

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值