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

基于wordpress门户网站爱站网关键词挖掘工具站长工具

基于wordpress门户网站,爱站网关键词挖掘工具站长工具,wordpress 前台登录插件,彩页模板图片在斜体样式**redis中#xff0c;不同的问题有不一样的解决办法#xff0c;那么锁也有不同的锁来解决不一样的问题#xff0c;下面将举出几个常用的redis锁。 1. SETNX锁#xff08;简单独占锁#xff09; 原理#xff1a; SETNX#xff08;SET if Not eXists#xff…在斜体样式**redis中不同的问题有不一样的解决办法那么锁也有不同的锁来解决不一样的问题下面将举出几个常用的redis锁。 1. SETNX锁简单独占锁 原理 SETNXSET if Not eXists是Redis实现简单锁的命令。它的操作是原子性的当尝试设置一个键值对时如果键不存在则设置成功并返回1表示获取锁成功如果键已经存在则返回0表示锁已被其他客户端占用。 示例 假设使用lock_key作为锁的键locked_value作为锁的值在Java中可以这样实现import redis.clients.jedis.Jedis;public class SimpleRedisLock {public static void main(String[] args) {Jedis jedis new Jedis(localhost, 6379);String lock_key my_lock;String locked_value locked;long result jedis.setnx(lock_key, locked_value);if (result 1) {System.out.println(获取锁成功);// 执行业务逻辑try {// 模拟业务逻辑执行时间Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// 释放锁这里简单地删除键jedis.del(lock_key);} else {System.out.println(获取锁失败);}jedis.close();} }局限性 没有自动释放机制。如果获取锁的客户端崩溃或者出现异常没有执行释放锁的操作这个锁将一直被占用导致死锁。 2. 带有过期时间的SET锁 原理 Redis的SET命令可以在设置键值对的同时设置过期时间并且这个操作是原子性的。例如SET key value EX seconds NX这样的命令格式其中EX seconds表示设置过期时间为seconds秒NX表示只有当键不存在时才设置。 示例 在Python中可以这样实现import redis import timer redis.Redis(hostlocalhost, port6379) lock_key my_lock locked_value locked expire_time 10 result r.set(lock_key, locked_value, exexpire_time, nxTrue) if result:print(获取锁成功)try:# 执行业务逻辑time.sleep(7)finally:# 不需要手动删除锁过期后自动释放pass else:print(获取锁失败)注意事项 业务逻辑执行时间如果超过了锁的过期时间可能会出现数据不一致的情况。例如在锁过期后其他客户端获取了锁然后原来的客户端完成业务逻辑并释放锁这可能会导致新获取锁的客户端的操作受到干扰。 3. RedLock分布式锁算法 原理 RedLock算法用于在多个Redis节点组成的分布式环境中获取高可靠的锁。它要求在多个通常是奇数个独立的Redis节点上尝试获取锁只有当大多数节点例如总共5个节点至少3个节点成功获取锁时才认为锁获取成功。 示例流程简化 假设有3个Redis节点node1、node2、node3在Python中实现RedLock的基本步骤如下import redis import time# 定义Redis节点列表 redis_nodes [redis.Redis(hostnode1, port6379),redis.Redis(hostnode2, port6379),redis.Redis(hostnode3, port6379) ]lock_key my_redlock locked_value unique_client_id expire_time 10 quorum len(redis_nodes) // 2 1 acquired_locks 0# 尝试在多个节点上获取锁 for node in redis_nodes:try:result node.set(lock_key, locked_value, exexpire_time, nxTrue)if result:acquired_locks 1except:pass if acquired_locks quorum:print(RedLock获取成功)try:# 执行业务逻辑time.sleep(7)finally:# 释放锁需要向所有节点发送释放请求for node in redis_nodes:try:node.delete(lock_key)except:pass else:print(RedLock获取失败)优势与应用场景 提供了更高的可靠性能够抵抗单个Redis节点故障、网络分区等问题适用于对数据一致性要求极高的分布式系统如金融交易系统、分布式任务调度系统等。 4. 基于Lua脚本实现的复杂锁如可重入锁 原理 Lua脚本在Redis中可以原子地执行多个命令通过编写Lua脚本可以实现复杂的锁逻辑。例如实现可重入锁时可以在脚本中检查锁的持有者是否为当前客户端如果是则增加重入次数如果不是则判断是否可以获取锁。 示例简单的可重入锁检查脚本 以下是一个简单的Redis Lua脚本用于检查可重入锁假设锁的信息存储在一个哈希表中键为lock_key字段owner存储持有者count存储重入次数-- 检查锁是否存在且持有者是当前客户端 local lock_key KEYS[1] local client_id ARGV[1] local lock_info redis.call(hgetall, lock_key) if #lock_info 0 then-- 锁不存在设置持有者为当前客户端重入次数为1redis.call(hmset, lock_key, owner, client_id, count, 1)return 1 elseif lock_info[2] client_id then-- 持有者是当前客户端增加重入次数redis.call(hincrby, lock_key, count, 1)return 1 elsereturn 0 end在Java中调用这个Lua脚本可以这样实现import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Response; import redis.clients.jedis.ScriptingCommands;public class ReentrantRedisLock {private static final String LUA_SCRIPT local lock_key KEYS[1]\n local client_id ARGV[1]\n local lock_info redis.call(hgetall, lock_key)\n if #lock_info 0 then\n -- 锁不存在设置持有者为当前客户端重入次数为1\n redis.call(hmset, lock_key, owner, client_id, count, 1)\n return 1\n elseif lock_info[2] client_id then\n -- 持有者是当前客户端增加重入次数\n redis.call(hincrby, lock_key, count, 1)\n return 1\n else\n return 0\n end;private JedisPool jedisPool;public ReentrantRedisLock() {JedisPoolConfig poolConfig new JedisPoolConfig();jedisPool new JedisPool(poolConfig, localhost, 6379);}public boolean tryLock(String lock_key, String client_id) {try (Jedis jedis jedisPool.getResource()) {ScriptingCommands scriptingCommands jedis.scriptingCommands();ResponseLong response scriptingCommands.evalsha(scriptingCommands.scriptLoad(LUA_SCRIPT), 1, lock_key, client_id);return response.get() 1;}}public void unlock(String lock_key, String client_id) {try (Jedis jedis jedisPool.getResource()) {// 这里还需要编写释放锁的Lua脚本此处省略// 基本思路是检查重入次数减1后如果为0则删除锁的记录}} }优势与应用场景 可以实现更灵活、复杂的锁机制如可重入锁、公平锁等满足特定业务场景下对锁的高级需求如在递归调用函数中需要获取同一把锁或者需要按照请求顺序公平地获取锁的场景。
http://www.hkea.cn/news/14383474/

相关文章:

  • 呼市做网站国家商标注册官网查询系统
  • 南宁百度网站公司电话拥有响应式网站
  • 顺德做外贸网站怎样做彩票网站
  • 做软件下载网站违法吗怎么找网站模板
  • 做简历网站有什么龙岩推广公司
  • 湖北省建设人力资源网站首页wordpress更换链接自动跳转
  • 专业网站开发设计微信公众号模板
  • 中山网站制作设计广东网站设计哪家好
  • 兰州起点网站建设如何创建自己的博客
  • 适配网站建设模版个人开公司需要多少注册资金
  • 怎么刷网站点击量有什么设计logo网站
  • 建设局发公告的网站logo设计公司 艺点意创
  • dw可以做网站后台吗wordpress幻灯片插件使用
  • 鲜花网站建设结构布局大学生html5网页大作业
  • 上海网站建设网络推广深圳罗湖建网站
  • 南昌网站建设哪家好电子商务网站设计原则
  • 口碑好的网站建设哪家好wordpress文章列表高亮
  • 威海网站seo哪个网站建站好500平台
  • 公司建一个网站多少费用南京百度推广网站
  • 郑州%公司 网站建设江苏宜安建设有限公司网站
  • 成品动漫和视频网站入口wordpress怎么加背景音乐
  • 郑州建设劳务管理中心网站服装网站建设规定
  • 什么叫网站建设和维护徐州本地网站
  • 一般做企业网站需要什么资料景区网站建设策划书
  • 金融行业网站建设公司网站免费seo
  • 中小型企业网络拓扑图网站优化怎么样做
  • 医药网站建设的需求分析怎么去掉hao123主页
  • 彩票网站搭建 做网站7k7k电脑版网页在线玩
  • 福建网站制作jsp怎么做视频网站
  • 深圳做分销网站合肥大型互联网公司