python操作redis分布式锁

10 篇文章 0 订阅

python操作redis分布式锁

  1. django 主项目下views层代码
    前提:
    数据库中有数据表User,数据表中有字段username,score
    启动了两个django客户端,端口分别为8000,8001,用户模拟分布式处理用户请求
    主路由绑定test(request)视图函数
from django.http import JsonResponse
def test(request):	
	#连接redis
	r = redis.Redis(host='127.0.0.1',port=6379,db=0)
	#因为加了锁,若另一个django进程抢到了锁,这个django进程需要不停的循环抢占时间片
	while True:
		#防止产生死锁时抛出异常打断程序进行
		try:
			#上锁,让同一时间只有一个django(相当于一个进程)能操作数据库
			#若不上redis分布式锁,由于两个django是同时修改数据库中的数据
			#可能会出现重复做同一件事情的情况(如 score= 10 时,都做 10+1 操作写入数据表),
			#导致30个线程累加数据表中的score字段总数最后小于30
			with r.lock('123',blocking_timeout=3) as lock:	#blocking_time表示死锁阻塞时只等3秒,防止死锁
				#每次被访问,就对数据表中score字段进行 +1 操作
				u = User.objects.get(username='Terry')
				u.score += 1
				u.save()
			#这个django进程释放了锁,就break,避免继续while True
			break
		except Exception as e:
			print('Local failed')
	return JsonResponse({'code':200,'data':{})
  1. 模拟客户端对服务端(django)发请求的代码
from threading import Thread
import random
#请求模块
import requests

#分支线程事件函数	--随机向8000或8001发请求
def get_request():	
	url = 'http://127.0.0.1:8000/test/'
	url2 = 'http://127.0.0.1:8001/test/'
	get_url = random.choice([url,url2])
	#request.get()函数模拟用户请求url资源
	request.get(get_url)
	
t_list = []
#创建30个线程向两个url随机发请求
#由于线程间是抢占式关系,且共享进程资源,会影响
for i in range(30):
	t = Thread(target=get_request)
	t_list.append(t)
	t.start()

for t in t_list:
	t.join()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值