Redis集群与spring的整合

时间:2021-08-22 09:32:43

上一篇详细的赘述了Redis的curd操作及集群的搭建。下面我们开始将他整合到我们实际的项目中去。我的项目采用的是标准的ssm框架,ssm框架这里不说,直接开始整合。

  • 首先在maven管理中将我们的jar包引入
<!--1.7.2 开始支持Redis 集群-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<!-- Redis 缓存Jar -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency> <!--下面就是spring的maven坐标了,这里就不写了,读者自己引入-->
  • 在spring配置文件中我们可以进行配置Redis,但是为了将Redis分离容易修改我将它卸载另外一个xml文件中,只要在spring配置文件中引入这个Redis配置文件就行了。

Redis集群与spring的整合

  • 下面所有的记录都是在Redis这个配置文件进行操作的。

Redis连接池配置

  • 这里只是将设置连接池的一些基本属性,比如说最大连接数,连接前属性判断等
<bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
  • maxIdle:控制一个pool最多有多少个状态为idle的jedis实例;

  • 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的

  • maxWaitMillis : 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

Redis集群配置

这里我们就是将我们上一篇开启的Redis服务引入到项目中来。clusterNodes就是我们一个一个的Redis服务。

<!-- Redis集群配置 -->
<bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
<property name="maxRedirects" value="3"></property>
<property name="clusterNodes">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7000"></constructor-arg>
</bean> <bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
</set>
</property>
</bean>

Redis连接工厂

我们将上面的Redis服务节点和连接池引入到工厂中,有工程去生产一个可用的jedis提供我们进行缓存的CURD操作!!

<!-- ReDis连接工厂 -->
<bean id="redis4CacheConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-arg name="clusterConfig" ref="redisClusterConfig" />
<property name="timeout" value="${redis.timeout}" />
<property name="poolConfig" ref="redisPoolConfig" />
</bean>

Redis模板

提供了jedis进行操作我们就要放道模板里面给我们调用!。

<!-- 存储序列化 -->
<bean name="stringRedisSerializer"
class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <!-- 集群Resis使用模板 -->
<bean id="clusterRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redis4CacheConnectionFactory" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
<property name="hashValueSerializer" ref="stringRedisSerializer" />
</bean>

项目调用

在配置文件中都已经将jedis配置好了,我们只需要通过这个模板就可以对Redis进行CURD操作了。下面是个简单的列子

clusterRedisTemplate.execute(new RedisCallback<Long>() {
public Long doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] keyb = key.getBytes();
byte[] valueb = toByteArray(value);
// 判断当前值是否已经存在
if (connection.exists(keyb)) {
// 删除原数据
connection.del(keyb);
}
connection.set(keyb, valueb);
return 1L;
}
});

源码探究竟

在RedisClusterConfiguration类中我们传入的Redis服务node,我们设置的是property然后该类中就开始执行下面代码

Redis集群与spring的整合

然后我们在工厂中传入这些节点,

Redis集群与spring的整合

这个工厂给我提供了一个afterproperties方法,意思就是在这些参数设置完成之后执行的一个方法。

Redis集群与spring的整合

在这里我们可以看见一个creatPool的方法,这个就是去连接池里创建连接

Redis集群与spring的整合

Bug解决

上面的部署 会出现一个问题,就是在项目中,每次初始化时会重连接池中选择一个可用的Redis服务连接,当这个Redis服务宕机后我们的项目还会继续连接这个Redis服务,我们只能从新启动项目,项目才会从新从连接池中选择新的Redis服务。

  • 解决办法 我在每次操作Redis时都去重构连接池,这样就保证我每次都会去连接池找一个正真可用的Redis服务。
  • 解决就是将RedisNode注入到项目中,每次都执行我们上次看到的creatPool方法
/** Redis模板注入 */
@Resource
private RedisClusterConfiguration redisClusterConfig;
private JedisConnectionFactory redis4CacheConnectionFactory;
@Resource
private RedisTemplate<String, Object> clusterRedisTemplate;
//重构连接池
private void init(){
redis4CacheConnectionFactory=new JedisConnectionFactory(redisClusterConfig);
redis4CacheConnectionFactory.afterPropertiesSet();
clusterRedisTemplate.setConnectionFactory(redis4CacheConnectionFactory);
}

这样又出现问题了,每次都初始化连接池,这在连接池上很费性能,暂时没有解决办法,但是我初步想通过redis sentinel 来检测Redis集群中的Redis服务。当Redis宕机后通过sentinel 提供的API来通知项目重新去构建连接池,重新连接新Redis服务

Redis集群与spring的整合的更多相关文章

  1. 如何在Windows上部署Redis集群和SpringBoot进行整合

    一.安装Redis的Windows版本并进行配置 (1)下载链接 https://github.com/microsoftarchive/redis/releases (2)将下载后的Redis复制成 ...

  2. Springboot 2&period;0&period;x 集成基于Centos7的Redis集群安装及配置

    Redis简介 Redis是一个基于C语言开发的开源(BSD许可),开源高性能的高级内存数据结构存储,用作数据库.缓存和消息代理.它支持数据结构,如 字符串.散列.列表.集合,带有范围查询的排序集,位 ...

  3. springmvc3&period;2集成redis集群

    老项目需要集成redis集群 因为spring版本才从2.x升级上来,再升级可能改动较大,且并非maven项目升级麻烦,故直接集成. jar包准备: jedis-2.9.0.jar  -- 据说只有这 ...

  4. redis集群配置,spring整合jedis,缓存同步

    前台的商品数据(图片等加载缓慢)查询,先从redis缓存查询数据. redis是一个nosql数据库,内存版数据库,读取速度11w/s.本身具有内存淘汰机制,是单线程服务器(分时操作系统),线程安全. ...

  5. CAS工程用redis集群存储票据ticket Spring整合

    maven jar包版本: <dependency> <groupId>redis.clients</groupId> <artifactId>jedi ...

  6. Spring Boot2&period;0之 整合Redis集群

    项目目录结构: pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...

  7. 04&period;redis集群&plus;SSM整合使用

    redis集群+SSM整合使用 首先是创建redis-cluster文件夹: 因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.168.0.109 192.1 ...

  8. springboot&plus;shiro&plus;redis&lpar;集群redis版&rpar;整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3.springboot+shiro+redis(单机red ...

  9. SpringBoot整合Redis集群

    一.环境搭建 Redis集群环境搭建:https://www.cnblogs.com/zwcry/p/9174233.html 二.Spring整合Redis集群 1.pom.xml <proj ...

随机推荐

  1. HttpServletResponse常用的方法

    所有Servlet响应都实现ServletResponse接口.ServletResponse接口主要有以下方法: (1)从Servlet中可以通过getWriter方法取得PrintWriter对象 ...

  2. C&num;&lpar;winform&rpar;为button添加背景图片

    1.既然是添加背景图片 所以这里应该使用 Button.BackgroudImage = "" ;来设置图片 而不应该使用  Button.Image = "" ...

  3. Java 基本日期类使用(一)

    一.java.util.Date Date表示特定的瞬间,精确到毫秒,其子类有Date.Time.Timestap.默认情况下输出的Date对象为:Mon Oct 13 17:48:47 CST 20 ...

  4. Java学习笔记之多态

    1.父类型的引用可以指向子类型的对象: Parent p = new Child(); 2.当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误:如果有,再去调用子类的该同名方法 ...

  5. X分钟速成Python3

    参考博客:Python3 从入门到开车  (与以下代码无关) 源代码下载: learnpython3-cn.py Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计. ...

  6. 6、二、App Components&lpar;应用程序组件&rpar;:1、Intents and Intent Filters&lpar;意图和意图过滤器&rpar;

    1.Intents and Intent Filters(意图和意图过滤器) 1.0.Intents and Intent Filters(意图和意图过滤器) An Intent is a messa ...

  7. JS--我发现,原来你是这样的JS(引用类型不简单&lbrack;上篇&rsqb;,且听我娓娓道来)

    一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...

  8. ethereumjs&sol;ethereumjs-wallet

    Utilities for handling Ethereum keys ethereumjs-wallet A lightweight wallet implementation. At the m ...

  9. java struts2入门学习---常用标签学习总结

    jsp页面中引入标签: <%@ taglib uri="/struts-tags" prefix="s"%> 常用标签知识点总结: <s:fi ...

  10. Algorithm-多目标优化-博文路径

    参考博文: 多目标进化算法(MOEA)概述: https://blog.csdn.net/qithon/article/details/72885053 多目标优化问题的算法及其求解: https:/ ...