Java操作Redis的方式有下面两种:
一、jedis
(1)maven配置
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
(2)相关类
单节点:redis.clients.jedis.Jedis
集群:redis.clients.jedis.JedisCluster
(3)说明
二、spring-data-redis
(1)maven配置
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.4.RELEASE</version> </dependency>
(2)相关类
单节点:org.springframework.data.redis.core.RedisTemplate
集群:org.springframework.data.redis.core.RedisTemplate
(3)说明
使用方式统一,如:
redisTemplate.opsForValue().set(key, object);
redisTemplate.opsForHash().put(key, hashKey, object);
可以集成SpringCache。
自带序列化功能,4种:
(4)SpringCache功能
Spring 3.1 引入了基于注解(annotation)的缓存(cache)技术,通过在既有代码中添加少量它定义的各种annotation,即能够达到缓存方法的返回对象的效果,支持和主流的专业缓存例如 EHCache,Memcache,Redis等集成,也支持以自行扩展。注解可以标记在一个类上,也可以标记在方法上。
开启SpringCache功能:@EnableCaching
SpringCache注解:
优点:
减少手写缓存代码量,通过少量的注释标签和配置文件,即可达到使代码具备缓存的能力。
底层Cache类型更换代码无需改动,如由EHCache换成Redis。
缺点:
注解无过期时间expire属性,需自行扩展。
使用限制:基于proxy 的spring aop带来的内部调用问题,如this内部调用,非public方法调用等。
放入缓存方法只使用connection.set,即缓存存入Redis都是String字符串类型。
(5)Tomcat插件RedisSessionManager
分布式系统要将HttpSession放入Redis共享,代码又不想改动的话,那么可以通过RedisSessionManager来集成,可以引入第三方插件RedisSessionManager和相关jar,在tomcat下配置即可。
配置
引入插件:
\Tomcat7\conf\context.xml下配置
<Valve className="com.r.tomcat.session.management.RequestSessionHandlerValve"/>
<Manager className="com.r.tomcat.session.management.RequestSessionManager"/>\Tomcat7\conf\RedisDataCache.properties配置
redis.hosts=127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....
redis.password=
redis.cluster.enabled=true
优点
session的代码写法不用动,依然使用传统写法session.setAttribute(key,value);引入插件后session由本地tomcat存储改为了Redis,重启tomcat也不用担心session消失。
缺点
只能用于tomcat。
(6)SpringSession
这个技术重写了HttpSession,以SpringSession来做,Spring Session提供了集群Session(Clustered Sessions)功能, 默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。
配置
maven: <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> 开启Reids键空间通知功能: notify-keyspace-events AKE 开启Redis存储springSession: @EnableRedisHttpSession(maxInactiveIntervalInSeconds=1800)
优点
缺点
依赖Spring。
Spring版本要是4.1.6以上,servlet要是3.0.1以上,这样对JDK(1.6+)和web服务器(tomcat7+)版本有限制。
(7)SpringSession使用session监听器
SpringSession最新版本支持HttpSessionListener,该监听器可以捕捉到session创建和销毁,内部采用Redis的Sub/Pub+键空间通知功能实现。
监听器类
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=1800) public class RedisHttpSessionConfig { /** * 注入监听器 */ @Bean public SessionEventHttpSessionListenerAdapter listenerAdapter() { List<HttpSessionListener> listenerList = new ArrayList<>(); listenerList.add(new SessionListener()); // 注入自己的SessionListener类 return new SessionEventHttpSessionListenerAdapter(listenerList); } }
说明
HttpSessionListener不推荐在RedisCluster下使用:因sessionDestoryed采取的是Redis键空间通知功能,键空间通知功能是在Redis2.8开始新推出的,但在RedisCluster下键空间通知功能有bug,event触发时不会publish通知到所有节点,只对本节点的master/slave通知,故使用redisCluster的环境下,有可能会订阅收不到sessionDestroyed消息,故不推荐在RedisCluster下使用HttpSessionListener。需要自己去实现SUBSCRIBE各个Redis节点捕捉sessionDestoryed功能。
重复监听:当一个session销毁时,那么我们的listener的sessionDestroyed方法、所有微服务实例都会收到事件通知。会导致重复,故需要注意这点,需要应用自行控制重复问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。