Jedis工具类(含分布式锁的调用和释放)
个人把工具类分为两部分:
一、连接池部分
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*; import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class JedisPoolUtil {
protected static Logger logger = LoggerFactory.getLogger(JedisPoolUtil.class); public static JedisPool jedisPool = null;
private String host;
private int port;
private int maxTotal;
private int maxIdle;
private int minIdle;
private boolean blockWhenExhausted;
private int maxWaitMillis;
private boolean testOnBorrow;
private boolean testOnReturn; public static Lock lock = new ReentrantLock(); private void initialConfig() {
try {
InputStream stream = JedisUtilBak.class.getClassLoader().getResourceAsStream("config.properties");
Properties prop = new Properties();
prop.load(stream);
host = prop.getProperty("redis.host");
port = Integer.parseInt(prop.getProperty("redis.port")); maxTotal = Integer.parseInt(prop.getProperty("redis.maxTotal"));
maxIdle = Integer.parseInt(prop.getProperty("redis.maxIdle"));
minIdle = Integer.parseInt(prop.getProperty("redis.minIdle"));
blockWhenExhausted = Boolean.parseBoolean(prop.getProperty("redis.blockWhenExhausted"));
maxWaitMillis = Integer.parseInt(prop.getProperty("redis.maxWaitMillis"));
testOnBorrow = Boolean.parseBoolean(prop.getProperty("redis.testOnBorrow"));
testOnReturn = Boolean.parseBoolean(prop.getProperty("redis.testOnReturn")); // boolean testWhileIdle = Boolean.parseBoolean(prop.getProperty("redis.testWhileIdle"));
// int timeBetweenEvictionRunsMillis = Integer.parseInt(prop.getProperty("redis.timeBetweenEvictionRunsMillis"));
// int minEvictableIdleTimeMillis = Integer.parseInt(prop.getProperty("redis.minEvictableIdleTimeMillis"));
// int numTestsPerEvictionRun = Integer.parseInt(prop.getProperty("redis.numTestsPerEvictionRun"));
} catch (Exception e) {
logger.debug("parse configure file error.");
}
} /**
* initial redis pool
*/
private void initialPool() {
if (lock.tryLock()) {
lock.lock();
initialConfig();
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(maxTotal);
config.setMaxIdle(maxIdle);
config.setMaxWaitMillis(maxWaitMillis);
config.setTestOnBorrow(testOnBorrow);
jedisPool = new JedisPool(config, host, port);
} catch (Exception e) {
logger.debug("init redis pool failed : {}", e.getMessage());
} finally {
lock.unlock();
}
} else {
logger.debug("some other is init pool, just wait 1 second.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} } public Jedis getJedis() { if (jedisPool == null) {
initialPool();
}
try {
return jedisPool.getResource();
} catch (Exception e) {
logger.debug("getJedis() throws : {}" + e.getMessage());
}
return null;
} public Pipeline getPipeline() {
BinaryJedis binaryJedis = new BinaryJedis(host, port);
return binaryJedis.pipelined();
} }
二、操作方法部分
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple; import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock; public class JedisUtil {
protected static Logger logger = LoggerFactory.getLogger(JedisUtil.class);
public static ReentrantLock lock = new ReentrantLock();
private final String DIST_LOCK_SUCCESS = "OK";
private final Long DIST_LOCK_RELEASE_SUCCESS = 1L;
private final String SET_IF_NOT_EXIST = "NX";
private final String SET_WITH_EXPIRE_TIME = "PX";
private JedisPoolUtil jedisPool = new JedisPoolUtil(); public boolean setString(String key, String value) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.set(key, value);
return true;
} catch (Exception e) {
logger.debug("setString() key {} throws:{}", key, e.getMessage());
return false;
} finally {
close(jedis);
}
} public boolean setStringEx(String key, int seconds, String value) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.setex(key, seconds, value);
return true;
} catch (Exception e) {
logger.debug("setStringEx() key {} throws:{}",key, e.getMessage());
return false;
} finally {
close(jedis);
}
} public String getString(String key) {
Jedis jedis = jedisPool.getJedis();
try {
return jedis.get(key);
} catch (Exception e) {
logger.debug("getString() key {} throws:{}", key,e.getMessage());
return null;
} finally {
close(jedis);
}
} public boolean delString(String key) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.del(key);
return true;
} catch (Exception e) {
logger.debug("delString() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public boolean delHash(String key, String mKey) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.hdel(key, mKey);
return true;
} catch (Exception e) {
logger.debug("setHash() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public boolean setHash(String key, String mKey, String mVal) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.hset(key, mKey, mVal);
return true;
} catch (Exception e) {
logger.debug("setHash() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public String getHash(String key, String mKey) {
Jedis jedis = jedisPool.getJedis();
try {
return jedis.hget(key, mKey);
} catch (Exception e) {
logger.debug("setHash() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public boolean setHashMulti(String key, Map<String, String> map) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.hmset(key, map);
return true;
} catch (Exception e) {
logger.debug("setMHash() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public List<String> getHashMulti(String key, String[] members) {
Jedis jedis = jedisPool.getJedis();
try {
return jedis.hmget(key, members);
} catch (Exception e) {
logger.debug("getHashMulti() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public List<String> getHashValsAll(String key) {
Jedis jedis = jedisPool.getJedis();
try {
return jedis.hvals(key);
} catch (Exception e) {
logger.debug("getHashValsAll() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public Set<String> getHashKeysAll(String key) {
Jedis jedis = jedisPool.getJedis();
try {
return jedis.hkeys(key);
} catch (Exception e) {
logger.debug("getHashValsAll() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public boolean addScoreSet(String key, String mKey, int score) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.zadd(key, score, mKey);
return true;
} catch (Exception e) {
logger.debug("addScoreSet() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public boolean delScoreSet(String key, String mKey) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.zrem(key, mKey);
return true;
} catch (Exception e) {
logger.debug("delScoreSet() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public boolean changeScoreSet(String key, String mKey, int score) {
Jedis jedis = jedisPool.getJedis();
try {
jedis.zincrby(key, score, mKey);
return true;
} catch (Exception e) {
logger.debug("changeScoreSet() key {} throws:{}", key,e.getMessage());
return false;
} finally {
close(jedis);
}
} public Set<String> listScoreSetString(String key, int start, int end, boolean asc) {
Jedis jedis = jedisPool.getJedis();
try {
if (asc) {
return jedis.zrange(key, start, end);
} else {
return jedis.zrevrange(key, start, end);
}
} catch (Exception e) {
logger.debug("listScoreSetString() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public Set<Tuple> listScoreSetTuple(String key, int start, int end, boolean asc) {
Jedis jedis = jedisPool.getJedis();
try {
if (asc) {
return jedis.zrangeWithScores(key, start, end);
} else {
return jedis.zrevrangeWithScores(key, start, end);
}
} catch (Exception e) {
logger.debug("listScoreSetString() key {} throws:{}", key,e.getMessage());
} finally {
close(jedis);
}
return null;
} public boolean getDistributedLock(String lockKey, String requestId, int expireTime) {
Jedis jedis = jedisPool.getJedis();
try {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (DIST_LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
} catch (Exception e) {
// logger.debug("getDistributedLock key {} throws:{}", lockKey, e.getMessage());
logger.debug("getDistributedLock throws {}", e);
} finally {
close(jedis);
}
return false;
} public boolean releaseDistributedLock(String lockKey, String requestId) {
Jedis jedis = jedisPool.getJedis();
try {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (DIST_LOCK_RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
} catch (Exception e) {
logger.debug("releaseDistributedLock throws {}", e.getMessage());
} finally {
close(jedis);
}
return false; } public void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
Jedis工具类(含分布式锁的调用和释放)的更多相关文章
- Jedis工具类代码
安装Redis可以参考 https://www.cnblogs.com/dddyyy/p/9763098.html Redis的学习可以参考https://www.cnblogs.com/dddyyy ...
- Memcached的配置,SSH项目中的整合(com.whalin),Memcached工具类,Memcached的代码调用
1 修改pom.xml,添加依赖文件: <dependency> <groupId>com.whalin</groupId> <artifactId&g ...
- Jedis工具类
1.RedisCache.java package cn.itcast.mybatis.dao; import java.util.Date;import java.util.HashMap;impo ...
- Java Redis 连接池 Jedis 工具类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import re ...
- Jedis 工具类
package com.pig4cloud.pigx.admin.utils; import redis.clients.jedis.*; import java.util.ArrayList; im ...
- 2020最新的Spring Boot 分布式锁的具体实现(内附代码)
前言 面试总是会被问到有没有用过分布式锁.redis 锁,大部分读者平时很少接触到,所以只能很无奈的回答 "没有".本文通过 Spring Boot 整合 redisson 来实现 ...
- Jedis 操作 Redis 工具类
配置类 pom.xml pom.xml 里配置依赖 <dependency> <groupId>redis.clients</groupId> <artifa ...
- Spring普通类/工具类获取并调用Spring service对象的方法
参考<Spring普通类获取并调用Spring service方法>,网址:https://blog.csdn.net/jiayi_0803/article/details/6892455 ...
- Redis 4.0.2分布式锁的Java实现
简介 Redis分布式锁算法有两种,一种是单个Redis实例下的,一种是多个Redis实例的Redlock算法. 官方推荐Redlock算法,但是这个算法需要比较多的Redis实例而且是完全互相独立, ...
随机推荐
- 解决Android Studio无法下载sdk的问题
因为google被墙了,android sdk无法下载.然后各种百度,都是说让设置代理,给的代理地址一般都是用的下面这个代理服务器: 大连东软信息学院镜像服务器地址: mirrors.neusoft. ...
- iOS 画虚线
UIImageView *imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )]; [self.view addSubvi ...
- LintCode: Maximum Subarray
1. 暴力枚举 2. “聪明”枚举 3. 分治法 分:两个基本等长的子数组,分别求解T(n/2) 合:跨中心点的最大子数组合(枚举)O(n) 时间复杂度:O(n*logn) class Solutio ...
- LintCode: Count and Say
C++ class Solution { public: /** * @param n the nth * @return the nth sequence */ string countAndSay ...
- PHP http_build_query()方法
http_build_query (PHP 5) http_build_query -- 生成 url-encoded 之后的请求字符串描述 string http_build_query ( arr ...
- Asp.NET MVC 之 调试访问 webservice 时出现“ 无法找到资源 ”的错误
问题情景如标题,具体错误如下图: 出现以上情况,是程序将 .asmx 文件按控制器方式解析了,在 RouteConfig.cs 文件的 RegisterRoutes 方法中忽略 .asmx 文件,&q ...
- mysqld.exe
mysqld.exe是mysql的服务端程序,开启之后才能使用mysql.exe 将mysql安装成服务很简单: mysqld.exe install mysql 删除服务也很简单: sc delet ...
- sharepoint 2010 怎样在Ribbon区加入功能button
继续前面的一篇博客,sharepoint 2010 怎样在列表中加入功能菜单操作项.这次主要是记录下,在Ribbon区域加入功能button.比如加入收藏button.例如以下图所看到的: 1. 还是 ...
- GDB和GDB Server
gdb是linux c编程标配的调试工具,平时接触比较多的可能是本机随gcc一起安装的调试工具.但是,即使是本机的gdb,也经常被printf代替,所以接触也仅限于知道. 简单程序固然可以用print ...
- unique_ptr与std::move的使用
形参为unique_ptr u2,而后实参为std::move(unique_ptr u1),这样会将原本u1的内存传递给u2,避免了传递拷贝.例如: void fun(std::unique_ptr ...