用redlock实现redis的分布式锁
本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机需要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:
- 实例化锁:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
- 获取锁:rlock.acquire(),获取锁之后才能执行程序。
- 释放锁: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的分布式锁的更多相关文章
- 用Redis构建分布式锁-RedLock(真分布)
在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...
- 【Redis】分布式锁RedLock
普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...
- 基于Redis的分布式锁和Redlock算法
1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...
- 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法
1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...
- Redis实现分布式锁
http://redis.io/topics/distlock 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但 ...
- 基于Redis的分布式锁真的安全吗?
说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...
- 【转】Redis学习笔记(五)如何用Redis实现分布式锁(2)—— 集群版
原文地址:http://bridgeforyou.cn/2018/09/02/Redis-Dsitributed-Lock-2/ 单机版实现的局限性 在上一篇文章中,我们讨论了Redis分布式锁的实现 ...
- 基于redis的分布式锁(转)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- 基于redis的分布式锁(不适合用于生产环境)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
随机推荐
- Python笔记(二十八)_魔法方法_迭代器
迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...
- python+selenium文本框对象以及按钮对象操作
文本框对象 from selenium import webdriverfrom time import sleep driver = webdriver.Firefox() # 指定和打开浏览器ur ...
- windows10驱动精灵装完驱动后重启一直诊断修复中。。。完美解决
给公司电脑重装完系统后安装惯例开始打驱动,用的是驱动精灵,一切顺利,安装完成后重启,结果出问题,正在诊断我的电脑,无法诊断 然后我进入疑难解答 高级选项--启动设置 然后按7禁用驱动签名,成功进入系统 ...
- API网关spring cloud gateway和负载均衡框架ribbon实战
通常我们如果有一个服务,会部署到多台服务器上,这些微服务如果都暴露给客户,是非常难以管理的,我们系统需要有一个唯一的出口,API网关是一个服务,是系统的唯一出口.API网关封装了系统内部的微服务,为客 ...
- Html标签替换(过滤掉html特殊符号)
/// <summary> /// 替换标签,把 <>" 替换为HTML标记 /// </summary> /// <param name=&quo ...
- HDU-3665 Seaside
XiaoY is living in a big city, there are N towns in it and some towns near the sea. All these towns ...
- centos解决Could not find a version that satisfies the requirement pip3 (from versions: none)及No matching distribution found for pip3问题
python环境:python 3.8 报错信息: WARNING: pip is configured with locations that require TLS/SSL, however th ...
- 帝国CMS自定义页面的添加与目录式链接的处理
需求: 1.将某一本地前端自定义页面模板,导入到帝国系统,应用到网站 2.将导入的页面在站点中打开为目录式链接 www.abc.com/softlink/ 环境: 1.windows服务器 2.帝国C ...
- Java中的集合详解及代码测试
1:对象数组 (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. 2:集合(Collection) (1)集合的由来 我们学习的是Java -- 面向对象 ...
- 03机器学习实战之决策树scikit-learn实现
sklearn.tree.DecisionTreeClassifier 基于 scikit-learn 的决策树分类模型 DecisionTreeClassifier 进行的分类运算 http://s ...