Spring整合Redis

Oracle:  存储数据,   使用SQL操作数据库

  Java 程序作为客户端, 发送sql, 操作数据库:  jdbc

Redis: key/value 内存式数据库,  存储数据,   redis: 存储热点数据

  Java程序作为客户端,  jedis

使用Spring-data-redis+jedis操作redis

  与Spring整合, spring-data-redis, 底层使用的jedis  注意:测试前必须得先开启redis服务器,如果配置主从复制需要全部开启,配置哨兵也需要全部开启 ****

1、导入依赖

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.7.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
</dependency>

2、添加redis的配置文件:redis.properties

#访问地址
redis.host=127.0.0.1
#访问端口
redis.port=6379
#注意,如果没有password,此处不设置值,但这一项要保留
redis.password=
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=300
#最小空闲数,数据库连接的最小空闲时间。
redis.minIdle=10
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=5000
#在borrow获取一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis.testOnBorrow=true

3、在spring配置文件中,配置redis:

applicationContext-redis.xml:

  ①如果添加了哨兵机制则需要配置,或开启几台配几台,可以不配置

<!--redis哨兵 -->
<bean id="redisSentinelConfiguration"
    class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
    <property name="master">
        <bean
            class="org.springframework.data.redis.connection.RedisNode">
            <property name="name" value="mymaster" />   --name的意思
        </bean>
    </property>
    <!-- 哨兵 -->
    <property name="sentinels">
        <set>
            <bean
                class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="127.0.0.1" />
                <constructor-arg name="port" value="10001" />
            </bean>
            <bean
                class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="127.0.0.1" />
                <constructor-arg name="port" value="10002" />
            </bean>
            <bean
                class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="127.0.0.1" />
                <constructor-arg name="port" value="10003" />
            </bean>
        </set>
    </property>
</bean>

name就是哨兵的名字

 配置几台哨兵就添加几个bean,ip、端口需要一致

  ②jedis连接对象

底层:JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration);

 ...jedisConnectionFactory.setPoolConfig(); ....sethostName...

<bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="${redis.host}"></property>
        <property name="port" value="${redis.port}"></property>
        <property name="password" value="${redis.password}" />
        <!-- 哨兵 -->
        <constructor-arg name="sentinelConfig"
            ref="redisSentinelConfiguration" />
    </bean>

    <bean id="jedisPoolConfig"
        class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxActive}" /><!-- 最大连接数 -->
        <property name="maxIdle" value="${redis.maxIdle}" /><!-- 最大闲置 -->
        <property name="minIdle" value="${redis.minIdle}" /><!-- 最小闲置 -->
        <property name="maxWaitMillis" value="${redis.maxWait}" /><!-- 
            最大等待 -->
        <property name="testOnBorrow" value="${redis.testOnBorrow}" /><!-- 
            可以获取 -->
    </bean>

  ③RedisTemplate的bean

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

    <!-- 序列化方式 建议key/hashKey采用StringRedisSerializer -->
    <property name="keySerializer">
        <bean
            class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="valueSerializer">
        <bean
            class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
    </property>
    <property name="hashKeySerializer">
        <bean
            class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="hashValueSerializer">
        <bean
            class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
    </property>
    <!-- 开启REIDS事务支持 -->
    <property name="enableTransactionSupport" value="false" />
</bean>

<!-- 对string操作的封装 -->
<!-- <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> 
        <constructor-arg ref="jedisConnectionFactory" /> 
        开启REIDS事务支持
        <property name="enableTransactionSupport" value="false" /> 
    </bean> -->

  配置RedisTemplate这个bean,类似Mybatis的SqlSession, 使用RedisTemplate操作redis, 封装好了操作redis的方法 ,  他有一个子类, StringRedisTemplate,开发中, 使用RedisTemplate

注意:一般只使用RedisTemplate,实体类习惯性实现序列化接口

public class House implements Serializable{
    private static final long serialVersionUID = -4392862698633582732L;

使用RedisTemplate来操作Redis

RedisTemplate / StringRedisTemplate中定义了对redis的5种数据结构的操作:

  •   opsForValue()  操作字符串
  •   opsForHash()  操作hash
  •   opsForList()   操作list
  •   opsForSet()  操作set
  •   opsForZSet() 操作ZSet

1、两者数据各自存,各自取,数据不互通。

RedisTemplate不能取StringRedisTemplate存入的数据。

StringRedisTemplate不能取RedisTemplate存入的数据

2、序列化策略不同。

RedisTemplate采用JDK的序列化策略

StringRedisTemplate采用String的序列化策略

如果你需要缓存的是字符串,那么你就使用StringRedisTemplate即可。

但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,

那么使用RedisTemplate是更好的选择

测试方法(5种数据类型的简单使用):

1、opsForValue : String

// 存入数据
redisTemplate.opsForValue().set("aaa", "111", 100, TimeUnit.SECONDS);
redisTemplate.opsForValue().set("bbb", "2222");
// 获取数据
String k1 = (String) redisTemplate.opsForValue().get("bbb");
System.out.println(k1);

2、opsForHash() : hash

// 一对key/value添加
 redisTemplate.opsForHash().put("h1", "name", "张三");
 redisTemplate.opsForHash().put("h1", "age", "21");
 redisTemplate.opsForHash().put("h1", "sex", "男"); 
//批量添加
 Map map = new HashMap(); 
 map.put("name", "李四");
 map.put("age", "21");
 map.put("sex", "男"); 
 redisTemplate.opsForHash().putAll("h2", map);
//取值
System.out.println(redisTemplate.opsForHash().get("h1", "name"));
//redisTemplate.opsForHash().hasKey("h1", "age");
Map reMap = redisTemplate.opsForHash().entries("h2");
System.out.println(reMap);

3、rightPushAll :list

redisTemplate.opsForList().rightPushAll("l1", "1","2","3","4","5","1");

4、opsForSet : set

redisTemplate.opsForSet().add("s1", "1","2","3","1","4");

5、opsForZSet : ZSet

//存数据
 Set<TypedTuple<String>> set = new HashSet<>(); set.add(new
 DefaultTypedTuple("张三", 80.0)); set.add(new DefaultTypedTuple("李四", 85.0));
 set.add(new DefaultTypedTuple("王五", 68.0)); set.add(new
 DefaultTypedTuple("赵六", 90.0));
 redisTemplate.opsForZSet().add("zset", set);
 //取数据
 Set<String>  values = redisTemplate.opsForZSet().reverseRange("zset", 0, -1);
 System.out.println(values);
原文地址:https://www.cnblogs.com/64Byte/p/13215682.html