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 連線是很不明智的。於是作業系統提供了基於事件模式的非同步程式設計模型。用少量的執行緒來服務大量...