乙個redis lock的疑問

2021-09-11 02:27:08 字數 2095 閱讀 6701

payed_key = valentines_day_2019_is_payed_date_format % (uid, t_uid, date_str,event_name)

# 拿到所有的檔案,進行扣錢,傳送操作

with events_cacher_v2.get_redis_lock(payed_key):

if events_cacher_v2.redis_con.get(payed_key):

raise ******x('***x')

events_cacher_v2.redis_con.setex(payed_key, value='1', time=20)

show_id = show_cacher.get_user_current_show_id(t_uid)

credits_dict = money_cacher.get_user_credits_by_uid(uid)

if credits_dict.get('credits', 0) < valentines_day_credits_2019:

raise ******x('golds not enough')

# 扣錢

try:

money_cacher.a2b_send_credits(uid, t_uid, valentines_day_credits_2019, valentines_day_gift_id_2019, 1, show_id, send_time=datetime.now())

user_cacher.a2b_send_credits(uid, t_uid, valentines_day_credits_2019, valentines_day_gift_id_2019, 1, show_id)

except exception:

raise ******x('golds not enough')

# 傳送語音+文字

imgae_dict =

audio_dict =

send_money_voice(t_uid, uid, audio_dict, imgae_dict, text=msg)

# 標記redis-key

events_cacher_v2.redis_con.setex(payed_key, value='1', time=default_15days_expire_time)

其中:def get_redis_lock(self, key):

return acquire_redis_lock(

django_settings.noflush_redis_con,

'__%s:lock__' % key,

expire=default_redis_lock_expire_time,

auto_renewal=true)

def acquire_redis_lock(redis_cache, name, expire=none, auto_renewal=false):

from common.redis_cache import rediscache

if isinstance(redis_cache, rediscache):

real_redis_con = redis_cache.vip_redis_con

else:

assert isinstance(redis_cache, strictredis)

real_redis_con = redis_cache

return redis_lock.lock(redis_client=real_redis_con, name=name, expire=expire, auto_renewal=auto_renewal)

**如上,但是上線之後,一直有重複購買,重複扣錢的情況發生,理論上的一天只允許購買一次的效果達不到

想了一下是否有可能

或者(1)、客戶端1獲取鎖成功。

2020-3-24回顧

好稚嫩的寫法啊,hhh

這地方完全沒必要用鎖的,利用redis的單程序性質做乙個setnx就可以了,失敗了就認為已經購買了。或者再加一層sql檢查就好了。

2021-3-5

考慮一下是否存在主從延遲,宕機等情況。

關於Binder Thread的乙個疑問

問題描述 最近在一本書上看到這樣一句話 乙個binder服務端實際上就是乙個binder類的物件,該物件一旦建立,內部就啟動乙個隱藏執行緒。該執行緒接下來會接收binder驅動傳送的訊息。我有以下2個疑問 1 這個隱藏執行緒是在什麼地方被建立的?2 android中的系統服務也是從binder派生的...

dsti裡解析的乙個疑問

dts lt8912 48 driver ret of get named gpio flags np,power gpios 0,pdata power gpio if ret 問題1 驅動裡的名字要與dsti裡面一致,不然驅動出現解析不了,在tp驅動裡也出現過,驅動裡名字未對應dtsi就解析不了...

關於非同步IO的乙個疑問

執行緒是作業系統的核心物件,多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些 cpu 時間是乙個額外的耗費。所以在一些高併發的網路伺服器程式設計中,使用乙個執行緒服務乙個 socket 連線是很不明智的。於是作業系統提供了基於事件模式的非同步程式設計模型。用少量的執行緒來服務大量...