婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > 簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用

簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用

熱門標(biāo)簽:江西南昌百應(yīng)電話機(jī)器人 hbuilder地圖標(biāo)注 天音通信電話機(jī)器人 杭州400電話如何申請(qǐng)的 隨州營銷電話機(jī)器人怎么樣 400電話申請(qǐng)?jiān)趺纯?/a> 高德地圖標(biāo)注商家在哪 400電話從哪里申請(qǐng)濱州 機(jī)器人電話機(jī)創(chuàng)意繪畫

 可能你已經(jīng)聽說過Redis 中嵌入了腳本語言,但是你還沒有親自去嘗試吧?  這個(gè)入門教程會(huì)讓你學(xué)會(huì)在你的Redis 服務(wù)器上使用強(qiáng)大的lua語言。
Hello, Lua!

我們的第一個(gè)Redis Lua 腳本僅僅返回一個(gè)字符串,而不會(huì)去與redis 以任何有意義的方式交互。

復(fù)制代碼 代碼如下:
local msg = "Hello, world!"
return msg

這是非常簡單的,第一行代碼定義了一個(gè)本地變量msg存儲(chǔ)我們的信息, 第二行代碼表示 從redis 服務(wù)端返回msg的值給客戶端。 保存這個(gè)文件到hello.lua,像這樣去運(yùn)行:

復(fù)制代碼 代碼如下:
redis-cli EVAL "$(cat hello.lua)" 0

運(yùn)行這段代碼會(huì)打印"Hello,world!", EVAL在第一個(gè)參數(shù)是我們的lua腳本, 這我們用cat命令從文件中讀取我們的腳本內(nèi)容。第二個(gè)參數(shù)是這個(gè)腳本需要訪問的Redis 的鍵的數(shù)字號(hào)。我們簡單的 “Hello Script" 不會(huì)訪問任何鍵,所以我們使用0

訪問鍵和參數(shù)

假設(shè)我們要建立一個(gè)URL簡寫服務(wù)器。我們就要去存儲(chǔ)每條進(jìn)入的URL并返回一個(gè)唯一數(shù)值,以便以后通過這個(gè)數(shù)值訪問到該URL。

我們將利用Lua腳本立即從Redis中用INCRand獲取一個(gè)唯一標(biāo)識(shí)ID,以這個(gè)標(biāo)識(shí)ID作為URL存儲(chǔ)于一個(gè)哈希中的鍵值:

復(fù)制代碼 代碼如下:
local link_id = redis.call("INCR", KEY[1])
redis.call("HSET", KEYS[2], link_id, ARGV[1])
return link_id

我們將用call()函數(shù)首次訪問Redis。call()的參數(shù)就是發(fā)給Redis的命令:首先INCR key>, 然后HSET key> field> value>。這兩個(gè)命令將依次執(zhí)行——當(dāng)這個(gè)腳本執(zhí)行時(shí),Redis不會(huì)做任何事,它將非常快地運(yùn)行。

我們將會(huì)訪問兩個(gè)Lua表:KEYS和ARGV。表單是關(guān)聯(lián)性數(shù)組和結(jié)構(gòu)化數(shù)據(jù)的Lua唯一機(jī)制。對(duì)于我們的意圖,你可以把它們看做是一個(gè)你所熟悉的任意語言對(duì)等的數(shù)組,但是提醒兩個(gè)很容易困擾到新手的兩個(gè)Lua定則:

  •     表是基于1的,也就是說索引以數(shù)值1開始。所以在表中的第一個(gè)元素就是mytable[1],第二個(gè)就是mytable[2]等等。
  •     表中不能有nil值。如果一個(gè)操作表中有[1, nil, 3, 4],那么結(jié)果將會(huì)是[1]——表將會(huì)在第一個(gè)nil截?cái)唷?/li>

當(dāng)調(diào)用這個(gè)腳本時(shí),我們還需要傳遞KEYS和ARGV表的值:

復(fù)制代碼 代碼如下:
redis-cli EVAL "$(cat incr-and-stor.lua)" 2 links:counter links:urls http://malcolmgladwellbookgenerator.com/


在EVAL語句中,2指出需要傳入的KEY的個(gè)數(shù),后面跟著需要傳入的兩個(gè)KEY,最后傳入是ARGV的值。在Redis中執(zhí)行Lua腳本時(shí),Redis-cli會(huì)檢查傳入KEY的個(gè)數(shù),除非傳入的完全是命令。

為了解釋得更清楚,下面列出替換KEY和ARGV后的腳本:

復(fù)制代碼 代碼如下:
local link_id = redis.call("INCR", "links:counter")
redis.call("HSET", "links:urls", link_id, "http://malcolmgladwellbookgenerator.com")
return link_id

為Redis編寫Lua腳本時(shí),每個(gè)KEY都是通過KEYS表指定。ARGV表用來傳遞參數(shù),這個(gè)例子中ARGV用來傳入U(xiǎn)RL。

邏輯條件:increx與hincrex

上一個(gè)例子保存鏈接為短網(wǎng)址,想要知道這個(gè)鏈接的點(diǎn)擊次數(shù),在Redis中添加一個(gè)hash計(jì)數(shù)器。當(dāng)帶有鏈接標(biāo)記的用戶訪問時(shí),我們檢查其是否存在,如存在則需要給計(jì)數(shù)器加1:

復(fù)制代碼 代碼如下:
if redis.call("HEXISTS", KEYS[1], ARGV[1]) == 1 then
return redis.call("HINCR", KEYS[1], ARGV[1])
else
return nil
end

每次有人點(diǎn)擊短網(wǎng)址,我們運(yùn)行這個(gè)腳本跟蹤這個(gè)鏈接被再次分享。我們用EVAL來調(diào)用腳本,傳入inlinks:visits(keys[1])和上一個(gè)腳本返回的鏈接標(biāo)識(shí)(ARGV[1])。

這段腳本將檢查是否存在相同的hash,如果存在就為這個(gè)標(biāo)準(zhǔn)的Redis KEY加1。

復(fù)制代碼 代碼如下:
if redis.call("EXISTS",KEYS[1]) == 1 then
return redis.call("INCR",KEYS[1])
else
return nil
end

腳本加載與注冊(cè)執(zhí)行

注意,當(dāng)Redis在運(yùn)行Lua腳本的時(shí)候,其它的事情什么都干不了!腳本最好只是簡單的擴(kuò)展Redis進(jìn)行較小的原子操作和簡單的邏輯控制需要,Lua腳本中的bug可能引發(fā)整個(gè)Redis服務(wù)器鎖—最好保持腳本的簡短和易于調(diào)試。

雖然這些腳本一般都比較短小,但我們還是希望不要每次執(zhí)行時(shí)都使用完整的Lua腳本,實(shí)際上可以在程序一步一步(譯注:application boots翻譯有難度)開發(fā)中注冊(cè)Lua腳本(或者在你部署時(shí)注冊(cè)),然后用注冊(cè)后生成的SHA-1標(biāo)識(shí)來進(jìn)行調(diào)用。

復(fù)制代碼 代碼如下:
redis-cli SCRIPT LOAD "return 'hello world'"
=> "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
 
redis-cli EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
=> "hello world"


顯示調(diào)用SCRIPT LOAD通常是不必要的,當(dāng)一個(gè)程序執(zhí)行EVAL時(shí)就已隱式加載了。程序會(huì)先嘗試EAVALSHA,當(dāng)腳本沒有找到時(shí)會(huì)調(diào)用EVAL。

對(duì)于Ruby開發(fā)者,可以看一下Shopify's Wolverine,其可以為Ruby應(yīng)用簡單的加載并存儲(chǔ)Lua腳本。對(duì)于PHP開發(fā)者,Predis 支持加載Lua腳本作為普通Redis命令進(jìn)行調(diào)用(譯注:需要繼承Predis\Command\ScriptedCommand基類,并注冊(cè)命令)。如果你使用這些或者其它的工具來標(biāo)準(zhǔn)化與Lua的交互,請(qǐng)讓我知道,我很感興趣知道本文之外的內(nèi)容。

何時(shí)使用Lua

Redis支持WATCH/MULTI/EXEC這樣的塊,能進(jìn)行一組操作,也能一起提交執(zhí)行,看起來與Lua有重疊。應(yīng)該如何進(jìn)行選擇?MULT塊中所有操作獨(dú)立,但在Lua中,后面的操作能依賴前面操作的執(zhí)行結(jié)果。同時(shí)使用Lua腳本還能夠避免WATCH使用后競爭條件引起客戶端反應(yīng)變慢的情況。

在RedisGreen(譯注:國外一家專門提供Redis主機(jī)的服務(wù)商),我們看到許多應(yīng)用使用Lua的同時(shí)也使用MULTI/EXEC,但兩者但不是替代關(guān)系。許多成功的Lua腳本都很小,僅僅實(shí)現(xiàn)一個(gè)你的應(yīng)用需要而Redis命令中沒有單一的功能。

訪問庫

Redis的Lua解釋器加載七個(gè)庫:base,table,string, math, debug,cjson和cmsgpack。前幾個(gè)都是標(biāo)準(zhǔn)庫,充許你使用任何語言進(jìn)行基本的操作。后面兩個(gè)可以讓Redis支持JSON和MessagePack—這是非常有用的功能,同時(shí)我也很想知道為什么常常看不到這種用法。

Web應(yīng)用程序常常使用JSON作為api返回?cái)?shù)據(jù),你也許也可以把一堆JSON數(shù)據(jù)存到Redis的key中。當(dāng)想訪問某些JSON數(shù)據(jù)時(shí),首先需要保存到一個(gè)hash中,使用Redis的JSON支持將非常方便:

復(fù)制代碼 代碼如下:
if redis.call("EXISTS", KEYS[1]) == 1 then
local payload = redis.call("GET", KEYS[1])
return cjson.decode(payload)[ARGV[1]]
else
return nil
end


在這里我們檢查看key是否存在,如不存在則快速返回nil。如存在則從Redis中獲取JSON值,用cjson.decode()進(jìn)行解析,然后返回請(qǐng)求內(nèi)容。

復(fù)制代碼 代碼如下:
redis-cli set apple '{ "color": "red", "type": "fruit" }'
=> OK
 
redis-cli eval "$(cat json-get.lua)" 1 apple type
=> "fruit"

加載這段腳本進(jìn)你的Redis服務(wù)器,將JSON數(shù)據(jù)保存到Redis中,通常是hash。 雖然我們每次訪問時(shí)都必須解析,但只要你的對(duì)象很小,這個(gè)操作實(shí)際上是非常快的。

如果你的API只是在內(nèi)部提供,通常需要考慮效率上的問題,MessagePack 是比采用JSON更好的選擇,它更小,更快,在Redis(更多場合也是如此),MessagePack是JSON更好的替代品。

復(fù)制代碼 代碼如下:
if redis.call("EXISTS", KEYS[1]) == 1 then
  local payload = redis.call("GET", KEYS[1])
  return cmsgpack.unpack(payload)[ARGV[1]]
else
  return nil
end


數(shù)值轉(zhuǎn)換

Lua和Redis各有自己的一套類型,因此,理解Redis與Lua在邊界調(diào)用相互轉(zhuǎn)換引起值的改變是非常重要的。一個(gè)來自Lua中number返回到Redis客戶端時(shí)變成了integer—任何數(shù)字后面的小數(shù)點(diǎn)都被清除了:

復(fù)制代碼 代碼如下:
local indiana_pi = 3.2
return indiana_pi

在你運(yùn)行這段腳本時(shí),Redis將返回一個(gè)整數(shù)3,丟失了pi中有用的片段。看起來很簡單,但是一旦開始進(jìn)行Redis與中間腳本交互時(shí)就需要更小心。例如:

復(fù)制代碼 代碼如下:
local indiana_pi = 3.2
redis.call("SET", "pi", indiana_pi)
return redis.call("GET", "pi")

執(zhí)行的結(jié)果是一個(gè)字符串:“3.2”,這是為什么呢?在Redis中沒有專有的數(shù)值類型,當(dāng)我們第一次調(diào)用SET的時(shí)候,Redis就已經(jīng)將它保存為字符串了,將Lua初始化時(shí)將其作為一個(gè)浮點(diǎn)數(shù)的類型信息給丟失了。所以當(dāng)我們后面取出這個(gè)值時(shí),它就變成了一個(gè)字符串。

在Redis中,除了INCR和DECR,其它的GET,SET操作所訪問的數(shù)據(jù)都作為字符串處理。INCR與DECR是專門對(duì)數(shù)值的操作,實(shí)際上返回是整數(shù)(integer)回復(fù)(維護(hù)和存儲(chǔ)遵守?cái)?shù)字規(guī)則),但Redis內(nèi)部保存類型實(shí)際上還是字符串值。

總結(jié):

下面這些都是在Redis中使用Lua時(shí)常見的錯(cuò)誤:

  •     表是Lua中的表達(dá)式,與很多流行語言不同。KEYS中的第一個(gè)元素是KEYS[1],第二個(gè)是KEYS[2](譯注:不是0開始)
  •     nil是表的結(jié)束符,[1,2,nil,3]將自動(dòng)變?yōu)閇1,2],因此在表中不要使用nil。
  •     redis.call會(huì)觸發(fā)Lua中的異常,redis.pcall將自動(dòng)捕獲所有能檢測到的錯(cuò)誤并以表的形式返回錯(cuò)誤內(nèi)容。
  •     Lua數(shù)字都將被轉(zhuǎn)換為整數(shù),發(fā)給Redis的小數(shù)點(diǎn)會(huì)丟失,返回前把它們轉(zhuǎn)換成字符串類型。
  •     確保在Lua中使用的所有KEY都在KEY表中,否則在將來的Redis版中你的腳本都有不能被很好支持的危險(xiǎn)。
  •     Lua腳本和其它Redis操作一樣,在腳本執(zhí)行時(shí),其它的一切都不能運(yùn)行。考慮用腳本來護(hù)展Redis服務(wù)器能力,但要保持短小和有用。

您可能感興趣的文章:
  • 詳解利用redis + lua解決搶紅包高并發(fā)的問題
  • Redis執(zhí)行Lua腳本的好處與示例代碼
  • redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解
  • 利用Lua定制Redis命令的方法詳解
  • Redis如何使用lua腳本實(shí)例教程
  • Nginx利用Lua+Redis實(shí)現(xiàn)動(dòng)態(tài)封禁IP的方法
  • 詳解Redis中Lua腳本的應(yīng)用和實(shí)踐
  • Redis和Lua使用過程中遇到的小問題
  • 通過redis的腳本lua如何實(shí)現(xiàn)搶紅包功能

標(biāo)簽:沈陽 招商 石嘴山 鶴崗 常德 葫蘆島 昆明 保定

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用》,本文關(guān)鍵詞  簡介,Lua,腳本,與,Redis,數(shù)據(jù)庫,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用》相關(guān)的同類信息!
  • 本頁收集關(guān)于簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲同性gay激情无套| 国内外成人在线视频| 日本欧美一区二区| 国产盗摄精品一区二区三区在线| 91在线高清观看| 精品国产欧美一区二区| 亚洲三级在线免费| 国产一区在线观看麻豆| 欧美日韩极品在线观看一区| 国产精品久久久久久久久晋中| 蜜臀av一区二区| 在线播放中文一区| 亚洲蜜臀av乱码久久精品| 国产乱色国产精品免费视频| 欧美日韩精品一区二区三区蜜桃 | 精品在线播放免费| 色噜噜久久综合| 欧美激情在线一区二区| 国模一区二区三区白浆| 在线不卡一区二区| 午夜一区二区三区视频| 一本到高清视频免费精品| 国产精品免费aⅴ片在线观看| 国产中文字幕一区| 精品国产伦理网| 麻豆国产一区二区| 精品美女一区二区三区| 美女网站色91| 欧美成人精品3d动漫h| 蜜臀av国产精品久久久久| 91精品国产91热久久久做人人| 亚洲一区二区在线免费观看视频| 成人激情校园春色| 国产精品网站在线| 成人午夜视频福利| 日韩毛片在线免费观看| av在线播放成人| 亚洲人成在线播放网站岛国| 91色综合久久久久婷婷| 亚洲人成影院在线观看| 在线观看免费一区| 日韩成人精品在线观看| 精品国产乱码久久久久久图片| 免费成人你懂的| 久久久国产一区二区三区四区小说| 久久超碰97人人做人人爱| 久久嫩草精品久久久久| 成人三级伦理片| 亚洲夂夂婷婷色拍ww47| 555夜色666亚洲国产免| 捆绑变态av一区二区三区| 欧美精品一区二区久久婷婷| 国产东北露脸精品视频| 亚洲欧美国产高清| 欧美日韩精品一区二区三区| 日本麻豆一区二区三区视频| 久久久久久久久一| 91影院在线免费观看| 日韩电影一区二区三区四区| 久久亚洲一区二区三区四区| 成人精品在线视频观看| 午夜伊人狠狠久久| 国产三级精品视频| 欧美在线观看一二区| 国模套图日韩精品一区二区| 亚洲欧美一区二区久久| 3d成人h动漫网站入口| 国产99一区视频免费| 亚洲精品成人a在线观看| 欧美一级一区二区| 91亚洲精品久久久蜜桃| 麻豆91小视频| 亚洲精选一二三| 亚洲精品在线观| 欧美色网站导航| 成人午夜短视频| 毛片av中文字幕一区二区| 中文字幕亚洲电影| 欧美xingq一区二区| 99久久免费视频.com| 蜜臀a∨国产成人精品| 一级特黄大欧美久久久| 国产亚洲欧美日韩日本| 91精品国产美女浴室洗澡无遮挡| av亚洲精华国产精华精| 国产美女一区二区| 视频在线观看一区| 亚洲一区二区在线免费看| 国产精品理伦片| 精品福利一区二区三区| 欧美另类videos死尸| 91久久精品网| 成人午夜av影视| 国产一区二区不卡| 紧缚捆绑精品一区二区| 日本人妖一区二区| 亚洲成人一区二区在线观看| 中文字幕一区在线| 国产精品嫩草影院av蜜臀| 日韩精品影音先锋| 欧美一区二区女人| 欧美日韩精品免费| 欧美亚洲国产怡红院影院| 91丝袜呻吟高潮美腿白嫩在线观看| 黄一区二区三区| 蜜桃精品视频在线| 久久精品国产99国产| 免费国产亚洲视频| 久久国产免费看| 日本不卡高清视频| 日本在线不卡视频| 日本欧美在线看| 蜜臀a∨国产成人精品| 欧美96一区二区免费视频| 日韩高清欧美激情| 久久精品久久精品| 久久精品噜噜噜成人88aⅴ| 美女www一区二区| 韩国av一区二区三区在线观看| 激情图区综合网| 国产精品99久久久久久有的能看| 狠狠狠色丁香婷婷综合久久五月| 狠狠v欧美v日韩v亚洲ⅴ| 国产成人亚洲精品青草天美| 成人午夜激情视频| 日本精品视频一区二区三区| 欧美日韩国产天堂| 精品国产a毛片| 国产精品久久久久久久浪潮网站| 欧美国产精品中文字幕| 亚洲免费在线观看视频| 亚洲高清一区二区三区| 精品在线播放午夜| www.日韩精品| 欧美午夜精品一区二区蜜桃 | 日韩va欧美va亚洲va久久| 日日摸夜夜添夜夜添国产精品 | 日本道精品一区二区三区| 在线观看视频一区| 欧美本精品男人aⅴ天堂| 日本一区二区三区免费乱视频| 亚洲精品中文字幕乱码三区| 日韩中文字幕区一区有砖一区| 国产一区视频导航| 欧美视频精品在线| 久久精品人人爽人人爽| 亚洲男人的天堂一区二区| 日韩电影免费在线看| 成人爱爱电影网址| 欧美一级视频精品观看| 中文字幕第一区综合| 亚洲成人av电影在线| 国产一区二区三区高清播放| 日本韩国欧美一区| 久久综合狠狠综合| 亚洲欧美另类久久久精品| 免费国产亚洲视频| 91电影在线观看| 国产午夜亚洲精品理论片色戒| 亚洲自拍偷拍av| 成人中文字幕电影| 欧美一区二区三区在线看| 亚洲丝袜精品丝袜在线| 美女脱光内衣内裤视频久久网站 | 欧美色精品在线视频| 国产亚洲精品福利| 日韩av电影天堂| 日本精品视频一区二区| 国产欧美日韩在线| 国产在线精品一区二区不卡了| 欧美日韩情趣电影| 中文字幕视频一区| 高清国产午夜精品久久久久久| 日韩亚洲欧美中文三级| 亚洲综合丁香婷婷六月香| 国产1区2区3区精品美女| 26uuu精品一区二区| 三级成人在线视频| 欧美丝袜第三区| 亚洲免费色视频| 成人app网站| 国产欧美精品一区| 国产一区91精品张津瑜| 精品国产一区a| 久久99国产精品麻豆| 日韩免费一区二区三区在线播放| 亚洲国产日韩精品| 欧美三级视频在线| 一区二区三区中文字幕电影| 成人中文字幕在线| 国产精品国产精品国产专区不片| 国产麻豆精品视频| 欧美国产国产综合| 波多野结衣在线aⅴ中文字幕不卡| 国产日韩影视精品| www.欧美亚洲| 综合久久久久综合| 91久久精品午夜一区二区| 亚洲成在线观看| 在线91免费看|