Redis分布式锁

Redis分布式锁

Jedis-lock

简介

  • Jedis-lock is easy to use and simple implementation of distributed lock using Redis database and Jedis driver.

Jedis-lock 是简单的被使用,而且是使用redis数据库和jedis驱动实现分布式锁的一种简单实现

原理

  • 方法上加锁synchronized,每次传入key,会将key进行setnx操作,SETNX 是[SET if Not eXists] (如果不存在,则 SET)的简写。
  • 返回值:

    设置成功,返回 1 。

    设置失败,返回 0 。

  • 上锁之后进行业务操作,操作完成释放锁,其实就是del key 操作.

代码实现

Jedis jedis = new Jedis("39.106.136.84", 6379);
/**
 * @param jedis 连接
 * @param lockKey lock key (ex. account:1, ...) 锁名称
 * @param timeoutSecs acquire timeout in miliseconds (default: 10000 msecs) 获取锁的超时时间10s
 * @param expireMsecs lock expiration in miliseconds (default: 60000 msecs) 锁的过期时间60s
 */
JedisLock lock = new JedisLock(jedis, "lockname", 10000, 30000);
lock.acquire();
try {
    // 业务逻辑
} finally {
    lock.release();
}

https://github.com/abelaska/jedis-lock/blob/master/README.md

Redis-lock

 简介

  • Raddison provides a distributed implementation of reentrant java.util.concurrent.locks.Lock with TTL support and could provide pointers for a generic implementation.

Raddison提供了一个可重入的java.util.concurrent.locks的分布式实现。锁被TTL支持,并可以为通用实现提供指针。

原理

  • setex 将值 value 关联到 key ,并将 key 的生存时间设为xx seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。
  • 这个命令类似于以下两个命令:

    SET key value

    EXPIRE key seconds # 设置生存时间

  • 不同之处是, SETEX是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

    eg: setex  key  expiretime  value;

代码实现

@Autowired
StringRedisTemplate template;

@RequestMapping(value = "/redis")
public void redis() {
/*
 * 锁:(ECPS:aaa,"\tweifan-PC\x03aaa\x14http-nio-5555-exec-1\x00\x00\x01b\x89l\xe21")
 */
RedisLockRegistry lockRegistry = new RedisLockRegistry(template.getConnectionFactory(), "ECPS");
Lock lock = lockRegistry.obtain("aaa");
try {
    lock.lock();// 获取到锁
    // 执行业务
} catch (Exception e) {
    // 异常处理
} finally {
    lock.unlock();// 释放锁
}
}

https://jira.spring.io/browse/DATAREDIS-368

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值