工作日常記錄

2021-10-09 15:01:48 字數 3607 閱讀 9675

三、利用 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 』 '按公升序排列。

startend可以是負的,表示範圍的結束。

』 』 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。這裡我們配置選擇器選擇 ...