详解简单基于spring的redis配置(单机和集群模式)

需要的jar包:spring版本:4.3.6.RELEASE,jedis版本:2.9.0,spring-data-redis:1.8.0.RELEASE;如果使用jackson序列化的话还额外需要:jackson-annotations和jackson-databind包

spring集成redis单机版:

1.配置RedisTemplate

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

2.配置connectionFactory

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
      <!-- 配置ip -->
      <property name="hostName" value="${redis.host}"/>
      <!-- 配置port -->
      <property name="port" value="${redis.port}"/>
      <!-- 是否使用连接池-->
      <property name="usePool" value="${redis.usePool}"/>
      <!-- 配置redis连接池-->
      <property name="poolConfig" ref="poolConfig"/>
    </bean>

3.配置连接池

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
      <!--最大空闲实例数-->
      <property name="maxIdle" value="${redis.maxIdle}" />
      <!--最大活跃实例数-->
      <property name="maxTotal" value="${redis.maxTotal}" />
      <!--创建实例时最长等待时间-->
      <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
      <!--创建实例时是否验证-->
      <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>

spring集成redis集群

1.配置RedisTemplate步骤与单机版一致

2.配置connectionFactory

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
      <!-- 配置redis连接池-->
      <constructor-arg ref="poolConfig"></constructor-arg>
      <!-- 配置redis集群-->
     <constructor-arg ref="clusterConfig"></constructor-arg>
      <!-- 是否使用连接池-->
      <property name="usePool" value="${redis.usePool}"/>
    </bean>

3.配置连接池步骤与单机版一致

4.配置redis集群

    <bean id="clusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
      <property name="maxRedirects" value="3"></property>
      <property name="clusterNodes">
        <set>
          <bean class="org.springframework.data.redis.connection.RedisClusterNode">
            <constructor-arg value="${redis.host1}"></constructor-arg>
            <constructor-arg value="${redis.port1}"></constructor-arg>
          </bean>
          <bean class="org.springframework.data.redis.connection.RedisClusterNode">
            <constructor-arg value="${redis.host2}"></constructor-arg>
            <constructor-arg value="${redis.port2}"></constructor-arg>
          </bean>
          ......
        </set>
      </property>
    </bean

或者

    <bean name="propertySource" class="org.springframework.core.io.support.ResourcePropertySource">
      <constructor-arg name="location" value="classpath:properties/spring-redis-cluster.properties" />
    </bean>
    <bean id="clusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
      <constructor-arg name="propertySource" ref="propertySource"/>
    </bean>

序列化配置简述:

1.stringRedisSerializer:由于redis的key是String类型所以一般使用StringRedisSerializer

2.valueSerializer:对于redis的value序列化,spring-data-redis提供了许多序列化类,这里建议使用Jackson2JsonRedisSerializer,默认为JdkSerializationRedisSerializer

3.JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。

4.Jackson2JsonRedisSerializer:使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。

使用spring注解式来配置redis,这里只配置集群样例

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

  //spring3支持注解方式获取value 在application里配置配置文件路径即可获取
  @Value("${spring.redis.cluster.nodes}")
  private String clusterNodes;

  @Value("${spring.redis.cluster.timeout}")
  private Long timeout;

  @Value("${spring.redis.cluster.max-redirects}")
  private int redirects;

  @Value("${redis.maxIdle}")
  private int maxIdle;

  @Value("${redis.maxTotal}")
  private int maxTotal;

  @Value("${redis.maxWaitMillis}")
  private long maxWaitMillis;

  @Value("${redis.testOnBorrow}")
  private boolean testOnBorrow;

  /**
   * 选择redis作为默认缓存工具
   * @param redisTemplate
   * @return
   */
  @Bean
  public CacheManager cacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
    //cacheManager.setDefaultExpiration(60);
    //Map<String,Long> expiresMap=new HashMap<>();
    //expiresMap.put("redisCache",5L);
    //cacheManager.setExpires(expiresMap);
    return cacheManager;
  }

  @Bean
  public RedisClusterConfiguration redisClusterConfiguration(){
    Map<String, Object> source = new HashMap<>();
    source.put("spring.redis.cluster.nodes", clusterNodes);
    source.put("spring.redis.cluster.timeout", timeout);
    source.put("spring.redis.cluster.max-redirects", redirects);
    return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
  }

  @Bean
  public JedisConnectionFactory redisConnectionFactory(RedisClusterConfiguration configuration){
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxIdle(maxIdle);
    poolConfig.setMaxTotal(maxTotal);
    poolConfig.setMaxWaitMillis(maxWaitMillis);
    poolConfig.setTestOnBorrow(testOnBorrow);
    return new JedisConnectionFactory(configuration,poolConfig);
  }

  /**
   * retemplate相关配置
   * @param factory
   * @return
   */
  @Bean
  public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory) {

    RedisTemplate<String, Object> template = new RedisTemplate<>();
    // 配置连接工厂
    template.setConnectionFactory(factory);

    //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
    Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper om = new ObjectMapper();
    // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
    //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jacksonSeial.setObjectMapper(om);

    // 值采用json序列化
    template.setValueSerializer(jacksonSeial);
    //使用StringRedisSerializer来序列化和反序列化redis的key值
    template.setKeySerializer(new StringRedisSerializer());

    // 设置hash key 和value序列化模式
    template.setHashKeySerializer(new StringRedisSerializer());

    template.setHashValueSerializer(jacksonSeial);
    template.afterPropertiesSet();

    return template;
  }
}

注意事项:

1.采用注解式配置redis或者使用@Configuration需要在配置文件中指定扫描什么哪些包下的配置文件,当然如果是springboot那当我没说过这句话...

<context:component-scan base-package="com.*"/>

2.spring3支持注解方式获取Value,但是需要在加载的配置文件配置文件路径即可,具体值自己指定吧...

<value>classpath:properties/spring-redis-cluster.properties</value>

3.由于我们公司原有的框架采用的是spring2.5.6, 而对于spring2 和spring2+主要区别(当然是我自己觉得啊)是把各模块分成了不同的jar,而对于使用spring-data-redis模板化处理redis的话,单机情况下spring2.5.6和spring4不会冲突,而如果使用集群模式需要配置redis集群的时候就会出现jar包冲突,这个时候就看要如何取决了,可以直接使用jedisCluster来连接redis集群(不过很多方法都需要自己去写),也可以把spring2.5.6替换成高版本的spring4,只是框架替换需要注意的事情更多了啊(我们公司的直接全部替换没啥毛病好吧,O(∩_∩)O哈哈~),至于重写JedisConnectionFactory和RedisClusterConfiguration我还未去尝试,这个可以作为后续补充吧...

4.顺便说句,spring4不在支持ibatis了,如果你需要用spring4,又需要连接ibatis的话,最粗暴的方式是把spring-orm包换成spring3版本,其他的jar还是4版本即可。(当然我这边直接替换是没啥问题,但同3一样可能存在潜在问题啊,所以说嘛,公司有时候还是需要更新换代下吧...)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • scrapy-redis的安装部署步骤讲解

    先说下自己的环境,redis是部署在centos上的,爬虫运行在windows上, 1. 安装redis yum install -y redis 2. 修改配置文件 vi /etc/redis.conf 将 protected-mode no解注释,否则的话,在不设置密码情况下远程无法连接redis 3. 重启redis systemctl restart redis 4. 关闭防火墙 systemctl stop firewalld.service 5. 开始创建scrapy-redis的相

  • MySQL和Redis实现二级缓存的方法详解

    redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储 Redis支持数据的备份,即master-slave模式的数据备份 优势 性能极高 - Redis能读的速度是110

  • 详解Redis中Lua脚本的应用和实践

    引言 前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重.后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正. redis lua 脚本相关命令 这一小节的内容是基本命令,可粗略阅读后跳过,等使用的时候再回来查询 redis 自 2.6.0 加入了 lua 脚本相关的命令,EVAL.EVALSHA.SCRIPT EXISTS.SCRIPT FLUSH.SCRIPT KILL.SCRIPT LOAD,

  • 一篇文章让你明白Redis主从同步

    今天想和大家分享有关 Redis 主从同步(也称「复制」)的内容. 我们知道,当有多台 Redis 服务器时,肯定就有一台主服务器和多台从服务器.一般来说,主服务器进行写操作,从服务器进行读操作. 那么这里有存在一个问题:从服务器如何和主服务器进行数据同步的呢? 这个问题,就是通过今天的内容:主从同步来解决的. 文章内容依旧比较干,建议大家静下心来专心看,文末会给大家做个简单总结归纳. 1. 如何进行主从同步 假如,现在有 2 台 Redis 服务器,地址分别是 127.0.0.1:6379 和

  • Redis的5种数据类型与常用命令讲解

    1.redis的5种数据类型: string 字符串(可以为整形.浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) hash hash散列值(hash的key必须是唯一的) sort set 有序集合 2.string类型的常用命令: 自加:incr 自减:decr 加: incrby 减: decrby 3.list类型支持的常用命令: lpush:从左边推入 lpop:从右边弹出 rpush:从右变推入 rpop:从右边弹出

  • Python获取Redis所有Key以及内容的方法

    一.获取所有Key # -*- encoding: UTF-8 -*- __author__ = "Sky" import redis pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0) r = redis.StrictRedis(connection_pool=pool) keys = r.keys() print type(keys) print keys 运行结果: <type 'list'> ['fa

  • Docker安装官方Redis镜像并启用密码认证

    参考:docker官方redis文档 1.有特殊版本需求的可以查看redis镜像tag版本 3.2.11, 3.2, 3 (3.2/Dockerfile) 3.2.11-32bit, 3.2-32bit, 3-32bit (3.2/32bit/Dockerfile) 3.2.11-alpine, 3.2-alpine, 3-alpine (3.2/alpine/Dockerfile) 4.0.9, 4.0, 4, latest (4.0/Dockerfile) 4.0.9-32bit, 4.0-

  • Redis主从复制详解

    单机Redis存在的问题 无法故障转移 ,无法避免单点故障 磁盘空间的瓶颈 QPS瓶颈 Redis主从复制的作用 提供数据副本 扩展读性能 配置方法 通过命令 通过配置文件 演示 为方便演示,在一台服务器上搭建redis主从(生产上不会这样做),根据端口区分. 主库 6379 从库 6380 编辑配置文件 vi  redis-6379.conf #后台进程启动 daemonize yes #端口 port 6379 #日志文件名称 logfile "6379.log" #Redis工作

  • PHP实现基于Redis的MessageQueue队列封装操作示例

    本文实例讲述了PHP实现基于Redis的MessageQueue队列封装操作.分享给大家供大家参考,具体如下: Redis的链表List可以用来做链表,高并发的特性非常适合做分布式的并行消息传递. 项目地址:https://github.com/huyanping/Zebra-PHP-Framework 左进右出 $redis->lPush($key, $value); $redis->rPop($key); 以下程序已在生产环境中正式使用. 基于Redis的PHP消息队列封装 <?ph

  • Redis连接错误的情况总结分析

    前言 最近由于流量增大,redis 出现了一连串错误,比如: LOADING Redis is loading the dataset in memory use of closed network connection connection pool exhausted connection refuse by peer 一个个来分析. LOADING Redis is loading the dataset in memory 这里至少有2种可能 可用内存太小,修改 redis.conf 中

随机推荐