`

redis 实现分布式锁以及测试

 
阅读更多

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);

}

}

 

}

 

 

 

 

分享到:
评论

相关推荐

    Go-用Redis实现分布式锁与实现任务队列

    本篇文章将深入探讨如何利用Redis实现分布式锁以及如何构建一个基于Redis的任务队列。 分布式锁是解决多节点共享资源时防止数据冲突的关键机制。在Go中,我们通常通过与Redis交互来实现这一功能。Redis提供了`SETNX...

    基于go和redis实现分布式锁

    本文将深入探讨如何使用Go语言(Golang)和Redis来实现分布式锁,并介绍其中涉及到的关键概念和实现方式,包括看门狗(Watchdog)和红锁(RedLock)策略。 **一、Redis作为分布式锁** Redis因其高性能、轻量级以及...

    基于redis的分布式锁

    Redis,一个高性能的键值数据库,常被用作实现分布式锁的工具,因其内存存储特性提供了高速读写性能以及丰富的数据结构支持。 标题"基于redis的分布式锁"指出了我们将探讨如何使用Redis来构建分布式锁。Redis提供了...

    redis分布式锁.zip

    在压缩包文件"redis分布式锁"中,可能包含了关于如何在实际项目中使用 Redis 实现分布式锁的示例代码、配置文件、测试用例等内容。这些资料可以帮助开发者更深入地理解和实践 Redis 分布式锁的实现,提升系统的并发...

    基于redis的分布式session实现

    Redis是一种高性能的键值存储系统,常被用作数据缓存、消息中间件以及分布式锁等场景。由于其支持网络通信且操作速度快,非常适合用来存储和共享Session数据。 首先,让我们来了解如何配置基于Redis的分布式Session...

    人工智能-项目实践-redis-基于 Redis 实现的分布式锁.zip

    人工智能-项目实践-redis-基于 Redis 实现的分布式锁 redis-lock 基于 Redis 实现的分布式锁。要求: Redis &gt;= v7: 理论上来说低于 Redis 7 的也可以,但是暂时我还没在这些 Redis 版本上测试 Go &gt;= 18: 低版本的 ...

    redisson实现分布式锁

    Redisson的分布式锁是基于Redis实现的,利用Redis的高可用性、低延迟以及丰富的数据结构特性,可以有效地解决分布式环境下的锁问题。Redisson通过命令行接口(Command)将Java方法映射到Redis操作上,这样我们就可以...

    基于Redis实现的分布式锁【100012506】

    在实现分布式锁时,我们主要利用其原子操作(如`SET`、`GET`、`EXPIRE`、`DEL`)和事务(transactions)特性。 **分布式锁的基本原理:** 1. **锁定操作**:客户端尝试用一个唯一的标识(例如,UUID)作为键,设置...

    redis-demo:用redis实现分布式锁、限流

    本项目“redis-demo”演示了如何使用 Redis 和 Java 客户端库 lettuce 实现分布式锁。 1. **Redis 作为分布式锁** - **原子操作**:Redis 的命令执行是原子性的,这意味着多个客户端可以同时操作 Redis 且不会出现...

    redis分布式锁工具包提供纯Java方式调用

    Redis 分布式锁工具包是Java开发者在处理高并发、多节点系统中实现锁机制的一种高效解决方案。这个工具包提供了一种纯Java的调用方式,使得开发者无需深入理解Redis命令,也能便捷地在应用程序中集成分布式锁功能。...

    Redis从入门到精通(八)Redis实战(五)分布式锁误删与原子性问题、Redisson 测试项目代码

    然而,使用Redis实现分布式锁时,可能会遇到误删问题。例如,一个节点意外地删除了仍在使用的锁,这可能导致数据不一致性和系统故障。为防止这种情况,我们需要引入超时机制。在设置锁时,我们可以为锁设定一个过期...

    基于redis和lua脚本的分布式锁的实现

    基于Redis和Lua脚本的分布式锁的实现是使用Redis和Lua脚本来实现分布式锁的技术。分布式锁是指在分布式系统中,多个节点之间需要协调和同步的机制,以避免同时访问共享资源的竞争问题。Redis是一个开源的、基于内存...

    基于 Redis 官方分布式锁文章的 Python +源代码+文档说明

    网络上有非常多关于分布式锁具体实现的文章和案例,其中基于 Redis 和 Python 的也不少;综合多方意见 我认为 Redis 官方提出的 Redlock 是一种很有意义的分布式锁实现方式,接着参考了 SPSCommerce 团队的实现 ...

    redis分布式锁

    Redis作为一款高性能的键值存储数据库,常被用来实现分布式锁,因其具备快速读写、原子操作等特性。在这个场景中,我们看到的"redis分布式锁"可能是一个实际应用于生产环境的解决方案。 首先,让我们来了解分布式锁...

    Redis分布式锁解决接口幂等的两种方案

    ### 二、Redis实现分布式锁 1. **基础原理**: - 使用`SETNX`命令尝试设置键,如果键不存在则设置成功,否则失败。这确保了锁的互斥性。 - 为防止锁未被释放导致死锁,通常会设置键的过期时间,如使用`PEXPIRE`...

    基于Redis的分布式锁的简单实现方法

    最后,使用Redis实现分布式锁时,需要结合具体业务场景选择合适的实现策略,并进行充分的测试,以确保系统的稳定性和可靠性。在生产环境中,还可以考虑使用已经封装好的成熟的分布式锁库,如Redlock等,它们提供了更...

    Redission分布式锁-本地单机Redis实战-springboot-redis-lock.zip

    4. **Redission实现分布式锁**:Redisson提供了RLock接口,它是Java Lock接口的实现,可以创建可重入的分布式锁。通过`RLock lock = redisson.getLock("myLock");`获取锁,然后`lock.lock();`锁定,`lock.unlock();`...

Global site tag (gtag.js) - Google Analytics