主に、Python操作の順序付きコレクション[redis](https://cloud.tencent.com/product/crs?from=10680)と、分散ロックの機能を実現するためのredisの使用について紹介します。
順序付けられたセットは、セットとハッシュの混合に似たデータタイプです。セットと同様に、ソートされたセットは、一意の繰り返されない文字列要素で構成されているため、ある意味では、順序付けられたセットもセットです。ただし、セット内の要素は並べ替えられませんが、並べ替えられたセット内の各要素は、スコアと呼ばれる浮動小数点値に関連付けられます(これが、各要素がハッシュに似ている理由です。すべて値にマップされます)。さらに、順序付けられたセットの要素は順番に並んでいます(したがって、要求に応じて並べ替えられず、並べ替えられたセットのデータ構造の特殊性を示すために順序が使用されます)
import redis
r = redis.Redis(**config.REDIS_CONF)
順序付けられたセットに追加された1人以上のメンバー、またはスコアがすでに存在する場合は更新されたスコア
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 ''スコアの戻り値を変換するために使用される呼び出し可能な関数
分散ロックコードを作成しました。スクリプトを展開するマシンが複数ある場合、同時にスクリプトを実行するのは1台のマシンだけです。ロック機能のデコレータを作成しました。
def check_lock(func_or_cls):"""
redis分散ロック
: param func_or_cls::return:"""
def wapper(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
return wapper
使用例:
classMqMessageHandler(object):"""各トピックに対応する操作"""
@ staticmethod
def topic_call_back(msg):"""
トピック購読後の操作
: param msg::return:"""
Loggers(log_name='MqMessageHandler')
flag, text_json =bytes_to_dict(msg.body) #バイトタイプを辞書タイプに変換します
logging.info({"msg_id": msg.id,"msg_body": msg.body,"text_json": text_json})
now_date = Utils.get_date_str().replace("-","") #今日の日付を取得
now_time = Utils.timestamp_second()if msg.body == b'OK':
refresh_key = f"media_auth_refresh_{now_date}"
r.zadd(refresh_key, now_time,0) #順序付けられた主要な現在のタイムスコアのセットに参加します(0は新しいアクションが必要であることを意味します)
elif flag:
new_key = f"media_auth_new_{now_date}"
r.zadd(new_key, text_json,0)else:
logging.error({"msg_id": msg.id,"msg_body": msg.body})
ロックは主に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``ifset to True,set the value at key ``name`` to ``value`` only
if it does not exist.``xx``ifset to True,set the value at key ``name`` to ``value`` only
if it already exists."""
nxが設定されている場合、パラメータnxの特性に基づいています=True ,この名前に対応する値が存在しない場合にのみ、Trueが返されます。
Recommended Posts