前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis分布式锁的应用场景有哪些_分布式锁使用场景举例

redis分布式锁的应用场景有哪些_分布式锁使用场景举例

作者头像
全栈程序员站长
发布2022-10-02 16:54:38
1.1K0
发布2022-10-02 16:54:38
举报

大家好,又见面了,我是你们的朋友全栈君。

为什么需要分布式锁

分布式锁是实现用户进程同步的一种方式,需要注意的是,Redis是分布式锁实现的一种技术,而不是作用对象

多用户进程请求服务的场景很多,为什么分布式锁并不普遍应用?首先需要定义一下分布式锁的原理和使用场景

使用场景

原子锁—线程同步,一个程序下的多线程之间对于共享变量进行同步,如计数器

分布式锁—进程同步,集群下的多服务进程之间对于共享资源进行同步,如数据库

redis分布式锁的应用场景有哪些_分布式锁使用场景举例
redis分布式锁的应用场景有哪些_分布式锁使用场景举例

可以明确的是数据库已经实现这种“锁”的机制了,因为它的事务锁机制,虽然多个用户I/O之间会出现数据短暂的不一致,长期还是可以保证数据一致性的

不需要进程同步的场景:因为多个用户进程的请求是相对独立的,不受彼此影响或影响不大的(两个都不是持久化请求,即写+写),例如,A开放权限B访问页面属于写+读,同时搜索信息属于读+读

需要进程同步的场景:多个用户进程的请求是互相影响的(两个都是持久化请求,写+写),例如,秒杀系统防止超卖,占位抢票

Redis加锁

需要满足以下特性,因此用到两个命令

独占性:如果锁已经被占用,线程需要阻塞等待—setnx

时效性:锁超过一定时间自动释放—setex

对于共享的Jedis连接,操作需要原子性:

jedis.set(KEY,VALUE,”NX”,”PX”,EXPIRE_TIME);

KEY—锁的密钥

VALUE—用户请求ID/线程ID

“NX”—setnx

“PX”—setex

EXPIRE_TIME—失效时间

代码示例

代码语言:javascript
复制
    private static final String LOCK_SUCCESS = "OK";

    public static boolean lock(Jedis jedis,String KEY,String VALUE,int EXPIRE_TIME) {
        String success = jedis.set(KEY, VALUE, "NX", "PX", EXPIRE_TIME);
        return LOCK_SUCCESS.equals(success);
    }

Redis解锁

需要解决一个问题,因此用到两个命令

避免误删:进程A超时,锁被释放,进程B获得锁,此时进程A删除了KEY,解决方法“解铃还须系铃人”,需要校验传入的VALUE,即用户请求ID,伪代码if get(KEY)=VALUE then del(KEY)

同样地,需要通过一个Jedis的命令实现原子性

jedis.eval(SCRIPT, KEY, VALUE);

SCRIPT—LUA脚本来完成KEY-VALUE校验和删除KEY两个步骤,保证原子性

KEY—锁的密钥

VALUE—用户请求ID/线程ID

代码示例

代码语言:javascript
复制
private static final Long RELEASE_SUCCESS = 1L;

public static boolean release(Jedis jedis,String KEY,String VALUE) {
    String script="if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    Object success = jedis.eval(script, Collections.singletonList(KEY),Collections.singletonList(VALUE));
    return RELEASE_SUCCESS.equals(success);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197874.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月3日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要分布式锁
  • 使用场景
  • Redis加锁
  • Redis解锁
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档