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实例而且是完全互相独立, ...
随机推荐
- git 保存用户名密码
打开本地的.git/config 加入 [credential] helper = store 保存,第一次需要输入用户名密码,输入一次密码后第二次就会记住密码了不会再提示输入用户名及密码
- 查看一个目录是否已经mount --bind
执行 mountpoint -q /test/mount echo $? 如果是0表示已经mount mountpoint -q /test/mount || mount -o bind /some/ ...
- 第八周(1) Word信函与邮件
第八周(1) Word信函与邮件 教学时间 2013-4-15 教学课时 2 教案序号 13 教学目标 1.学会使用word制作信封和标签2.理解邮件合并的概念和功能3.学会利用邮件合并批量制作文档 ...
- Excel常用快捷键大全
一.关于处理工作表的快捷键总结 1.插入新工作表 Shift+F11或Alt+Shift+F1 2.移动到工作簿中的下一张工作表 Ctrl+PageDown 3.移动到工作簿中的上一张工作表 Ctrl ...
- poj 1664 放苹果(递推)
题目链接:http://poj.org/problem? id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- Eclipse使用Maven创建Dynamic Web Project
1. 点击File->New->Other,在弹出的对话框中选择Maven->Maven Project: 2. 点击Next,选择maven-archetype-webapp: 3 ...
- Mongostat 3.0详解
可以参考之前写的这篇博客: Mongostat 2.6详解 mapped Changed in version 3.0.0. Only for MMAPv1 Storage Engine. The t ...
- QT Creator 环境使用 remote debug 调试 arm 程序
这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功.没有调试手段比较痛苦,今天又花了点时间,居然搞定了.粗做记录. 工具版本: 1. QtCrea ...
- 阅读《Android 从入门到精通》(9)——多项选择
多项选择(CheckBox) CheckBox 类是 Button 的子类,层次关系例如以下: android.widget.Button android.widget.CompoundButton ...
- Mac下Android绘制点9格式png以及解决IllegalArgumentException: Unknown image type 0报错
在Mac下的AndroidStudio中,右键png图片选择“create 9-patch-file”时会报错:IllegalArgumentException: Unknown image type ...