一个通用的Jedis整合方案

工具源代码:链接: 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");

 

转载于:https://my.oschina.net/lis1314/blog/881704

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值