《Redis应用实例》Java实现(3):用 Redis 实现分布式锁

57 阅读1分钟

本章代码演示了使用 Redis 实现分布式锁。 通过 Redis 的 SET 命令(带 NX 和 EX 选项)实现基本的分布式锁功能,演示了锁的获取、锁的互斥性以及锁的超时释放机制。

✅ Chapter3:锁

package com.foxbill.redisinaction;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

/**
 * 用redis实现锁
 */
public class Chapter3 {
    public static void start(Jedis jedis) {
        lock(jedis);
    }

    //加锁。核心要点: setnx(原子操作) 加超时(防止死锁)
    private static void lock(Jedis jedis) {
        String key="chapter3:lock";
        String value1 = "lock value1";
        String value2 = "lock value2";
        long expireSeconds = 10; // 10秒后过期
        try {
            String result = jedis.set(key, value1, SetParams.setParams().nx().ex(expireSeconds));
            System.out.println("- set结果: " + (result != null ? "value1成功设置" : "键已存在,value1未设置"));

            Thread.sleep(2000);

            String result2 = jedis.set(key, value2, SetParams.setParams().nx().ex(expireSeconds));
            System.out.println("- set结果: " + (result2 != null ? "value2成功设置" : "键已存在,value2未设置"));

            //等待valu1超时失效后,再次设置
            Thread.sleep(11000);

            result2 = jedis.set(key, value2, SetParams.setParams().nx().ex(expireSeconds));
            System.out.println("- set结果: " + (result2 != null ? "value2成功设置" : "键已存在,value2未设置"));

        }catch (Exception e) {
            System.err.println("演示setnx和过期时间设置时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }
}


📌 小结

使用 SETNX 原子操作确保锁的互斥性 设置过期时间防止死锁 通过超时机制自动释放锁