python 用redis實現分布式鎖

2021-10-11 12:43:26 字數 1894 閱讀 7765

在 redis 中設定值,預設,不存在則建立,存在則修改。

引數:1.ex - 過期時間(秒) 這裡過期時間是3秒,3秒後p,鍵food的值就變成none

import redis,time

#redis_client = redis.strictredis(host='localhost', port=6379, db=0)

class redislock():

def __init__(self):

self.redis_client = redis.strictredis(host='localhost', port=6379, db=0)

self._lockid = none

def get_redis_lock(self, name, timeout):

''':param name: 鎖名

:param timeout: 鎖定時間

:return: 成功返回鎖值,失敗返回false

'''val = self.redis_client.get(name)

if val:

return false

self._lockid = time.time()

lock_val = 'locked_{}'.format(self._lockid)

re = self.redis_client.set(name, lock_val, ex=timeout,nx=true)

return re

def release_redis_lock(self, name):

''':param name: 鎖名

:return: 成功返回true 失敗返回false

'''val = self.redis_client.get(name)

if not val:

return true

if str(val, 'utf-8') == 'locked_{}'.format(self._lockid):

re = self.redis_client.delete(name)

return true

return false

cli = redislock()

cli2 = redislock()

re1 = cli.get_redis_lock('mylock1', 5)

print(re1)

re2 = cli.get_redis_lock('mylock1', 20)

print(re2)

rr = cli2.release_redis_lock('mylock1') #用其他物件來解鎖,會失敗

print(rr)

re3 = cli.release_redis_lock('mylock1')

print(re3)

time.sleep(1)

re4 = cli.get_redis_lock('mylock1', 20)

print(re4)

》true

false

false

true

true

其他實現方法

(不推薦)因為設定值與設定超時時間為兩個步驟,異常情況可能導致死鎖,不能完全保證鎖正常使用

使用以下命令組合:

(1)setnx

setnx key val:當且僅當key不存在時,set乙個key為val的字串,返回1;若key存在,則什麼都不做,返回0。

(2)expire

expire key timeout:為key設定乙個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

(3)delete

delete key:刪除key

分庫分表時用Redis自增實現計數實現分布式id

最近公司專案使用者量越來越大,之前的老系統由於設計不合理,已經不能滿足目前的需要。現在做了乙個新系統,兩個系統不同的庫,同時在執行。涉及到表id的問題,為了解決這個問題,使用redis來實現分布式id 具體 如下 1,設定乙個key實現計數器功能,每取值一次調一次這個方法進行加1操作 public ...

用redis實現秒殺

今日在研究秒殺系統,用資料庫的樂觀鎖可以實現,但是在高併發下可能並不好,所以就想到了快取系統redis,因為redis本身也有鎖機制,廢話不多說,直接上 請大神指點不足的地方。class a public class myrunnable implements runnable override p...

怎麼用python操作redis

2.字串相關操作 3.使用sorted set 1 安裝redis 2 使用連線池生成連線import redis from django.conf import settings class connectionpoolutils 初始化乙個連線池,全域性唯一 pool redis.connect...