Java操作Redis2种方法代码详解

所属分类: 软件编程 / java 阅读数: 49
收藏 0 赞 0 分享

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方法、所有微服务实例都会收到事件通知。会导致重复,故需要注意这点,需要应用自行控制重复问题。

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

更多精彩内容其他人还在看

SpringBoot中使用Ehcache的详细教程

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。这篇文章主要介绍了SpringBoot中使用Ehcache的相关知识,需要的朋友可以参考下
收藏 0 赞 0 分享

在idea 中添加和删除模块Module操作

这篇文章主要介绍了在idea 中添加和删除模块Module操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java spring整合junit操作(有详细的分析过程)

这篇文章主要介绍了java spring整合junit操作(有详细的分析过程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解JAVA 弱引用

这篇文章主要介绍了 JAVA 弱引用的相关资料,帮助大家更好的理解和学习java引用对象,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

深入了解JAVA 虚引用

这篇文章主要介绍了JAVA 虚引用的相关资料,帮助大家更好的理解和学习JAVA,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

详解JAVA 强引用

这篇文章主要介绍了JAVA 强引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

java中的按位与(&)用法说明

这篇文章主要介绍了java中的按位与(&)用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

深入了解JAVA 软引用

这篇文章主要介绍了JAVA 软引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

利用MyBatis实现条件查询的方法汇总

这篇文章主要给大家介绍了关于利用MyBatis实现条件查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Intellij IDEA 与maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound

这篇文章主要介绍了Intellij IDEA 与maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.Pa
收藏 0 赞 0 分享
查看更多