redis實現的秒殺系統

2022-04-26 07:10:41 字數 2958 閱讀 9535

利用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就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...