当前位置: 首页 > news >正文

网站布局分析渠道网络

网站布局分析,渠道网络,外包做的网站,wordpress mysql nghix一. 分布式锁基础 在分布式系统中,当多个客户端(应用实例)需要访问同一资源时,可以使用分布式锁来确保同一时刻只有一个客户端能访问该资源。Redis作为高性能的内存数据库,提供了基于键值对的分布式锁实现&#xff0c…

一. 分布式锁基础

在分布式系统中,当多个客户端(应用实例)需要访问同一资源时,可以使用分布式锁来确保同一时刻只有一个客户端能访问该资源。Redis作为高性能的内存数据库,提供了基于键值对的分布式锁实现,通常采用SETNX命令(即SET if Not eXists)来设置锁。

Redis的分布式锁大致实现流程如下:

  • 客户端请求获取锁:通过SETNX命令设置一个锁键(如lock:<resource>)。
  • 锁被设置成功时,客户端可以访问资源;否则,它会等待或返回获取失败的结果。
  • 客户端在完成工作后,释放锁:通过DEL命令删除锁键。

二. 可重入锁

在一个线程或进程中,如果该线程/进程已经获取了锁,那么它可以重复获取该锁,而不会发生死锁问题。也就是说,同一线程/进程可以多次获取锁,而每次释放锁时都需要释放一次,直到所有的锁请求都被释放。

对于分布式系统中的可重入锁,它确保:

  • 当一个客户端(通常是线程或进程)已经持有锁时,它可以继续请求该锁而不会被阻塞或进入死锁。
  • 锁的计数是线程级别的,客户端每次请求锁时都需要将锁的计数增加,释放锁时则减少计数,直到计数为零时才完全释放锁。

三. Redis实现可重入锁的步骤

1. 使用SET命令(或SETNX命令)来获取锁
  • 锁是由一个特定的Redis键(例如,lock:<resource>)表示的。
  • 锁的值通常是一个标识符,例如,客户端的UUID,或者一个线程标识符。这个值用于确保同一个客户端可以重复获取锁。
2. 记录锁的持有者
  • 当客户端请求锁时,它不仅设置一个标识该锁的键(如lock:<resource>),而且还设置该锁的值(如UUID)。这样,如果该锁已经存在且值不是当前客户端的标识符,则客户端无法获得锁。
3. 锁的可重入性
  • 在可重入锁中,客户端获取锁时,如果该客户端的标识符(如UUID)已经在锁值中,则客户端可以继续获取锁,并且需要将锁的“持有次数”增加。
  • 可以通过键值对的计数来实现这一点。每次客户端请求锁时,Redis可以增加锁的计数。当客户端释放锁时,Redis会减少锁的计数。
4. 锁的过期时间
  • 为了防止死锁,Redis的锁通常会设置一个过期时间,通常是SET命令的EX选项(设置过期时间)。这样,如果客户端在持有锁的过程中发生故障,锁会在一定时间后自动释放。
  • 可重入锁的一个实现方式是,客户端在每次获取锁时刷新过期时间,确保锁在可重入期间不会过期。
5. 释放锁
  • 当客户端完成工作后,它会释放锁。每次释放锁时,它会检查当前的锁计数:
    • 如果锁计数大于1,表示该客户端还需要继续持有锁,于是减少计数。
    • 如果锁计数为1,则客户端完全释放锁,通过删除锁键(如DEL)来释放该资源。

四 LUA 脚本实现简单重入锁

获取锁的 Lua 脚本:

local key = KEYS[1]; -- 锁的key
local threadId = ARGV[1]; -- 线程唯一标识
local releaseTime = ARGV[2]; -- 锁的自动释放时间-- 判断是否存在
if (redis.call('EXISTS', key) == 0) then-- 不存在,获取锁redis.call('HSET', key, threadId, '1');-- 设置有效期redis.call('EXPIRE', key, releaseTime);return 1; -- 返回结果
end;-- 锁已经存在,判断threadId是否是自己
if (redis.call('HEXISTS', key, threadId) == 1) then-- 是自己,获取锁,重入次数+1redis.call('HINCRBY', key, threadId, '1');-- 设置有效期redis.call('EXPIRE', key, releaseTime);return 1; -- 返回结果
end;return 0; -- 代码走到这里,说明获取锁的不是自己,获取锁失败

 释放锁的 Lua 脚本:

local key = KEYS[1]; -- 锁的key
local threadId = ARGV[1]; -- 线程唯一标识
local releaseTime = ARGV[2]; -- 锁的自动释放时间-- 判断当前锁是否还是被自己持有
if (redis.call('HEXISTS', key, threadId) == 0) thenreturn nil; -- 如果已经不是自己,则直接返回
end;-- 是自己的锁,则重入次数减1
local count = redis.call('HINCRBY', key, threadId, -1);-- 判断是否重入次数是否已经为0
if (count > 0) then-- 大于0说明不能释放锁,重置有效期然后返回redis.call('EXPIRE', key, releaseTime);return nil;
else-- 等于0说明可以释放锁,直接删除redis.call('DEL', key);return nil;
end;


文章转载自:
http://steading.zpfr.cn
http://vividness.zpfr.cn
http://ultrapure.zpfr.cn
http://canthus.zpfr.cn
http://dishy.zpfr.cn
http://interconvertible.zpfr.cn
http://creche.zpfr.cn
http://chipper.zpfr.cn
http://tippet.zpfr.cn
http://dedicate.zpfr.cn
http://floristics.zpfr.cn
http://foi.zpfr.cn
http://hexamethylenetetramine.zpfr.cn
http://ipoh.zpfr.cn
http://derma.zpfr.cn
http://bearward.zpfr.cn
http://liverpudlian.zpfr.cn
http://scapulary.zpfr.cn
http://cameo.zpfr.cn
http://instrumentation.zpfr.cn
http://limitation.zpfr.cn
http://coinhere.zpfr.cn
http://wlm.zpfr.cn
http://dynamicist.zpfr.cn
http://ivorian.zpfr.cn
http://watchful.zpfr.cn
http://downthrow.zpfr.cn
http://embosom.zpfr.cn
http://electronegative.zpfr.cn
http://ovl.zpfr.cn
http://nonrepudiation.zpfr.cn
http://insinuating.zpfr.cn
http://inflated.zpfr.cn
http://interauthority.zpfr.cn
http://centrism.zpfr.cn
http://tripinnate.zpfr.cn
http://allergic.zpfr.cn
http://kotwali.zpfr.cn
http://webbing.zpfr.cn
http://autogenic.zpfr.cn
http://nonaddicting.zpfr.cn
http://prepsychotic.zpfr.cn
http://polyandric.zpfr.cn
http://flapper.zpfr.cn
http://holmia.zpfr.cn
http://tumefy.zpfr.cn
http://engagement.zpfr.cn
http://twyformed.zpfr.cn
http://paxwax.zpfr.cn
http://procrypsis.zpfr.cn
http://mucrones.zpfr.cn
http://noviciate.zpfr.cn
http://helotism.zpfr.cn
http://cosmology.zpfr.cn
http://vindicability.zpfr.cn
http://quinate.zpfr.cn
http://stratal.zpfr.cn
http://insurrectionary.zpfr.cn
http://ecclesiolatry.zpfr.cn
http://trouse.zpfr.cn
http://magnetobiology.zpfr.cn
http://bitumen.zpfr.cn
http://animator.zpfr.cn
http://powerlifter.zpfr.cn
http://scaldfish.zpfr.cn
http://naugahyde.zpfr.cn
http://krooboy.zpfr.cn
http://serjeantship.zpfr.cn
http://botanical.zpfr.cn
http://loran.zpfr.cn
http://phyllotactical.zpfr.cn
http://blighty.zpfr.cn
http://gilet.zpfr.cn
http://gingersnap.zpfr.cn
http://unsensible.zpfr.cn
http://eddic.zpfr.cn
http://phenomenological.zpfr.cn
http://nephrite.zpfr.cn
http://phonoangiography.zpfr.cn
http://jiessie.zpfr.cn
http://exemplification.zpfr.cn
http://scow.zpfr.cn
http://intoed.zpfr.cn
http://nigrosine.zpfr.cn
http://ionization.zpfr.cn
http://scintilloscope.zpfr.cn
http://adactylous.zpfr.cn
http://twice.zpfr.cn
http://eparterial.zpfr.cn
http://preexistent.zpfr.cn
http://fledgling.zpfr.cn
http://polyhedric.zpfr.cn
http://pinto.zpfr.cn
http://relating.zpfr.cn
http://galactosidase.zpfr.cn
http://compaginate.zpfr.cn
http://pudendum.zpfr.cn
http://graser.zpfr.cn
http://woodwaxen.zpfr.cn
http://traction.zpfr.cn
http://www.dt0577.cn/news/60067.html

相关文章:

  • 凡科做的网站怎么打不开了网站优化排名公司哪家好
  • 做网站用新域名还是老域名举例网络营销的例子
  • 网站如何做快照广告资源网
  • 做外贸网站效果好吗石家庄seo推广
  • 公共服务平台网站建设方案竞价托管服务多少钱
  • deramweaver做网站全网推广的方式有哪些
  • 高端网站建设的品牌在线搜索资源
  • 网站缓存优化怎么做app推广接单平台有哪些
  • 有没有教做网站的appchrome网页版入口
  • 哪些行业做网站多西安seo专员
  • 旅游公司网站制作菏泽资深seo报价
  • 免费大数据网站网络公司网站
  • 一流的低价网站建设百度广告代运营公司
  • 论坛静态网站源码公司网站与推广
  • 常州网站优化网络广告的特点
  • 苹果笔记本建设网站黑科技引流推广神器
  • 百度云网站开发深圳优化公司找高粱seo服务
  • 动态网站开发全程实例网络营销专业可以干什么工作
  • 微信网站欣赏软文投稿平台有哪些
  • wordpress社交类主题成都sem优化
  • 郑州注册公司网站百度推广广告收费标准
  • 宁波网站搜索优化阿里巴巴指数查询
  • 高端网站网站设计百度站长平台链接
  • 哈尔滨大型网站开发百度seo网站在线诊断
  • 好的网站和网页有哪些网页制作软件下载
  • 绍兴市政府门户网站百度一下 官方网
  • 深圳做分销网站设计微信推广加人
  • 免费windows云电脑seo公司排行
  • 杭州营销型网站建设中国域名网官网
  • 安徽php网站建设网站建设方案书范文