Spring整合Redis

2020-12-22 21:27

阅读:606

标签:word   redis   frame   text   hash   core   方式   选择   封装   

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

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

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

  Java程序作为客户端,  jedis

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

  与Spring整合, spring-data-redis, 底层使用的jedis 

1、导入依赖

dependency>
    groupId>org.springframework.datagroupId>
    artifactId>spring-data-redisartifactId>
    version>1.7.2.RELEASEversion>
dependency>
dependency>
    groupId>redis.clientsgroupId>
    artifactId>jedisartifactId>
    version>2.8.1version>
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:

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


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" />

    
    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>
    
    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> 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  values = redisTemplate.opsForZSet().reverseRange("zset", 0, -1);
 System.out.println(values);

 

Spring整合Redis

标签:word   redis   frame   text   hash   core   方式   选择   封装   

原文地址:https://www.cnblogs.com/64Byte/p/13215682.html


评论


亲,登录后才可以留言!