在 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...