Java操作Redis2种方法代码详解
作者:晒太阳的兔子很忙 发布时间:2022-09-10 22:58:56
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)说明
使用的类和api不一样,导致对redis单节点和集群要特地区别对待。
无法集成springCache。
JedisCluster没有对象序列化/反序列化 api,需要自己实现。
jedis2.7版本才正式支持JedisCluster。
二、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种:
stringRedisSerializer
JdkSerializationRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer
(4)SpringCache功能
Spring 3.1 引入了基于注解(annotation)的缓存(cache)技术,通过在既有代码中添加少量它定义的各种annotation,即能够达到缓存方法的返回对象的效果,支持和主流的专业缓存例如 EHCache,Memcache,Redis等集成,也支持以自行扩展。注解可以标记在一个类上,也可以标记在方法上。
开启SpringCache功能:@EnableCaching
SpringCache注解:
@Cacheable --执行方法前,判断有无缓存,如果有直接从缓存中获取结果进行返回,否则放入缓存
@CacheEvict --触发缓存的清除操作
@CachePut --每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中
优点:
减少手写缓存代码量,通过少量的注释标签和配置文件,即可达到使代码具备缓存的能力。
底层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)
优点
和web服务器无关,甚至可以不用web服务器,也能支持session,是一种独立于应用服务器的方案。
配合spring-data-redis.jar使用,能够支持Redis单节点、Sentinel、Redis3.x集群等。
HttpSession代码无需做任何改动,依然使用传统写法session.setAttribute(key,value)。
SpringSession最新版本支持HttpSessionListener。
缺点
依赖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方法、所有微服务实例都会收到事件通知。会导致重复,故需要注意这点,需要应用自行控制重复问题。
来源:https://www.cnblogs.com/bien94/p/12603270.html


猜你喜欢
- 本文实例讲述了Android TabLayout(选项卡布局)简单用法。分享给大家供大家参考,具体如下:我们在应用viewpager的时候,
- 在C#中,一共有38个常用的运用符,根据它们所执行运算的特点和它们的优先级,为了便于记忆,我将它们归为七个等级:1、单元运算符和括号。2、常
- 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西
- 前言自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下
- 本文实例讲述了Java Swing组件编程之JTable表格用法。分享给大家供大家参考,具体如下:表格是GUI编程中使用较多,但也是最麻烦的
- 前言之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是
- Excelapache 为 java开发者们提供了一套excel表格读写的工具:POI ,对于一个小白来说每次读写使用POI需要写一套复杂的
- mysql实现配置中心本公司配置数据的管理是通过mysql进行配置管理,因为已经搭建好了,所以自己动手重新搭建一遍,熟悉整个流程。有关项目源
- 本文实例为大家分享了android自定义滚动上下回弹scollView的具体代码,供大家参考,具体内容如下这是一个自定义view,在xml布
- ReferenceWhy using finalizers is a bad idea当在一个类中使用了另外一个实现了IDisposable
- 1. 数据结构分类按照线性和非线性可以将Java数据结构分为两大类:①线性数据结构:数组、链表、栈、队列②非线性数据结构:树、堆、散列表、图
- 本文实例讲述了C#实现过滤sql特殊字符的方法集合。分享给大家供大家参考,具体如下:1./// <summary>/// 过滤不
- 从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主
- ArratList 类:存放同一数据类型容器(只能为引用数据类型,因实际其内部存放的是地址)1.导入其所在包import java.util
- 本文实例讲述了Java实现的RSA加密解密算法。分享给大家供大家参考,具体如下:import java.awt.AlphaComposite
- 本文实例讲述了Android开发实现SubMenu选项菜单和子菜单。分享给大家供大家参考,具体如下:简介:SubMenu:代表一个子菜单,包
- java反射机制是什么反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;反射机制能够做什么1、判断运行对象的所
- 前言 spring事务管理包含两种情况,编程式事务、声明
- //1.创建数据库public class DBService extends SQLiteOpenHelper {private fina
- ListView在实际实用中,一般都会有下新刷新和上拉加载的动态效果,今天要学的就是如何自定义带下拉刷新的ListView。原理解析:一般将