利用redis的樂觀鎖,實現秒殺系統的資料同步(基於watch實現)
import redis
conn = redis.redis(host='127.0.0.1',port=6379)
# conn.set('count',1000)
with conn.pipeline() as pipe:
# 先監視,自己的值沒有被修改過
conn.watch('count')
# 事務開始
pipe.multi()
old_count = conn.get('count')
count = int(old_count)
# input('我考慮一下')
if count > 0: # 有庫存
pipe.set('count', count - 1)
# 執行,把所有命令一次性推送過去
ret2 = pipe.execute()
print(ret2) # [true]
ret = pipe.execute()
print(type(ret))
print(ret) #
注:windows下如果資料被修改了,不會拋異常,只是返回結果的列表為空,mac和linux會直接拋異常
秒殺系統核心邏輯測試,建立100個執行緒併發秒殺
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
from multiprocessing import process
from threading import thread
import random, time
from redis import watcherror
def miaosha(name, conn, pipe):
# 先監視,自己的值沒有被修改過
# while stack_count > 0:
try:
pipe.watch('count')
# 事務開始
pipe.multi()
old_count = conn.get('count')
count = int(old_count)
# input('我考慮一下')
# time.sleep(random.randint(1, 2))
# time.sleep(random.random())
if count > 0: # 有庫存
# set之後對應ret 為[true]或者, 而decr對應自減, 其ret 為[對應的count殘餘值]
pipe.set('count', count - 1)
# pipe.decr("count")
# 執行,把所有命令一次性推送過去
ret = pipe.execute()
print(ret)
if len(ret) > 0:
print('第%s個人搶購成功' % name)
return true
else:
print('第%s個人搶購失敗' % name)
return true
# return true
except watcherror as e:
# 列印watcherror異常, 觀察被watch鎖住的情況
# print(e)
# print("當前使用者搶購失敗")
pipe.unwatch()
return false
def choose(name, conn):
with conn.pipeline() as pipe:
res = miaosha(name, conn, pipe)
return res
def worker(name, conn):
for r in range(3):
res = choose(name, conn)
if res:
break
else:
print(f"第次嘗試~~~")
def threading_work():
conn = redis.redis(host='127.0.0.1', port=6379)
for i in range(100):
t = thread(target=worker, args=(i, conn))
t.start()
if __name__ == '__main__':
# 多程序多執行緒本案例, 會出現列印文字重複問題, 實際操作需要調整, 應用於測試
# tt_list =
# for r in range(4):
# tt = process(target=threading_work)
# tt.start()
# for tt in tt_list:
# tt.join()
conn = redis.redis(host='127.0.0.1', port=6379)
for i in range(300):
t = thread(target=worker, args=(i, conn))
t.start()
上面列子個人網上找來參考改動挺多, 實現了對規定秒殺庫存數的完整性
個人**的實現邏輯》:
實現了貨物存在時部分使用者可購買商品成功, 部分使用者因為執行緒操作問題, 不能購買到貨物, 在except部分進行了對應的邏輯列印, 而在 貨物處於0 時候則報出 當前第幾使用者購買失敗的效果, 實現了個人覺得測試下沒有問題的秒殺
理解後, 部分複製之
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...
用Redis輕鬆實現秒殺系統
秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...