zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    迷宫与宝藏
    黑暗城堡
    Escaping the Farm
    Word Search
    描述
    防范sql注入值得注意地方
    fineui 实现下拉框模糊查询
    Fineui 根据datatable结构动态创建grid列,帮助类。动态绑定grid。
    Fineui 实现点击左边树状主菜单链接 打开新窗口或打开多个同一个tab
    fineui grid自定义选项框 带全选
  • 原文地址:https://www.cnblogs.com/64Byte/p/13215682.html
Copyright © 2011-2022 走看看