文档章节

一个通用的Jedis整合方案

lis1314
 lis1314
发布于 2017/04/18 10:35
字数 716
阅读 383
收藏 3

工具源代码:链接: https://pan.baidu.com/s/1i5h22lJ 密码: pcwq

Jedis整合有两种方式

分别是单点,和集群

单点通常我们使用JedisPool连接池进行整合

集群我们使用JedisCluster进行整合

这里展示一种通用的整合方式,支持单点和集群,自己定义一个工具类,实现JedisCommands接口,同时兼容单点和集群的脚本方法

下面展示代码

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.BitPosParams;
import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoRadiusResponse;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisCommands;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Tuple;
import redis.clients.jedis.params.geo.GeoRadiusParam;
import redis.clients.jedis.params.sortedset.ZAddParams;
import redis.clients.jedis.params.sortedset.ZIncrByParams;

/**
 * Jedis 操作工具类
 * @version 基于Jedis 2.9.0
 * @author lisuo
 *
 */
public class JedisUtil implements JedisCommands {

	// jedis连接池
	private JedisPool jedisPool;

	// jedis集群
	private JedisCluster jedisCluster;

	// 是否为集群,默认不是集群
	private boolean isCluster = false;

	/**
	 * 连接池构建方式
	 * @param jedisPool  jedis连接池
	 */
	public JedisUtil(JedisPool jedisPool) {
		this.jedisPool = jedisPool;
	}

	/**
	 * 集群构建方式
	 * @param jedisCluster jedis集群实例
	 */
	public JedisUtil(JedisCluster jedisCluster) {
		this.jedisCluster = jedisCluster;
		isCluster = true;
	}

	// -----------------------------------实现脚本命令-----------------------------------
	public Object eval(String script, int keyCount, String... params) {
		if (isCluster) {
			return jedisCluster.eval(script, keyCount, params);
		} else {
			Jedis jedis = jedisPool.getResource();
			try {
				return jedis.eval(script, keyCount, params);
			} finally {
				jedis.close();
			}
		}
	}

	public Object eval(String script, List<String> keys, List<String> args) {
		if (isCluster) {
			return jedisCluster.eval(script, keys, args);
		} else {
			Jedis jedis = jedisPool.getResource();
			try {
				return jedis.eval(script, keys, args);
			} finally {
				jedis.close();
			}
		}
	}

	public Object evalsha(String sha1, int keyCount, String... params) {
		if (isCluster) {
			return jedisCluster.evalsha(sha1, keyCount, params);
		} else {
			Jedis jedis = jedisPool.getResource();
			try {
				return jedis.evalsha(sha1, keyCount, params);
			} finally {
				jedis.close();
			}
		}
	}

	/**
	 * 获取JedisCommands实例
	 * @return JedisCommands
	 */
	private JedisCommands getJedisCommands() {
		if (isCluster) {
			return jedisCluster;
		} else {
			return jedisPool.getResource();
		}
	}

	/**
	 * Callback 回调接口
	 * @param <T>
	 */
	public interface Callback<T> {
		/**
		 * 回调函数
		 * @param commands
		 * @return
		 */
		public T call(JedisCommands commands);
	}

	/**
	 * 执行Redis 命令
	 * @param callback 回调接口
	 * @return
	 */
	public <T> T execute(Callback<T> callback) {
		JedisCommands jedisCommands = getJedisCommands();
		try {
			return callback.call(jedisCommands);
		} finally {
			// 非集群下释放资源,集群源码中已实现释放资源
			if (!isCluster) {
				((Jedis) jedisCommands).close();
			}
		}
	}

	// 实现JedisCommands,关于@Deprecated标记的方法参看Jedis API,如果报错可能是版本过高,一些方法被废除
	@Override
	public String get(final String key) {
		return execute(new Callback<String>() {
			@Override
			public String call(JedisCommands commands) {
				return commands.get(key);
			}
		});
	}
	// 略过其他JedisCommands接口方法
}

下面演示单机Redis配置方式

<!-- Jedis 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
	<!-- 最大连接数 -->
	<property name="maxTotal" value="50"></property>
	<!-- 最大空闲连接数 -->
	<property name="maxIdle" value="10"></property>
	<!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1 -->
	<property name="maxWaitMillis" value="3000"></property>
</bean>
<!-- Jedis 连接池实例 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
	<constructor-arg index="0" ref="jedisPoolConfig"/>
	<!-- Redis host -->
	<constructor-arg index="1" value="127.0.0.1"/>
	<!-- Redis port -->
	<constructor-arg index="2" value="6379"/>
</bean>
<!-- Jedis工具类注入 -->
<bean id="jedisUtil" class="com.xxx.util.JedisUtil">
	<constructor-arg type="redis.clients.jedis.JedisPool" ref="jedisPool"/>
</bean>	

集群XML略过..只需要把JedisUtil的构造参数缓存JedisCluster即可

实例代码...

//构建集群配置
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
//节点地址
HostAndPort node1 = new HostAndPort("192.168.1.102", 6379);
HostAndPort node2 = new HostAndPort("192.168.1.103", 6379);
nodes.add(node1);
nodes.add(node2);
JedisCluster jedisCluster = new JedisCluster(nodes);
//构建JedisUtil,整合完毕
JedisUtil jedisUtil = new JedisUtil(jedisCluster);
jedisUtil.set("testKey", "testValue");

 

© 著作权归作者所有

共有 人打赏支持
lis1314
粉丝 11
博文 25
码字总数 24196
作品 0
丰台
高级程序员
私信 提问
redis通用工具类

public class RedisUtil { private static final Logger LOGGER = Logger.getLogger(RedisUtil.class); private static JedisPool pool = null; private static RedisUtil ru = new RedisUti......

glen_xu
2016/02/26
97
0
基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 http://www.tuicool.com/articles/naeEJbv 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 时间 2014-02-21 15:15:17 IT......

毛朱
2015/08/30
0
0
Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档...

easonjim
2017/10/05
0
0
使用redis时候提示B cannot be cast to java.lang.Long怎么解?

在使用jedis从redis中获取时候,会报类型转换异常: 错误: 或者错误: 对应代码: 代码: 借鉴解决方案1: https://my.oschina.net/zhuguowei/blog/406807 按照这个写不行。 借鉴方案2: ht...

中凯_凯哥java
2017/05/22
909
1
redis(三)与spring整合

一、 JAVA操作redis通常使用的是Jedis,通过java代码来操作redis的数据存储读取等操作,用过的人应该知道,Jedis客户端已经足够简单和轻量级了,但是呢,在此同时,Spring也为Redis提供了支持...

废柴
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dockerfile 镜像构建(1)

通用dockerfile 利用已经编译好的.jar 来构建镜像。要构建的目录如下: [root@iZuf61quxhnlk9m2tkx16cZ demo_jar]# docker build -t demo:1 . 运行镜像: [root@iZuf61quxhnlk9m2tkx16cZ de...

Canaan_
15分钟前
0
0
Redis radix tree源码解析

Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。 核心数据结构 raxNode是radix tree的核心数据结构,其结构体...

阿里云云栖社区
18分钟前
4
0
vue import 传入变量

在做动态添加component的时候,传入变量就会报错,出现以下错误信息: vue-router.esm.js?fe87:1921 Error: Cannot find module '@/components/index'. at eval (eval at ./src/components ......

朝如青丝暮成雪
20分钟前
0
0
Flutter开发 Dio拦截器实现token验证过期的功能

前言: 之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有“token验证过期”的需求,所以接下来我简单总结一下在Flutter项目中如何实现自动刷新token并重...

EmilyWu
21分钟前
5
0
final Map可以修改内容,final 常量不能修改

1.final Map 可以put元素,但是不可以重新赋值 如: final Map map = new HashMap(); map = new HashMap();//不可以 因为栈中变量map引用地址不能修改 2.final str = “aa”; str = "bb";/......

qimh
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部