jedis使用线程池封装redis基本操作

redis客户端 jedis 常用的 操作

key value

hash

list

set

zset

的基本操作

package cn.zto.util;

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

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.BinaryClient.LIST_POSITION;

/**
 * <p>redis通用工具类</p>
 * @author bigSea
 *
 */
public class RedisUtil {

	private JedisPool pool = null;

	/**
	 * <p>传入ip和端口号构建redis 连接池</p>
	 * @param ip ip
	 * @param prot 端口
	 */
	public RedisUtil(String ip, int prot) {
		if (pool == null) {
			JedisPoolConfig config = new JedisPoolConfig();
			// 控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
			// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
			config.setMaxActive(500);
			// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
			config.setMaxIdle(5);
			// 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
			config.setMaxWait(1000 * 100);
			// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
			config.setTestOnBorrow(true);
			// pool = new JedisPool(config, "192.168.0.121", 6379, 100000);
			pool = new JedisPool(config, ip, prot, 100000);
		}
	}

	/**
	 * <p>通过配置对象 ip 端口 构建连接池</p>
	 * @param config 配置对象
	 * @param ip ip
	 * @param prot 端口
	 */
	public RedisUtil(JedisPoolConfig config ,String ip, int prot){
		if (pool == null) {
			pool = new JedisPool(config,ip,prot,10000);
		}
	}

	/**
	 * <p>通过配置对象 ip 端口 超时时间 构建连接池</p>
	 * @param config 配置对象
	 * @param ip ip
	 * @param prot 端口
	 * @param timeout 超时时间
	 */
	public RedisUtil(JedisPoolConfig config ,String ip, int prot ,int timeout){
		if (pool == null) {
			pool = new JedisPool(config,ip,prot,timeout);
		}
	}

	/**
	 * <p>通过连接池对象 构建一个连接池</p>
	 * @param pool 连接池对象
	 */
	public RedisUtil(JedisPool pool){
		if (this.pool == null) {
			this.pool = pool;
		}
	}

	/**
	 * <p>通过key获取储存在redis中的value</p>
	 * <p>并释放连接</p>
	 * @param key
	 * @return 成功返回value 失败返回null
	 */
	public String get(String key){
		Jedis jedis = null;
		String value = null;
		try {
			jedis = pool.getResource();
			value = jedis.get(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return value;
	}

	/**
	 * <p>向redis存入key和value,并释放连接资源</p>
	 * <p>如果key已经存在 则覆盖</p>
	 * @param key
	 * @param value
	 * @return 成功 返回OK 失败返回 0
	 */
	public String set(String key,String value){
		Jedis jedis = null;
		try {
			jedis = pool.getResource();
			return jedis.set(key, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return "0";
		} finally {
			returnResource(pool, jedis);
		}
	}

	/**
	 * <p>删除指定的key,也可以传入一个包含key的数组</p>
	 * @param keys 一个key  也可以使 string 数组
	 * @return 返回删除成功的个数
	 */
	public Long del(String...keys){
		Jedis jedis = null;
		try {
			jedis = pool.getResource();
			return jedis.del(keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return 0L;
		} finally {
			returnResource(pool, jedis);
		}
	}

	/**
	 * <p>通过key向指定的value值追加值</p>
	 * @param key
	 * @param str
	 * @return 成功返回 添加后value的长度 失败 返回 添加的 value 的长度  异常返回0L
	 */
	public Long append(String key ,String str){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.append(key, str);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return 0L;
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>判断key是否存在</p>
	 * @param key
	 * @return true OR false
	 */
	public Boolean exists(String key){
		Jedis jedis = null;
		try {
			jedis = pool.getResource();
			return jedis.exists(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return false;
		} finally {
			returnResource(pool, jedis);
		}
	}

	/**
	 * <p>设置key value,如果key已经存在则返回0,nx==> not exist</p>
	 * @param key
	 * @param value
	 * @return 成功返回1 如果存在 和 发生异常 返回 0
	 */
	public Long setnx(String key ,String value){
		Jedis jedis = null;
		try {
			jedis = pool.getResource();
			return jedis.setnx(key, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return 0L;
		} finally {
			returnResource(pool, jedis);
		}
	}

	/**
	 * <p>设置key value并制定这个键值的有效期</p>
	 * @param key
	 * @param value
	 * @param seconds 单位:秒
	 * @return 成功返回OK 失败和异常返回null
	 */
	public String setex(String key,String value,int seconds){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.setex(key, seconds, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key 和offset 从指定的位置开始将原先value替换</p>
	 * <p>下标从0开始,offset表示从offset下标开始替换</p>
	 * <p>如果替换的字符串长度过小则会这样</p>
	 * <p>example:</p>
	 * <p>value : [email protected]</p>
	 * <p>str : abc </p>
	 * <P>从下标7开始替换  则结果为</p>
	 * <p>RES : bigsea.abc.cn</p>
	 * @param key
	 * @param str
	 * @param offset 下标位置
	 * @return 返回替换后  value 的长度
	 */
	public Long setrange(String key,String str,int offset){
		Jedis jedis = null;
		try {
			jedis = pool.getResource();
			return jedis.setrange(key, offset, str);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
			return 0L;
		} finally {
			returnResource(pool, jedis);
		}
	}

	/**
	 * <p>通过批量的key获取批量的value</p>
	 * @param keys string数组 也可以是一个key
	 * @return 成功返回value的集合, 失败返回null的集合 ,异常返回空
	 */
	public List<String> mget(String...keys){
		Jedis jedis = null;
		List<String> values = null;
		try {
			jedis = pool.getResource();
			values = jedis.mget(keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return values;
	}

	/**
	 * <p>批量的设置key:value,可以一个</p>
	 * <p>example:</p>
	 * <p>  obj.mset(new String[]{"key2","value1","key2","value2"})</p>
	 * @param keysvalues
	 * @return 成功返回OK 失败 异常 返回 null
	 *
	 */
	public String mset(String...keysvalues){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.mset(keysvalues);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>批量的设置key:value,可以一个,如果key已经存在则会失败,操作会回滚</p>
	 * <p>example:</p>
	 * <p>  obj.msetnx(new String[]{"key2","value1","key2","value2"})</p>
	 * @param keysvalues
	 * @return 成功返回1 失败返回0
	 */
	public Long msetnx(String...keysvalues){
		Jedis jedis = null;
		Long res = 0L;
		try {
			jedis = pool.getResource();
			res =jedis.msetnx(keysvalues);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>设置key的值,并返回一个旧值</p>
	 * @param key
	 * @param value
	 * @return 旧值 如果key不存在 则返回null
	 */
	public String getset(String key,String value){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.getSet(key, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过下标 和key 获取指定下标位置的 value</p>
	 * @param key
	 * @param startOffset 开始位置 从0 开始 负数表示从右边开始截取
	 * @param endOffset
	 * @return 如果没有返回null
	 */
	public String getrange(String key, int startOffset ,int endOffset){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.getrange(key, startOffset, endOffset);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key 对value进行加值+1操作,当value不是int类型时会返回错误,当key不存在是则value为1</p>
	 * @param key
	 * @return 加值后的结果
	 */
	public Long incr(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.incr(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key给指定的value加值,如果key不存在,则这是value为该值</p>
	 * @param key
	 * @param integer
	 * @return
	 */
	public Long incrBy(String key,Long integer){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.incrBy(key, integer);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>对key的值做减减操作,如果key不存在,则设置key为-1</p>
	 * @param key
	 * @return
	 */
	public Long decr(String key) {
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.decr(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>减去指定的值</p>
	 * @param key
	 * @param integer
	 * @return
	 */
	public Long decrBy(String key,Long integer){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.decrBy(key, integer);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取value值的长度</p>
	 * @param key
	 * @return 失败返回null
	 */
	public Long serlen(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.strlen(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key给field设置指定的值,如果key不存在,则先创建</p>
	 * @param key
	 * @param field 字段
	 * @param value
	 * @return 如果存在返回0 异常返回null
	 */
	public Long hset(String key,String field,String value) {
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hset(key, field, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key给field设置指定的值,如果key不存在则先创建,如果field已经存在,返回0</p>
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public Long hsetnx(String key,String field,String value){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hsetnx(key, field, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key同时设置 hash的多个field</p>
	 * @param key
	 * @param hash
	 * @return 返回OK 异常返回null
	 */
	public String hmset(String key,Map<String, String> hash){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hmset(key, hash);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key 和 field 获取指定的 value</p>
	 * @param key
	 * @param field
	 * @return 没有返回null
	 */
	public String hget(String key, String field){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hget(key, field);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key 和 fields 获取指定的value 如果没有对应的value则返回null</p>
	 * @param key
	 * @param fields 可以使 一个String 也可以是 String数组
	 * @return
	 */
	public List<String> hmget(String key,String...fields){
		Jedis jedis = null;
		List<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hmget(key, fields);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key给指定的field的value加上给定的值</p>
	 * @param key
	 * @param field
	 * @param value
	 * @return
	 */
	public Long hincrby(String key ,String field ,Long value){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hincrBy(key, field, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key和field判断是否有指定的value存在</p>
	 * @param key
	 * @param field
	 * @return
	 */
	public Boolean hexists(String key , String field){
		Jedis jedis = null;
		Boolean res = false;
		try {
			jedis = pool.getResource();
			res = jedis.hexists(key, field);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回field的数量</p>
	 * @param key
	 * @return
	 */
	public Long hlen(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hlen(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;

	}

	/**
	 * <p>通过key 删除指定的 field </p>
	 * @param key
	 * @param fields 可以是 一个 field 也可以是 一个数组
	 * @return
	 */
	public Long hdel(String key ,String...fields){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hdel(key, fields);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回所有的field</p>
	 * @param key
	 * @return
	 */
	public Set<String> hkeys(String key){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hkeys(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回所有和key有关的value</p>
	 * @param key
	 * @return
	 */
	public List<String> hvals(String key){
		Jedis jedis = null;
		List<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hvals(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取所有的field和value</p>
	 * @param key
	 * @return
	 */
	public Map<String, String> hgetall(String key){
		Jedis jedis = null;
		Map<String, String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.hgetAll(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key向list头部添加字符串</p>
	 * @param key
	 * @param strs 可以使一个string 也可以使string数组
	 * @return 返回list的value个数
	 */
	public Long lpush(String key ,String...strs){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lpush(key, strs);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key向list尾部添加字符串</p>
	 * @param key
	 * @param strs 可以使一个string 也可以使string数组
	 * @return 返回list的value个数
	 */
	public Long rpush(String key ,String...strs){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.rpush(key, strs);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key在list指定的位置之前或者之后 添加字符串元素</p>
	 * @param key
	 * @param where LIST_POSITION枚举类型
	 * @param pivot list里面的value
	 * @param value 添加的value
	 * @return
	 */
	public Long linsert(String key, LIST_POSITION where,
		    String pivot, String value){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.linsert(key, where, pivot, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key设置list指定下标位置的value</p>
	 * <p>如果下标超过list里面value的个数则报错</p>
	 * @param key
	 * @param index 从0开始
	 * @param value
	 * @return 成功返回OK
	 */
	public String lset(String key ,Long index, String value){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lset(key, index, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key从对应的list中删除指定的count个 和 value相同的元素</p>
	 * @param key
	 * @param count 当count为0时删除全部
	 * @param value
	 * @return 返回被删除的个数
	 */
	public Long lrem(String key,long count,String value){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lrem(key, count, value);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key保留list中从strat下标开始到end下标结束的value值</p>
	 * @param key
	 * @param start
	 * @param end
	 * @return 成功返回OK
	 */
	public String ltrim(String key ,long start ,long end){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.ltrim(key, start, end);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key从list的头部删除一个value,并返回该value</p>
	 * @param key
	 * @return
	 */
	public String lpop(String key){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lpop(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key从list尾部删除一个value,并返回该元素</p>
	 * @param key
	 * @return
	 */
	public String rpop(String key){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.rpop(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value</p>
	 * <p>如果第一个list为空或者不存在则返回null</p>
	 * @param srckey
	 * @param dstkey
	 * @return
	 */
	public String rpoplpush(String srckey, String dstkey){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.rpoplpush(srckey, dstkey);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取list中指定下标位置的value</p>
	 * @param key
	 * @param index
	 * @return 如果没有返回null
	 */
	public String lindex(String key,long index){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lindex(key, index);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回list的长度</p>
	 * @param key
	 * @return
	 */
	public Long llen(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.llen(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取list指定下标位置的value</p>
	 * <p>如果start 为 0 end 为 -1 则返回全部的list中的value</p>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<String> lrange(String key,long start,long end){
		Jedis jedis = null;
		List<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.lrange(key, start, end);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key向指定的set中添加value</p>
	 * @param key
	 * @param members 可以是一个String 也可以是一个String数组
	 * @return 添加成功的个数
	 */
	public Long sadd(String key,String...members){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sadd(key, members);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key删除set中对应的value值</p>
	 * @param key
	 * @param members 可以是一个String 也可以是一个String数组
	 * @return 删除的个数
	 */
	public Long srem(String key,String...members){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.srem(key, members);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key随机删除一个set中的value并返回该值</p>
	 * @param key
	 * @return
	 */
	public String spop(String key){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.spop(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取set中的差集</p>
	 * <p>以第一个set为标准</p>
	 * @param keys 可以使一个string 则返回set中所有的value 也可以是string数组
	 * @return
	 */
	public Set<String> sdiff(String...keys){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sdiff(keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取set中的差集并存入到另一个key中</p>
	 * <p>以第一个set为标准</p>
	 * @param dstkey 差集存入的key
	 * @param keys 可以使一个string 则返回set中所有的value 也可以是string数组
	 * @return
	 */
	public Long sdiffstore(String dstkey,String... keys){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sdiffstore(dstkey, keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取指定set中的交集</p>
	 * @param keys 可以使一个string 也可以是一个string数组
	 * @return
	 */
	public Set<String> sinter(String...keys){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sinter(keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取指定set中的交集 并将结果存入新的set中</p>
	 * @param dstkey
	 * @param keys 可以使一个string 也可以是一个string数组
	 * @return
	 */
	public Long sinterstore(String dstkey,String...keys){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sinterstore(dstkey, keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回所有set的并集</p>
	 * @param keys 可以使一个string 也可以是一个string数组
	 * @return
	 */
	public Set<String> sunion(String... keys){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sunion(keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回所有set的并集,并存入到新的set中</p>
	 * @param dstkey
	 * @param keys 可以使一个string 也可以是一个string数组
	 * @return
	 */
	public Long sunionstore(String dstkey,String...keys){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sunionstore(dstkey, keys);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key将set中的value移除并添加到第二个set中</p>
	 * @param srckey 需要移除的
	 * @param dstkey 添加的
	 * @param member set中的value
	 * @return
	 */
	public Long smove(String srckey, String dstkey, String member){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.smove(srckey, dstkey, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取set中value的个数</p>
	 * @param key
	 * @return
	 */
	public Long scard(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.scard(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key判断value是否是set中的元素</p>
	 * @param key
	 * @param member
	 * @return
	 */
	public Boolean sismember(String key,String member){
		Jedis jedis = null;
		Boolean res = null;
		try {
			jedis = pool.getResource();
			res = jedis.sismember(key, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取set中随机的value,不删除元素</p>
	 * @param key
	 * @return
	 */
	public String srandmember(String key){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.srandmember(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取set中所有的value</p>
	 * @param key
	 * @return
	 */
	public Set<String> smembers(String key){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.smembers(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key向zset中添加value,score,其中score就是用来排序的</p>
	 * <p>如果该value已经存在则根据score更新元素</p>
	 * @param key
	 * @param scoreMembers
	 * @return
	 */
	public Long zadd(String key,Map<Double, String> scoreMembers){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zadd(key, scoreMembers);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key向zset中添加value,score,其中score就是用来排序的</p>
	 * <p>如果该value已经存在则根据score更新元素</p>
	 * @param key
	 * @param score
	 * @param member
	 * @return
	 */
	public Long zadd(String key,double score,String member){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zadd(key, score, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key删除在zset中指定的value</p>
	 * @param key
	 * @param members 可以使一个string 也可以是一个string数组
	 * @return
	 */
	public Long zrem(String key,String...members){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrem(key, members);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key增加该zset中value的score的值</p>
	 * @param key
	 * @param score
	 * @param member
	 * @return
	 */
	public Double zincrby(String key ,double score ,String member){
		Jedis jedis = null;
		Double res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zincrby(key, score, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回zset中value的排名</p>
	 * <p>下标从小到大排序</p>
	 * @param key
	 * @param member
	 * @return
	 */
	public Long zrank(String key,String member){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrank(key, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回zset中value的排名</p>
	 * <p>下标从大到小排序</p>
	 * @param key
	 * @param member
	 * @return
	 */
	public Long zrevrank(String key,String member){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrevrank(key, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key将获取score从start到end中zset的value</p>
	 * <p>socre从大到小排序</p>
	 * <p>当start为0 end为-1时返回全部</p>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Set<String> zrevrange(String key ,long start ,long end){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrevrange(key, start, end);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回指定score内zset中的value</p>
	 * @param key
	 * @param max
	 * @param min
	 * @return
	 */
	public Set<String> zrangebyscore(String key,String max,String min){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrevrangeByScore(key, max, min);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回指定score内zset中的value</p>
	 * @param key
	 * @param max
	 * @param min
	 * @return
	 */
	public Set<String> zrangeByScore(String key ,double max,double min){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zrevrangeByScore(key,max,min);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>返回指定区间内zset中value的数量</p>
	 * @param key
	 * @param min
	 * @param max
	 * @return
	 */
	public Long zcount(String key,String min,String max){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zcount(key, min, max);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key返回zset中的value个数</p>
	 * @param key
	 * @return
	 */
	public Long zcard(String key){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zcard(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key获取zset中value的score值</p>
	 * @param key
	 * @param member
	 * @return
	 */
	public Double zscore(String key,String member){
		Jedis jedis = null;
		Double res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zscore(key, member);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key删除给定区间内的元素</p>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Long zremrangeByRank(String key ,long start, long end){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zremrangeByRank(key, start, end);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key删除指定score内的元素</p>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public Long zremrangeByScore(String key,double start,double end){
		Jedis jedis = null;
		Long res = null;
		try {
			jedis = pool.getResource();
			res = jedis.zremrangeByScore(key, start, end);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}
	/**
	 * <p>返回满足pattern表达式的所有key</p>
	 * <p>keys(*)</p>
	 * <p>返回所有的key</p>
	 * @param pattern
	 * @return
	 */
	public Set<String> keys(String pattern){
		Jedis jedis = null;
		Set<String> res = null;
		try {
			jedis = pool.getResource();
			res = jedis.keys(pattern);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * <p>通过key判断值得类型</p>
	 * @param key
	 * @return
	 */
	public String type(String key){
		Jedis jedis = null;
		String res = null;
		try {
			jedis = pool.getResource();
			res = jedis.type(key);
		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			e.printStackTrace();
		} finally {
			returnResource(pool, jedis);
		}
		return res;
	}

	/**
	 * 返还到连接池
	 *
	 * @param pool
	 * @param redis
	 */
	public static void returnResource(JedisPool pool, Jedis jedis) {
		if (jedis != null) {
			pool.returnResource(jedis);
		}
	}
}
时间: 2024-12-29 11:10:26

jedis使用线程池封装redis基本操作的相关文章

epoll+线程池 封装

dwsocket.h #pragma once #include <string> #include <sys/epoll.h> #include <pthread.h> #include<condition_variable> #include <queue> #include<stdlib.h> namespace dw { using namespace std; class Addr { public: uint16_t po

6.如何使用jedis的线程池

Basic usage example using Jedis in a multithreaded environment You shouldn't use the same instance from different threads because you'll have strange errors. And sometimes creating lots of Jedis instances is not good enough because it means lots of s

Linux组件封装(七)——线程池的简单封装

线程池的封装,基础思想与生产者消费者的封装一样,只不过我们是将线程池封装为自动获取任务.执行任务,让用户调用相应的接口来添加任务. 在线程池的封装中,我们同样需要用到的是MutexLock.Condition.Thread这些基本的封装. 基础封装如下: MutexLock: 1 #ifndef MUTEXLOCK_H 2 #define MUTEXLOCK_H 3 4 #include "NonCopyable.h" 5 #include <pthread.h> 6 #i

使用C++11封装线程池ThreadPool

读本文之前,请务必阅读: 使用C++11的function/bind组件封装Thread以及回调函数的使用 Linux组件封装(五)一个生产者消费者问题示例   线程池本质上是一个生产者消费者模型,所以请熟悉这篇文章:Linux组件封装(五)一个生产者消费者问题示例. 在ThreadPool中,物品为计算任务,消费者为pool内的线程,而生产者则是调用线程池的每个函数. 搞清了这一点,我们很容易就需要得出,ThreadPool需要一把互斥锁和两个同步变量,实现同步与互斥. 存储任务,当然需要一个

蚂蚁金服经典技术面试题:Tomcat+Redis+线程池与锁+MQ实现

一面:技术面 1.讲一下项目 2.做的主要是Java对吧,讲一下多线程把,用到哪些写一下 3.写了thread和runnable,然后写了线程池,又问了线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些. 4.什么时候多线程会发生死锁,写一个例子吧,然后我写了一个两个线程,两个锁,分别持有一个,请求另一个的死锁实例. 5.集合类熟悉吧,写一个题目,一个字符串集合,找出pdd并且删除. 6.然后说一下Redis吧,是单线程还是多线程,Redis的分布式怎么做? 7.RPC了解么,

python 之路11 进程池,线程池

1.线程 基本使用 创建线程 import threading # def f1(arg): # print(arg) # # t = threading.Thread(target=f1,args=(123,)) # t.start() # class Mythread(threading.Thread): # def __init__(self,func,arg): # self.func = func # self.arg = arg # super(Mythread,self).__in

记5.28大促压测的性能优化&mdash;线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里

记5.28大促压测的性能优化—线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里

如何合理地估算线程池大小?

本文转自:http://ifeve.com/how-to-calculate-threadpool-size/ 如何合理地估算线程池大小? 这个问题虽然看起来很小,却并不那么容易回答.大家如果有更好的方法欢迎赐教,先来一个天真的估算方法:假设要求一个系统的 TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s.那么 问题转化为: 如何设计