1.准备jar包
compile group: 'redis.clients', name: 'jedis', version: '2.8.1'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.4.2'
2. 建立连接池:
package com.aebiz.redis;
import com.aebiz.bas.util.ftp.FtpResource;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public final class RedisUtil {
// //Redis服务器IP
private static String ADDR = "192.168.1.24";
//
// //Redis的端口号
private static int PORT = 6379;
//访问密码
private static String AUTH = "admin";
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 200;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 50;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲连接数
config.setMaxIdle(MAX_IDLE);
config.setMaxTotal(MAX_ACTIVE);
// config.setMaxWait(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
// config.setTestOnBorrow(false);
// config.setTestOnReturn(false);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
//重新连接
repeatConn();
Jedis resource = jedisPool.getResource();
return resource;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* redis 3.0 以下
* 释放jedis资源
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
//redis 3.0 以上
public static void backResource(final Jedis jedis) {
if (jedis != null && jedis.isConnected()) {
jedis.close();
}
}
public static void repeatConn(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(MAX_IDLE);
config.setMaxTotal(MAX_ACTIVE);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
}
}
3.客户端封装
package com.aebiz.redis;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.aebiz.auction.model.AuctionInfo;
import com.aebiz.pub.logs.PubLogs;
import net.sf.json.JSONArray;
import redis.clients.jedis.Jedis;
public class RedisClient {
private Jedis jedis;
public RedisClient() {
jedis = RedisUtil.getJedis();
}
public void close() {
if (null != jedis && jedis.isConnected()) {
jedis.close();
}
}
public long disLock(String key, String value) {
long result = 0;
StringBuffer lock = new StringBuffer();
result = jedis.setnx(key, value);
lock.append("key=").append(key);
lock.append(";lockstatus=").append(result);
// 获取锁后,设置锁失效时间
if (result > 0) {
// 设定锁存在30秒
long time = jedis.expire(key, 30);
lock.append(";lockTime=").append(time);
}
PubLogs.systemLogInfo(lock, null);
return result;
}
// 删除lock
public long delLock(String key) {
StringBuffer lock = new StringBuffer(key);
lock.append(";delLock");
PubLogs.systemLogInfo(lock, null);
return jedis.del(key);
}
public List<AuctionInfo> getList(String key) {
List<String> list = jedis.lrange(key, 0, 1);
if (null != list && list.size() > 0) {
@SuppressWarnings("unchecked")
Collection<AuctionInfo> cc = JSONArray.toCollection(JSONArray.fromObject(list.get(0)), AuctionInfo.class);
ArrayList<AuctionInfo> ll = new ArrayList<AuctionInfo>(cc);
return ll;
// return JSONArray.toList(JSONArray.fromObject(list.get(0)),
// AuctionInfo.class);
}
return null;
}
public void setList(String key, List<AuctionInfo> list) {
StringBuffer sbf = new StringBuffer(key);
sbf.append("key=").append(key);
// 对象转String
String strings = JSONArray.fromObject(list).toString();
sbf.append(";obj=").append(strings);
// 清楚缓存
long del = jedis.del(key);
sbf.append(";delstatus=").append(del);
// 放入缓存
long len = jedis.rpush(key, strings);
sbf.append(";len=").append(len);
PubLogs.systemLogInfo(sbf, null);
}
//模拟获取锁后,工作
public void waitLock(String key) {
int times = 0;//重试获取锁次数
while (times < 10) {
long res = disLock(key, "lock");
if (res > 0) {
System.out.println("处理业务信息");
times = 10;
delLock(key);
}else{
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
times++;
System.out.println("times---------------" + times);
}
}
System.out.println("-------------end=======");
}
//模拟插入数据,查询数据
public void test() {
long start = Calendar.getInstance().getTimeInMillis();
ExecutorService exe = Executors.newFixedThreadPool(80);
for (int j = 0; j < 20; j++) {
final int step = j;
exe.submit(new Runnable() {
@Override
public void run() {
RedisClient client = new RedisClient();
String key = "123456721ff";
List<AuctionInfo> list = new ArrayList<AuctionInfo>();
for (int i = 0; i < 6; i++) {
AuctionInfo auctionInfo = new AuctionInfo();
auctionInfo.setId("1" + i);
auctionInfo.setGoodsNo("goods" + i);
auctionInfo.setGoodsName("商品名称" + i);
list.add(auctionInfo);
}
client.setList(key, list);
List<AuctionInfo> result = client.getList(key);
for (AuctionInfo item : result) {
System.out.print(item.getId() + "--" + item.getGoodsNo());
}
System.out.println("===" + step);
client.close();
}
});
}
exe.shutdown();
long end = Calendar.getInstance().getTimeInMillis();
System.out.println("time:" + (end - start));
}
public static void main(String[] args) {
for(int i=0;i<6;i++){
RedisClient client = new RedisClient();
client.waitLock("qwe123");
client.close();
System.out.println("=============================="+i);
}
}
}
相关推荐
本篇文章将深入探讨如何利用Redis实现分布式锁以及如何构建一个基于Redis的任务队列。 分布式锁是解决多节点共享资源时防止数据冲突的关键机制。在Go中,我们通常通过与Redis交互来实现这一功能。Redis提供了`SETNX...
本文将深入探讨如何使用Go语言(Golang)和Redis来实现分布式锁,并介绍其中涉及到的关键概念和实现方式,包括看门狗(Watchdog)和红锁(RedLock)策略。 **一、Redis作为分布式锁** Redis因其高性能、轻量级以及...
Redis,一个高性能的键值数据库,常被用作实现分布式锁的工具,因其内存存储特性提供了高速读写性能以及丰富的数据结构支持。 标题"基于redis的分布式锁"指出了我们将探讨如何使用Redis来构建分布式锁。Redis提供了...
在压缩包文件"redis分布式锁"中,可能包含了关于如何在实际项目中使用 Redis 实现分布式锁的示例代码、配置文件、测试用例等内容。这些资料可以帮助开发者更深入地理解和实践 Redis 分布式锁的实现,提升系统的并发...
Redis是一种高性能的键值存储系统,常被用作数据缓存、消息中间件以及分布式锁等场景。由于其支持网络通信且操作速度快,非常适合用来存储和共享Session数据。 首先,让我们来了解如何配置基于Redis的分布式Session...
人工智能-项目实践-redis-基于 Redis 实现的分布式锁 redis-lock 基于 Redis 实现的分布式锁。要求: Redis >= v7: 理论上来说低于 Redis 7 的也可以,但是暂时我还没在这些 Redis 版本上测试 Go >= 18: 低版本的 ...
Redisson的分布式锁是基于Redis实现的,利用Redis的高可用性、低延迟以及丰富的数据结构特性,可以有效地解决分布式环境下的锁问题。Redisson通过命令行接口(Command)将Java方法映射到Redis操作上,这样我们就可以...
在实现分布式锁时,我们主要利用其原子操作(如`SET`、`GET`、`EXPIRE`、`DEL`)和事务(transactions)特性。 **分布式锁的基本原理:** 1. **锁定操作**:客户端尝试用一个唯一的标识(例如,UUID)作为键,设置...
本项目“redis-demo”演示了如何使用 Redis 和 Java 客户端库 lettuce 实现分布式锁。 1. **Redis 作为分布式锁** - **原子操作**:Redis 的命令执行是原子性的,这意味着多个客户端可以同时操作 Redis 且不会出现...
Redis 分布式锁工具包是Java开发者在处理高并发、多节点系统中实现锁机制的一种高效解决方案。这个工具包提供了一种纯Java的调用方式,使得开发者无需深入理解Redis命令,也能便捷地在应用程序中集成分布式锁功能。...
然而,使用Redis实现分布式锁时,可能会遇到误删问题。例如,一个节点意外地删除了仍在使用的锁,这可能导致数据不一致性和系统故障。为防止这种情况,我们需要引入超时机制。在设置锁时,我们可以为锁设定一个过期...
基于Redis和Lua脚本的分布式锁的实现是使用Redis和Lua脚本来实现分布式锁的技术。分布式锁是指在分布式系统中,多个节点之间需要协调和同步的机制,以避免同时访问共享资源的竞争问题。Redis是一个开源的、基于内存...
网络上有非常多关于分布式锁具体实现的文章和案例,其中基于 Redis 和 Python 的也不少;综合多方意见 我认为 Redis 官方提出的 Redlock 是一种很有意义的分布式锁实现方式,接着参考了 SPSCommerce 团队的实现 ...
Redis作为一款高性能的键值存储数据库,常被用来实现分布式锁,因其具备快速读写、原子操作等特性。在这个场景中,我们看到的"redis分布式锁"可能是一个实际应用于生产环境的解决方案。 首先,让我们来了解分布式锁...
### 二、Redis实现分布式锁 1. **基础原理**: - 使用`SETNX`命令尝试设置键,如果键不存在则设置成功,否则失败。这确保了锁的互斥性。 - 为防止锁未被释放导致死锁,通常会设置键的过期时间,如使用`PEXPIRE`...
最后,使用Redis实现分布式锁时,需要结合具体业务场景选择合适的实现策略,并进行充分的测试,以确保系统的稳定性和可靠性。在生产环境中,还可以考虑使用已经封装好的成熟的分布式锁库,如Redlock等,它们提供了更...
4. **Redission实现分布式锁**:Redisson提供了RLock接口,它是Java Lock接口的实现,可以创建可重入的分布式锁。通过`RLock lock = redisson.getLock("myLock");`获取锁,然后`lock.lock();`锁定,`lock.unlock();`...