300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > redlock java_用redlock实现redis的分布式锁

redlock java_用redlock实现redis的分布式锁

时间:2024-01-10 19:14:06

相关推荐

redlock java_用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,}])defrun_with_redis_lock(name):whileTrue:if arrow.now().second % 5 ==0:#二,获取锁

ifrlock.acquire():

seckilling()#释放锁

rlock.release()return

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

#一,实例化一把锁 rlock

from redlock.lock import RedLock

rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])

#二,获取锁

ifrlock.acquire():#三,需要锁住形成阻塞得程序

seckilling()#四,释放锁

rlock.release()

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。