三、利用 redis 實現分布式鎖
主要是介紹 python 操作 redis 的有序集合,以及使用 redis 實現分布式鎖的功能。
有序集合是一種資料型別,類似於集合和雜湊之間的混合。像集合一樣,排序集由唯一的,非重複的字串元素組成,因此從某種意義上說,有序集合也是乙個集合。 但是,雖然集合內的元素沒有排序,但排序後的集合中的每個元素都與乙個稱為得分的浮點值相關聯(這就是為什麼該型別也類似於雜湊的原因,因為每個元素都對映到乙個值)。 此外,有序集合中的元素是按順序進行的(因此,它們不是應請求而排序的,順序是用於表示已排序集合的資料結構的特殊性)
**如下(示例):
import redis
r = redis.redis(
**config.redis_conf)
新增到有序set的乙個或多個成員,或更新的分數,如果它已經存在
**如下(示例):
redis.zadd(
'my-key'
,'name1'
,1.1
,'name2'
,2.2
, name3=
3.3,name4=
4.4)
返回有序集合中指定分數區間內的成員,分數由低到高排序。
**如下(示例):
r.zrangebyscore(name,
min,
max, start=
none
, num=
none
, withscores=
false
, score_cast_func=
float
)
如果指定了』 』 start 』 『和』 num 』 ',則返回乙個片
的範圍內。
』 』 withscores 』 '表示返回分數和值。
返回型別是(值、分數)對的列表
』 score_cast_func 』 '乙個可呼叫函式,用於轉換分數返回值
返回排序集』 』 name 』 『之間的值範圍』 』 start 』 『和』 』 end 』 '按公升序排列。
**如下(示例):
zrange(self, name, start, end, desc=
false
, withscores=
false
,score_cast_func=
float
):
』 start 』 『和』 』 end 』 '按公升序排列。
start
和end
可以是負的,表示範圍的結束。
』 』 desc 』 '乙個布林值,指示是否對結果進行向下排序
』 』 withscores 』 '表示返回分數和值。
返回型別是(值、分數)對的列表
』 』 score_cast_func 』 '乙個可呼叫函式,用於轉換分數返回值
寫了分布式鎖**,做成了乙個裝飾器
def
check_lock
(func_or_cls)
:"""
redis分布式鎖
:param func_or_cls:
:return:
"""def(self,
*args,
**kwargs)
: job_lock = r.
set(self.lock_name,
1, ex=
60, nx=
true
)if job_lock is
true
:try
: res = func_or_cls(self,
*args,
**kwargs)
except exception:
res =
none
r.delete(self.lock_name)
return res
else
:pass
使用方式:
class
mqmessagehandler
(object):
"""每個topic對應的操作"""
@staticmethod
deftopic_call_back
(msg)
:"""
訂閱topic之後的操作
:param msg:
:return:
"""loggers(log_name=
'mqmessagehandler'
) flag, text_json = bytes_to_dict(msg.body)
# 將bytes型別轉換成字典型別
logging.info(
) now_date = utils.get_date_str(
).replace(
"-","")
# 獲取當天日期
now_time = utils.timestamp_second(
)if msg.body == b'ok'
: refresh_key = f"media_auth_refresh_"
r.zadd(refresh_key, now_time,0)
# 加入有序集合 key 當前時間 分數(0表示需要有新的動作)
elif flag:
new_key = f"media_auth_new_"
r.zadd(new_key, text_json,0)
else
: logging.error(
)
主要是借助 set 方法實現鎖,set方法的詳細說明如下:
def
set(self, name, value, ex=
none
, px=
none
, nx=
false
, xx=
false):
""" set the value at key ``name`` to ``value``
``ex`` sets an expire flag on key ``name`` for ``ex`` seconds.
``px`` sets an expire flag on key ``name`` for ``px`` milliseconds.
``nx`` if set to true, set the value at key ``name`` to ``value`` only
if it does not exist.
``xx`` if set to true, set the value at key ``name`` to ``value`` only
if it already exists.
"""
是借助 nx 這個引數的特性,如果設定 nx=true ,則只有當這個name對應的value不存在才會返回true 記錄工作日常OracleSql mybatis
用於記錄工作中用到的oracle sql語句 表結構變動 新增欄位並指定字段型別 新增乙個字段,多個欄位用小括號括起來,逗號分隔 alter table 表名 add 新增欄位名 型別 長度 alter15,2 記得加注釋 comment on 剩餘本金 表結構變動 修改字段型別 alter mod...
20200515工作日常
今天我的全志r16 a33 android6.0專案流產了,領導覺得安卓6.0系統不夠穩定,因為這並不是全志官方推出的系統,啊,好難受。我該不該繼續搞下去呢?搞這個是很耗費時間的,如果我現在在上學,我或許會選擇繼續搞下去,嗯,概率可能大一些吧。嗯,那就這樣吧,我並不相信自己以後會把這個專案繼續下去,...
工作日常總結學習
主要記錄工作當中一些基礎知識的累積,方便日後複習。我們把系統時鐘配置分為七個步驟,分別用標號 表示,詳細過程為 時鐘源引數設定 hse 或者 hsi 配置。這裡我們選擇 hse 為時鐘源,所以我們之前必須 在 rcc 配置中我們開啟 hse。時鐘源選擇 hse 還是 hsi。這裡我們配置選擇器選擇 ...