SSM框架(二级缓存)集成Redis单机模式及哨兵模式
来源:互联网 发布:淘宝买相机会被骗吗 编辑:程序博客网 时间:2024/06/14 19:09
项目整体框架: SpringMVC + Spring+MyBatis +Redis(缓存部署在Linux虚拟机)。
数据库:mysql
1、整体架构
- 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅)
- 使用Spring管理Redis连接池
- 模仿EhcacheCache,实现RedisCache
<!--引入项目依赖的jar包 --><!-- SpringMVC、Spring --><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependencies><!-- mybatis 二级缓存 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version></dependency><!-- spring集成redis --><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.6.RELEASE</version></dependency><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version></dependency><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependency><!-- spring session 做session共享部分及单点登录问题 --><!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session --><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.1.RELEASE</version></dependency><!--引入pageHelper分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.0.0</version></dependency><!-- MBG --><!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.7.RELEASE</version></dependency><!-- 返回json字符串的支持 --><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.8</version></dependency><!--JSR303数据校验支持;tomcat7及以上的服务器, tomcat7以下的服务器:el表达式。额外给服务器的lib包中替换新的标准的el--><!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version></dependency><!-- Spring-Jdbc --><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.7.RELEASE</version></dependency><!--Spring-test --><!-- https://mvnrepository.com/artifact/org.springframework/spring-test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.3.7.RELEASE</version></dependency><!-- Spring面向切面编程 --><!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.7.RELEASE</version></dependency><!--MyBatis --><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!-- MyBatis整合Spring的适配包 --><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!-- 数据库连接池、驱动 --><!-- https://mvnrepository.com/artifact/c3p0/c3p0 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!-- (jstl,servlet-api,junit) --><!-- https://mvnrepository.com/artifact/jstl/jstl --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><!-- 日志LOG4J --><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency><!--解决Spring使用slf4j输出日志与log4j冲突的问题--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.13</version> </dependency> <!-- junit --><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
3、Linux虚拟机Redis部署。- 3.1.下载解压redis(这里使用redis3.2.6的版本):
cd /usr/softwarewget http://download.redis.io/releases/redis-3.2.6.tar.gztar -zxvf /redis-3.2.6.tar.gz
cd redis-3.2.6make && make install3.3进行节点创建,这里为了目录结构清晰,创建一个文件夹进行集群文件的统一存放,并复制配置文件到相应的三个文件夹中
cd /usr/softwaremkdir redis_cluster //创建集群目录cd redis_clustermkdir 6379 7001 7002 //分别代表三个节点 其对应端口 6379 6380 6381cd .. //创建7000节点为例,拷贝到7000目录 cp /usr/software/redis-3.2.6/redis.conf ./redis_cluster/6379/ //拷贝到7001目录 cp /usr/software/redis-3.2.6/redis.conf ./redis_cluster/6380/ //拷贝到7002目录 cp /usr/software/redis-3.2.6/redis.conf ./redis_cluster/6381/
3.4.对应节点配置文件的修改以及sentinel.conf文件的创建配置
6379节点文件的修改:
redis.conf配置文件:
daemonize yes
pidfile "/var/run/redis6379.pid"
port 6379
bind 0.0.0.0
logfile "6379.log"
dbfilename "dump6379.rdb"
sentinel.conf的创建和配置:
port 26379
sentinel monitor mymaster192.168.108.128 6379
6380节点文件的修改:
redis.conf配置文件:
daemonize yes
pidfile "/var/run/redis6380.pid"
port6380
bind 0.0.0.0
logfile "6380.log"
dbfilename "dump6380.rdb"
slaveof 192.168.108.128 6380(映射到主服务器上)
sentinel.conf的创建和配置:
port 26380
sentinel monitor mymaster(主机名) 192.168.108.128 6380
6381节点文件的修改:
redis.conf配置文件:
daemonize yes
pidfile "/var/run/redis6381.pid"
port6381
bind 0.0.0.0
logfile "6381.log"
dbfilename "dump7002.rdb"
slaveof 192.168.108.128 6381(映射到主服务器上)
sentinel.conf的创建和配置:
port 26381
sentinel monitor mymaster192.168.108.128 6381
4.进行集群启动验证分别在相应的文件夹进行启动:redis-server redis.conf
并分别启动哨兵监控:redis-sentinel sentinel.conf
以上是保证了linux下redis哨兵模式的部署成功,接下来是如何及集成到现有的SSM项目框架中
web.xml配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- spring 配置文件加载 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml,classpath:spring-jedis-2.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!--springmvc 配置文件加载 这里我用的是默认位置--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 字符编码集过滤 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- rest风格 处理 如果不采用restful的可以去掉--> <filter> <filter-name>HttpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>HttpPutFormContentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- spring 做session共享 处理单点登录等--><filter><filter-name>springSessionRepositoryFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSessionRepositoryFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>dispatcherServlet-servlet.xml配置信息:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!--SpringMVC的配置文件,包含网站跳转逻辑的控制,配置 --><context:component-scan base-package="com.atguigu" use-default-filters="false"><!--只扫描控制器。 --><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!--配置视图解析器,方便页面返回 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean><!--两个标准配置 --><!-- 将springmvc不能处理的请求交给tomcat --><mvc:default-servlet-handler/><!-- 能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求 --><mvc:annotation-driven/></beans>applicationContext.xml配置信息:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><context:component-scan base-package="com.atguigu"><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- Spring的配置文件,这里主要配置和业务逻辑有关的 --><!--=================== 数据源,事务控制,xxx ================--><context:property-placeholder location="classpath:dbconfig.properties" /><bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean><!--================== 配置和MyBatis的整合=============== --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 指定mybatis全局配置文件的位置 --><property name="configLocation" value="classpath:mybatis-config.xml"></property><property name="dataSource" ref="pooledDataSource"></property><!-- 指定mybatis,mapper文件的位置 --><property name="mapperLocations" value="classpath:mapper/*.xml"></property></bean><!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--扫描所有dao接口的实现,加入到ioc容器中 --><property name="basePackage" value="com.atguigu.crud.dao"></property></bean><!-- 配置一个可以执行批量的sqlSession --><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg><constructor-arg name="executorType" value="BATCH"></constructor-arg></bean><!--============================================= --><!-- ===============事务控制的配置 ================--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--控制住数据源 --><property name="dataSource" ref="pooledDataSource"></property></bean><!--配置事务增强,事务如何切入 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 所有方法都是事务方法 --><tx:method name="*"/><!--以get开始的所有方法 --><tx:method name="get*" read-only="true"/></tx:attributes></tx:advice><!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式) --><aop:config><!-- 切入点表达式 --><aop:pointcut expression="execution(* com.atguigu.crud.service..*(..))" id="txPoint"/><!-- 配置事务增强 --><aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/></aop:config><!-- Spring配置文件的核心点(数据源、与mybatis的整合,事务控制) --></beans>mybatis-config.xml配置信息:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 查询时,关闭关联对象即时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允许使用列标签代替列名 --> <setting name="useColumnLabel" value="true" /> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true" /> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> <setting name="autoMappingBehavior" value="FULL" /> <!-- 对于批量更新操作缓存SQL以提高性能 --> <setting name="defaultExecutorType" value="BATCH" /> <!-- 数据库超过25000秒仍未响应则超时 --> <setting name="defaultStatementTimeout" value="25000" /></settings><!-- 别名 --><typeAliases><package name="com.atguigu.crud.bean"/></typeAliases></configuration>
以上是ssm整合的配置信息,下面是集成redis的整合
spring-jedis-2.xml(这里我做了两种的测试,为了配置文件区别,在后面进行了版本识别)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- session共享部分 --> <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="maxInactiveIntervalInSeconds" value="600"/></bean> <!-- 连接池基本参数配置,类似数据库连接池 <context:property-placeholder location="classpath*:redis.properties" /> --> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"><property name="maxInactiveIntervalInSeconds" value="1800"></property></bean> <!-- 这里为了方便没有引入外部properties文件,实际开发中请注意 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="2000" /> <property name="maxTotal" value="20000" /> <property name="minEvictableIdleTimeMillis" value="300000"></property> <property name="numTestsPerEvictionRun" value="3"></property> <property name="timeBetweenEvictionRunsMillis" value="60000"></property> <property name="maxWaitMillis" value="20000" /> <property name="testOnBorrow" value="false" /> </bean> <!-- redis 哨兵模式的配置--><bean id="redisSentinelConfiguration"class="org.springframework.data.redis.connection.RedisSentinelConfiguration"><!-- master命名配置 需要与服务器sentinel.conf中master命名相同 --><property name="master"><bean class="org.springframework.data.redis.connection.RedisNode"><property name="name" value="mymaster"></property></bean></property><property name="sentinels"> <set><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="192.168.108.129"></constructor-arg><constructor-arg name="port" value="26379"></constructor-arg></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="192.168.108.129"></constructor-arg><constructor-arg name="port" value="26380"></constructor-arg></bean><bean class="org.springframework.data.redis.connection.RedisNode"><constructor-arg name="host" value="192.168.108.129"></constructor-arg><constructor-arg name="port" value="26381"></constructor-arg></bean> </set></property></bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <!-- 这里面是单点模式的配置 <property name="hostName" value="192.168.108.128" /> <property name="port" value="6380" /> --> <constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"></constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg> </bean> <!-- 调用连接池工厂配置 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory"></property> <!-- 如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast to String!!! --> <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> </bean> <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 --> <bean id="redisCacheTransfer" class="com.atguigu.crud.cache.RedisCacheTransfer"> <property name="jedisConnectionFactory" ref="jedisConnectionFactory"/> </bean> <!-- //End 单机版Redis集成 --> <!-- Redis缓存管理对象 --> <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg index="0" ref="redisTemplate" /> </bean></beans>以下上java代码
RedisCache2.java
package com.atguigu.crud.cache;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.ibatis.cache.Cache;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.jedis.JedisConnection;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializer;public class RedisCache2 implements Cache { private static JedisConnectionFactory jedisConnectionFactory; private final String id; private static final Logger LOGGER = LoggerFactory.getLogger(RedisCache2.class); private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); public RedisCache2(final String id){ if (id == null) { throw new IllegalArgumentException("cache instances require an ID"); } this.id = id; } @Override public void clear() { RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); connection.flushDb(); connection.flushAll(); } catch (Exception e) { e.printStackTrace(); }finally{ if (connection != null) { connection.close(); } } } @Override public String getId() { return this.id; } @Override public Object getObject(Object key) { LOGGER.info("hahahah"); System.out.println("查询--------------------------------key:"+key); Object result = null; RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result = serializer.deserialize(connection.get(serializer.serialize(key))); } catch (Exception e) { e.printStackTrace(); }finally{ if (connection != null) { connection.close(); } } return result; } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } @Override public int getSize() { int result = 0; RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); result = Integer.valueOf(connection.dbSize().toString()); } catch (Exception e) { e.printStackTrace(); }finally{ if (connection != null) { connection.close(); } } return result; } @Override public void putObject(Object key, Object value) { System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>key:"+key); RedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); System.out.println("**"+serializer.serialize(key)); connection.set(serializer.serialize(key), serializer.serialize(value)); } catch (Exception e) { e.printStackTrace(); }finally{ if (connection != null) { connection.close(); } } } @Override public Object removeObject(Object key) { RedisConnection connection = null; Object result = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result = connection.expireAt(serializer.serialize(key), 0); } catch (Exception e) { e.printStackTrace(); }finally{ if (connection != null) { connection.close(); } } return result; }public static JedisConnectionFactory getJedisConnectionFactory() {return jedisConnectionFactory;}public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {RedisCache2.jedisConnectionFactory = jedisConnectionFactory;}}RedisCacheTransfer.java
package com.atguigu.crud.cache;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;public class RedisCacheTransfer { public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) { RedisCache2.setJedisConnectionFactory(jedisConnectionFactory); }}
User.java
package com.atguigu.crud.bean;import java.io.Serializable;public class User implements Serializable{/** * */private static final long serialVersionUID = 1L;private Integer id;private String userName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}
UserDao.java(这里本人太懒 没有写太多方法)
package com.atguigu.crud.dao;import com.atguigu.crud.bean.User;public interface UserDao {public User queryByPK(Integer id);}UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.crud.dao.UserDao"> <cache eviction="LRU" type="com.atguigu.crud.cache.RedisCache2" /> <select id="queryByPK" resultType="User"> select id,name userName from user where id = #{id} </select></mapper>
IUserService.java
package com.atguigu.crud.service;import com.atguigu.crud.bean.User;public interface IUserService {public User queryByPK(Integer id);}IUserServiceImpl.java
package com.atguigu.crud.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.atguigu.crud.bean.User;import com.atguigu.crud.dao.UserDao;import com.atguigu.crud.service.IUserService;@Servicepublic class IUserServiceImpl implements IUserService{@Autowiredprivate UserDao userDao;@Overridepublic User queryByPK(Integer id) {// TODO Auto-generated method stubreturn userDao.queryByPK(id);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}}
UserController.java
package com.atguigu.crud.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.atguigu.crud.bean.User;import com.atguigu.crud.service.IUserService;@Controllerpublic class UserController {@Autowiredprivate IUserService iUserService;@RequestMapping(value="/user/{id}",method=RequestMethod.GET)@ResponseBodypublic User getHello(@PathVariable("id")Integer id,HttpServletRequest request){User user = iUserService.queryByPK(id);request.getSession().setAttribute("user", user);System.out.println(id);return user;}public IUserService getiUserService() {return iUserService;}public void setiUserService(IUserService iUserService) {this.iUserService = iUserService;}}测试效果:
后台
测试故障转移(关闭主机)
哨兵投票选取了6380端口为主机
测试成功
以上是自己写的小测试 大家发现错误请告诉我下,谢谢
项目源码下载地址
http://download.csdn.net/download/wangxuelei036/9981864
- SSM框架(二级缓存)集成Redis单机模式及哨兵模式
- Redis哨兵模式及配置
- java操作Redis(哨兵或单机模式)
- redis sentinel(哨兵)模式
- redis的哨兵模式
- redis-09-哨兵模式
- redis配置哨兵模式
- redis哨兵模式
- redis主从+哨兵模式
- redis的哨兵模式
- Redis sentinel 哨兵模式
- Redis sentinel 哨兵模式
- Redis哨兵模式
- Redis 哨兵模式详解
- Redis的哨兵模式
- Redis哨兵模式
- redis集群哨兵模式
- Logstash2.3.4趟坑之集成Redis哨兵模式
- 深入理解C语言的预编译指令之 include
- 机器学习教程 之 人工神经网络的前世今生:标准BP神经网络原理
- Linux常用文本操作命令整理
- QGC的ScreenToolsController
- 一起来看MyBatis(六)
- SSM框架(二级缓存)集成Redis单机模式及哨兵模式
- 面试题----Java垃圾回收机制
- Windows批处理.bat自动安装Python、设置系统变量、替换文件及安装库
- liunx 安装和配置 nginx
- vuex 使用文档
- spark<SecurityException: Invalid signature file digest for Manifest main attributes>
- unity3d UNet常见概念简介
- Sublime Text 3143 注册码
- ssh