本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机需要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:

  1. 实例化锁:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
  2. 获取锁:rlock.acquire(),获取锁之后才能执行程序。
  3. 释放锁:rlock.release(),程序执行完之后,要释放锁,否者其他程序就阻塞,一直执行不了。

完整代码如下:

# -*- coding: utf-8 -*-
import os
import arrow
import redis
from multiprocessing import Pool
from redlock.lock import RedLock HOT_KEY = 'count'
r = redis.Redis(host='localhost', port=6379) def seckilling():
name = os.getpid()
v = r.get(HOT_KEY)
if int(v) > 0:
print (name, ' decr redis.')
r.decr(HOT_KEY)
else:
print (name, ' can not set redis.', v)
#
def run_without_lock(name):
while True:
if arrow.now().second % 5 == 0:
seckilling()
return rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
def run_with_redis_lock(name):
while True:
if arrow.now().second % 5 == 0:
# 二,获取锁
if rlock.acquire():
seckilling()
# 释放锁
rlock.release()
return
if __name__ == '__main__':
p = Pool(80)
r.set(HOT_KEY, 1) for i in range(80):
# p.apply_async(run_without_lock, args=(i,))
p.apply_async(run_with_redis_lock, args=(i,))
print ('now 16 processes are going to get lock!')
p.close()
p.join()
print('All subprocesses done.')

  使用锁的代码,主要是:

rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
def run_with_redis_lock(name):
while True:
if arrow.now().second % 5 == 0:
# 二,获取锁
if rlock.acquire():
seckilling()
# 释放锁
rlock.release()
return

使用redlock得步骤很简单,总结出来,一共四步:

#  一,实例化一把锁 rlock
from redlock.lock import RedLock

rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
# 二,获取锁
if rlock.acquire():
# 三,需要锁住形成阻塞得程序
seckilling()
# 四,释放锁
rlock.release()

总结,我们使用锁的原因,就是让并发的程序形成阻塞,并发可以引起的问题是数据不一致的情况,使用锁,形成阻塞,排队使用数据,就不会造成数据不一致的问题了,当然了,阻塞肯定会降低效率了,速度要慢很多。

用redlock实现redis的分布式锁的更多相关文章

  1. 用Redis构建分布式锁-RedLock(真分布)

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...

  2. 【Redis】分布式锁RedLock

    普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...

  3. 基于Redis的分布式锁和Redlock算法

    1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...

  4. 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法

    1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...

  5. Redis实现分布式锁

    http://redis.io/topics/distlock 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但 ...

  6. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  7. 【转】Redis学习笔记(五)如何用Redis实现分布式锁(2)—— 集群版

    原文地址:http://bridgeforyou.cn/2018/09/02/Redis-Dsitributed-Lock-2/ 单机版实现的局限性 在上一篇文章中,我们讨论了Redis分布式锁的实现 ...

  8. 基于redis的分布式锁(转)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  9. 基于redis的分布式锁(不适合用于生产环境)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

随机推荐

  1. 【HANA系列】SAP HANA计算视图(calculation views)使用RANK报错

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA计算视图(cal ...

  2. 安全运维 - Linux系统攻击应急响应

    Linux 应急相应 - 总纲 应急准备: 制定应急策略 组建应急团队 其他应急资源 安全事件处理: 痕迹数据获取 分析.锁定攻击源删除可疑账号关闭异常进程.端口禁用相应异常开机启动项删除异常定时任务 ...

  3. 001/Go语言构建区块链(mooc)

    1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑 ...

  4. elementUi--->实现上传图片效果(upload+formData)

    现在谈一下elelmentui中使用Upload 上传通过点击或者拖拽上传文件(图片) <el-upload name="multfile"    //上传的文件字段名 cl ...

  5. Mac入门--Apache/Php/Mysql的开启关闭

    注意:mac自带apache环境和PHP环境 一 php服务的启动和关闭 php-fpm 启动 sudo php-fpm php-fpm 关闭 1 查看php-fpm端口是否在被php-fpm进程 n ...

  6. 《剑指offer》面试题16 反转链表 Java版

    (输入链表的头节点,反转链表) 书中方法:对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维 ...

  7. 七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?

    IP: 网络层TCP/UDP: 传输层HTTP.RTSP.FTP: 应用层协议

  8. GooglePlay

    如何下载googlePLay的apk文件? 1.首先要知道apk的package名: 打开GooglePlay的页面,在地址栏里就会有https://play.google.com/store/app ...

  9. JS中类或对象的定义说明

    本篇文章主要是对JS中类或对象的定义进行说明介绍.我们知道,JS是面向对象的.谈到面向对象,就不可避免的要涉及类的概念.一般像c#,java这些强类型语言都有固定的定义类的语法.而JS的不同之处在于它 ...

  10. 时间选择器moment格式化存在时差问题

    时间选择器moment格式化存在时差问题解决方法: return moment(date).utc().zone(+6).format('YYYY-MM-DD')解决IE9时间选择器不能回显数据解决方 ...