Redis 中的自增值

業(yè)務站點中經(jīng)常需要對關系型數(shù)據(jù)庫的整形主鍵進行控制(不采用數(shù)據(jù)庫自動生成),
一般系統(tǒng)啟動后會讀取各業(yè)務表的最大主鍵扬虚,和業(yè)務表名形成一個字典(key為表名叠蝇,value為當前最大主鍵)翁潘,
當需要某業(yè)務表主鍵時從字典中進行查找并自動加一。
如果只有單個站點忍弛,主鍵信息的緩存都在本地沒有什么問題响迂,但要是站點進行了分布式部署,有多個備份细疚,
則多個備份多個緩存就會引起主鍵沖突蔗彤,這時就需要將生成主鍵的功能提取出來封裝成單獨的服務,
或者直接在Redis中實現(xiàn)自增疯兼。下面介紹的就是在Redis中實現(xiàn)主鍵自增的方式然遏。

注意:
1:Redis重啟后,腳本緩存消失镇防,生產(chǎn)環(huán)境需要在啟動redis時自動注冊腳本啦鸣。
2:這里沒有實現(xiàn)從關系型數(shù)據(jù)庫讀取所需數(shù)據(jù)表的最大主鍵的過程。

下文前提要熟悉lua的基本語法和概念来氧,需要一個python的環(huán)境并安裝redis庫诫给,當然也需要redis實例

啟動redis

image.png

python 環(huán)境和redis庫信息

image.png

redis自增值的lua腳本

local current_value = redis.call('GET', KEYS[1])
current_value = tonumber(current_value) or 0
local next_value = current_value + 1
redis.call('SET', KEYS[1], next_value)
return current_value

注意上述的 tonumber(current_value) or 0 語法
在 Redis Lua 腳本中,當使用數(shù)字類型之前沒有先將其初始化時啦扬,它們會默認為 nil中狂。
如果此后嘗試進行算術運算,就會出現(xiàn)lua redis attempt to perform arithmetic on a nil value錯誤扑毡。
需要確保在使用數(shù)字變量之前先將其初始化胃榕。可以使用 tonumber() 函數(shù)將字符串轉換為數(shù)字數(shù)據(jù)類型瞄摊,
并且如果值為 nil 則返回 0(或其他默認值)勋又。

采用 python 的Redis客戶端注冊 lua腳本到redis

Python文件 redis_nextkey.py

import redis
r = redis.Redis(host='localhost', port=6379, db=0)
lua_script = """
local current_value = redis.call('GET', KEYS[1])
current_value = tonumber(current_value) or 0
local next_value = current_value + 1
redis.call('SET', KEYS[1], next_value)
return current_value
"""
sha = r.execute_command("SCRIPT", "LOAD", lua_script)
print(sha)

# 使用 register_script() 方法加載 Lua 腳本
#script = r.register_script(lua_script)
# 執(zhí)行腳本并輸出結果
#result = script('blz')
#print(result)

在 Python 的 Redis 模塊中苦掘,使用 register_script 方法注冊腳本時,并不會像 redis-cli 中那樣返回 SHA1 校驗和楔壤。
相反的鹤啡,該方法返回一個被封裝為 Script 類的對象,可以使用該對象來執(zhí)行已經(jīng)被 Redis 緩存的腳本蹲嚣。
像調用普通函數(shù)一樣調用該對象递瑰,并傳入 keys 和 args 參數(shù)。
在實際使用中隙畜,建議對這種方式進行封裝抖部,提高代碼復用性和可讀性。
Python 的 Redis 模塊允許使用 execute_command 方法向 Redis 服務器發(fā)送任何命令议惰,發(fā)送 SCRIPT LOAD 命令慎颗,則可以解析返回結果得到 SHA1

執(zhí)行Python腳本

image.png

根據(jù)返回的 SHA1 在redis-cil中測試

image.png

可見連續(xù)執(zhí)行時自動加一,如果是不存在的鍵則為0

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末换淆,一起剝皮案震驚了整個濱河市哗总,隨后出現(xiàn)的幾起案子筛婉,更是在濱河造成了極大的恐慌婿脸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运沦,死亡現(xiàn)場離奇詭異县习,居然都是意外死亡涮母,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門躁愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛本,“玉大人,你說我怎么就攤上這事彤钟±春颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵逸雹,是天一觀的道長营搅。 經(jīng)常有香客問我,道長梆砸,這世上最難降的妖魔是什么转质? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮帖世,結果婚禮上休蟹,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好赂弓,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布绑榴。 她就那樣靜靜地躺著,像睡著了一般盈魁。 火紅的嫁衣襯著肌膚如雪彭沼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天备埃,我揣著相機與錄音,去河邊找鬼褐奴。 笑死按脚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的敦冬。 我是一名探鬼主播辅搬,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脖旱!你這毒婦竟也來了堪遂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萌庆,失蹤者是張志新(化名)和其女友劉穎溶褪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践险,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡猿妈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巍虫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彭则。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖占遥,靈堂內的尸體忽然破棺而出俯抖,到底是詐尸還是另有隱情,我是刑警寧澤瓦胎,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布芬萍,位于F島的核電站,受9級特大地震影響凛捏,放射性物質發(fā)生泄漏担忧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一坯癣、第九天 我趴在偏房一處隱蔽的房頂上張望瓶盛。 院中可真熱鬧,春花似錦、人聲如沸惩猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧房。三九已至拌阴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奶镶,已是汗流浹背迟赃。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厂镇,地道東北人纤壁。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像捺信,于是被迫代替她去往敵國和親酌媒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容