Java操作Redis2种方法代码详解

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

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

(0)

相关推荐

  • java客户端Jedis操作Redis Sentinel 连接池的实现方法

    pom.xml配置 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.0.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients<

  • Java客户端利用Jedis操作redis缓存示例代码

    前言 Redis是一个开源的Key-Value数据缓存,和Memcached类似.Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). Jedis 是 Redis 官方首选的 Java 客户端开发包.下面就来给大家详细关于Java客户端利用Jedis操作redis缓存的相关内容,话不多说,直接来看示例代码吧. 示例代码: //连接redis ,redis的默认端口是6379 Jedis

  • java中对Redis的缓存进行操作的示例代码

    Redis 是一个NoSQL数据库,也是一个高性能的key-value数据库.一般我们在做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加入缓存功能.Redis的高效缓存功能给我们解决了难题.下面我主要讲讲在Java项目中怎么去连接Redis服务器以及需要注意的事项. 1.导入必须的Jar包 使用Java操作Redis需要两个必须的Jar包:jedis-2.5.1.jar 和  commons-pool2-2.0.jar .每个版本可以不一样,根据你自己下载的

  • Java中使用Jedis操作Redis的示例代码

    使用Java操作Redis需要jedis-2.1.0.jar,下载地址:jedis-2.1.0.jar 如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar,下载地址:commons-pool-1.5.4.jar package com.test; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.j

  • 在Java中使用redisTemplate操作缓存的方法示例

    背景 在最近的项目中,有一个需求是对一个很大的数据库进行查询,数据量大概在几千万条.但同时对查询速度的要求也比较高. 这个数据库之前在没有使用Presto的情况下,使用的是Hive,使用Hive进行一个简单的查询,速度可能在几分钟.当然几分钟也并不完全是跑SQL的时间,这里面包含发请求,查询数据并且返回数据的时间的总和.但是即使这样,这样的速度明显不能满足交互式的查询需求. 我们的下一个解决方案就是Presto,在使用了Presto之后,查询速度降到了秒级.但是对于一个前端查询界面的交互式查询来

  • Java使用Jedis操作Redis服务器的实例代码

    这几天Java项目中需要用到Redis,于是学习了一下使用Jedis来操作Redis服务器的相关知识,下面为具体的配置和代码. 1.Maven中配置Jedis 在maven项目的pom.xml中添加依赖 <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</

  • Java连接redis及基本操作示例

    本文实例讲述了Java连接redis及基本操作.分享给大家供大家参考,具体如下: 点击此处:本站下载安装. 解压安装 启动redis:使用cd命令切换目录到 D:\redis运行redis-server.exe redis.windows.conf 默认端口为6379 访问:切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379. pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0&

  • Java操作Redis2种方法代码详解

    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.clien

  • 在Java中操作Zookeeper的示例代码详解

    依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.0</version> </dependency> 连接到zkServer //连接字符串,zkServer的ip.port,如果是集群逗号分隔 String connectStr = "192.

  • java多线程Thread的实现方法代码详解

    之前有简单介绍过java多线程的使用,已经Thread类和Runnable类,为了更好地理解多线程,本文就Thread进行详细的分析. start() 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法). 多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动. 用start方法来启动线程,真正实现了多线程运行,这时无需等待r

  • java获取登录者IP和登录时间的两种实现代码详解

    第一种直接用java自带的InetAddress类: import java.net.InetAddress; import java.text.SimpleDateFormat; import java.util.Date; public class test{ public static void main(String[] args) throws Exception{ InetAddress addr = InetAddress.getLocalHost(); String ip=add

  • Java强制保留两位小数的四种方法案例详解

    方法一:String的format方法(推荐) double f = 111231.5585; System.out.println(String.format("%.2f", f)); 方法二:DecimalFormat的format方法 double f = 111231.5585; DecimalFormat df = new DecimalFormat("#.00"); System.out.println(df.format(f)); 以下内容了解即可,可

  • Java编程实现排他锁代码详解

    一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续进程的正常获取锁 二 .解决方案 1. 最初的构想 在Java领域,同进程的多线程排他实现还是较简易的.比如使用线程同步变量标示是否已锁状态便可.但不同进程的排他实现就比较繁琐.使用已有API,自然想到 java.nio.channels.FileLock:如下 /** * @param file

  • Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行插入和删除操作的线性表.有时又叫LIFO(后进先出表).要搞清楚这个概念,首先要明白"栈"原来的意思,如此才能把握本质. "栈"者,存储货物或供旅客住宿的地方,可引申为仓库.中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈.出栈的说法. 实现方式是

  • Java中EnumSet代替位域代码详解

    本文研究的主要是Java中EnumSet代替位域的相关内容,具体介绍如下. 读书笔记<Effective Java 中文版 第2版> 位域表示法允许利用位操作,有效地执行先 union(联合)和 intersection(交集)这样的集合操作.但是位域有着int枚举常亮的所有缺点,甚至更多.当位域一数字形式打印时,翻译位域比翻译简单的int枚举常量要困难得多.甚至,要遍历位域表示的所有元素都没有很容易的方法. //Bit field enumeration constant - OBSOLET

  • java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且

  • Mvc提交表单的四种方法全程详解

    一,MVC HtmlHelper方法 1. Html.BeginForm(actionName,controllerName,method,htmlAttributes){} 2. BeginRouteForm 方法 (HtmlHelper, String, Object, FormMethod) 二,传统Form表单Aciton属性提交 三,Jquery+Ajax 提交表单 四,MVC Controller控制器和表单参数传递 MVC HtmlHelper方法 一,Html.BeginForm

随机推荐