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实例而且是完全互相独立, ...
随机推荐
- Nutch的安装和配置
Nutch是一个Java实现的网络爬虫.Nutch的安装可以使用二进制包,也可以使用源代码安装.这里介绍用二进制包安装. 1. 下载apache-nutch-1.12-bin.tar.gz,并且解压, ...
- Spring MVC 中急速集成 Shiro 实践
相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...
- CENTOS7更换YUM源为163源
访问地址为:http://mirrors.163.com/.help/centos.html 首先备份源: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum. ...
- python模块之HTMLParser抓页面上的所有URL链接
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser抓页面上的所有URL链接 import urllib #MyParse ...
- NRF24L01无线模块的使用
NRF2401芯片pin定义 NRF24L01模块pin定义 VCC 脚接电压范围为 1.9V~3.6V 之间, 不能在这个区间之外, 超过 3.6V 将会烧毁模块, 推荐电压 3.3V 左右 除电源 ...
- ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)
ASP.NET回发数据是通过函数__doPostBack来实现的.该函数在加入了服务端控件,并将AutoPostBack设置为true之后,将自己主动生成,详细能够參看以下的图. watermark/ ...
- ZOJ 1457 Prime Ring Problem(dfs+剪枝)
Prime Ring Problem Time Limit: 10 Seconds Memory Limit: 32768 KB A ring is compose of n circ ...
- 【转载】Mysql主从复制、和MySQL集群(主主复制)
转载:https://www.cnblogs.com/phpstudy2015-6/p/6485819.html 请同时参考和结合这篇文件进行处理:https://blog.csdn.net/envo ...
- 【TP3.2】详解_initialize() 和 __construct() 的区别和联系
1.假设 一个AdminController.class.php 集成至 \Think\Controller 类, 我们来看看Controller.class.php的构造方法源码: /** * 架构 ...
- 首次启动Kafka报Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
首次启动Kafka报错如下: 原因:内存不足,查看启动配置 调小一些: