![2022Redis命令參考指南_第1頁](http://file4.renrendoc.com/view12/M05/12/0A/wKhkGWdm2S2AFJRRAABBNSI1aAg597.jpg)
![2022Redis命令參考指南_第2頁](http://file4.renrendoc.com/view12/M05/12/0A/wKhkGWdm2S2AFJRRAABBNSI1aAg5972.jpg)
![2022Redis命令參考指南_第3頁](http://file4.renrendoc.com/view12/M05/12/0A/wKhkGWdm2S2AFJRRAABBNSI1aAg5973.jpg)
![2022Redis命令參考指南_第4頁](http://file4.renrendoc.com/view12/M05/12/0A/wKhkGWdm2S2AFJRRAABBNSI1aAg5974.jpg)
![2022Redis命令參考指南_第5頁](http://file4.renrendoc.com/view12/M05/12/0A/wKhkGWdm2S2AFJRRAABBNSI1aAg5975.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
RedisKey(鍵 String(字符串 Hash(哈希表 List(列表 Set(集合 SortedSet(有序集合 Pub/Sub(發(fā)布/訂閱 Transaction(事務(wù) Script(腳本 SCRIPT SCRIPT SCRIPT SCRIPT Connection(連接 Server(服務(wù)器 CLIENT CLIENT CLIENT CLIENT CONFIG CONFIG CONFIG CONFIG DEBUG DEBUG 鍵空間通知(keyspace Redis腳本和事 Redis持久 RDB的優(yōu) RDB的缺 AOF的優(yōu) AOF的缺 RDB和AOF,我應(yīng)該用哪一個 RDB快 AOF重 AOF有多耐久 如果AOF文件出錯了,怎么辦 AOF的運(yùn)作方 怎么從RDB持久化切換到AOF持久 RDB和AOF之間的相互作 備份Redis數(shù) TILT模 使用redis-rb-cluster編寫一個示例應(yīng) Redis集群規(guī) MOVED轉(zhuǎn) ASK轉(zhuǎn) 發(fā)布/訂閱(已實現(xiàn),但仍然需要改善 附錄A:CRC16算法的ANSI實現(xiàn)參 ChapterChapter1.Key(鍵DELkey[keykey。不存在的key會被忽略。key#刪除單個redis>SETnamehuangz(integer)1#刪除一個不存在的redis>EXISTSphone(integer)0redis>DELphone#key(integer)#同時刪除多個keyredis>SETname"redis"RedisRedis命令參考,Release RedisRedis命令參考,Releaseredis>SETtype"key-valuestore"redis>SETwebsite""redis>DELnametypewebsite(integer)3DUMPkey,并返回被序列化的值,使用RESTORERedis鍵。64位的校驗和,用于檢測錯誤,RESTORERDBRDBRedisRDBO(1)O(N*M)NkeyO(1)。keynil。redis>SETgreeting"hello,dumpingworld!""\x00\x15hello,dumpingredis>DUMPnot-exists-keyEXISTSkey是否存在??捎冒姹荆?gt;=1.0.01.4.1.4.ChapterChapter1.Key(鍵key10redis>SETdb"redis"redis>EXISTSdb(integer)1redis>DELdb(integer)1redis>EXISTSdb(integer)0EXPIREkeykeykey(0),它會被自動刪除。Rediskey被稱為『易失的』(volatile)。生存時間可以通過使用DELkey來移除,或者被SET和GETSET(overwrite),這意味著,如果一個命令只是修改(alter)一個帶生存時間的key的值而不是用一個新的key值來代替(replace)它的話,那么生存時間不會被改變。key執(zhí)行INCR命令,對一個列表進(jìn)行LPUSH命令,或者對一個哈希表執(zhí)行HSET命令,這類操作都不會修改key本身的生存時間。另一方面,如果使用RENAMEkeykeyRENAMEkeyanother_key(以及它的生存時間)keyanother_key,因此,新another_keykey一樣。使用PERSISTkeykeykey(persistent)keykey執(zhí)行EXPIRE命令,新指定的生存時間會取代舊的生存時間。Redis2.41key已經(jīng)過期,但它還是可能在過期Redis2.61毫秒之內(nèi)。Redis2.1.3Redis2.1.3keykey被刪除,這一行為是受當(dāng)時復(fù)制(replication)層的限制而作出的,現(xiàn)在這一限制已經(jīng)被修復(fù)。1.0.0時間復(fù)雜度:O(1)1keykey(2.1.3Rediskey的生存時間),返回0。redis>SETcache_page""redis>EXPIREcache_page30#設(shè)置過期時間為30(integer)redis>TTL #(integer)redis>EXPIREcache_page #(integer)redis>TTLcache_page(integer)29996這些最近訪問的頁面記錄,我們稱之為『導(dǎo)航會話』(Navigationsession),可以用INCR和RPUSHRPUSHpagewviews.user:<userid>http://EXPIREpagewviews.user:<userid>6060秒,那么它的導(dǎo)航會話就會被清空,當(dāng)用戶重新開始閱覽的時候,系統(tǒng)又會重新EXPIREATkeyEXPIREAT的作用和EXPIREkey不同在于EXPIREATUNIX(unixtimestamp)??捎冒姹荆?gt;=1.2.01key0redis>SETcacheredis>EXPIREATcache #這個key將在2012.12.12(integer)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release redis>TTLcache(integer)45081860KEYSpatternkeyKEYSh?llohello,hallohxlloKEYSh*llohlloheeeeelloKEYSh[ae]llohellohallohilloWarning:Warning:KEYS的速度非??欤谝粋€大的數(shù)據(jù)庫中使用它仍然可能造成性能問題,如果你需要從keyRedis(set)來代替。返回值:符合給定模式的key列表。redis>MSETone1two2three3four4#4keyredis>KEYSredis>KEYSredis>KEYSredis>KEYS*#MIGRATEhostportkeydestination-dbtimeout[COPY]key原子性地從當(dāng)前實例傳送到目標(biāo)實例的指定數(shù)據(jù)庫上,一旦傳送成功,key保證會出現(xiàn)在目標(biāo)實例上,而當(dāng)前實例上的key會被刪除。 RedisRedis命令參考,Release RedisRedis命令參考,ReleaseChapterChapter1.Key(鍵這個命令是一個原子操作,它在執(zhí)行的時候會阻塞進(jìn)行遷移的兩個實例,直到以下任意結(jié)果發(fā)生:遷移成功,遷移失敗,等到超時。key執(zhí)行DUMP目標(biāo)實例再使用RESTORE對數(shù)據(jù)進(jìn)行反序列化,并將反序列化所得的數(shù)據(jù)添加到數(shù)據(jù)庫中;當(dāng)前實例就RESTORE命令返回OK,它就會調(diào)用DEL刪除自己數(shù)據(jù)庫上的keytimeouttimeoutMIGRATEIOIO錯誤,或者達(dá)到了超時時間,那么命令會停止執(zhí)行,并返回一個特殊的錯誤:IOERR。keykey,因此,如果一個客戶端執(zhí)行MIGRATE如果有其他錯誤發(fā)生,那么MIGRATEkey(當(dāng)然,目標(biāo)實例的給定數(shù)據(jù)庫上可能有和key同名的鍵,不過這和MIGRATE命令沒有關(guān)系??捎冒姹荆?gt;=2.6.0這個命令在源實例上實際執(zhí)行DUMP命令和DEL命令,在目標(biāo)實例執(zhí)行RESTORE命令,查看以上keyO(N)。$./redis-server[1]$./redis-server--port7777[2]$./redis-redis:6379>flushdbredis:6379>SETgreeting"Hellofrom6379instance"redis:6379>MIGRATE7777greeting01000redis:6379>EXISTS #遷移成功后key(integer)$./redis-cli-predis:7777>GETgreeting"Hellofrom6379instance"MOVEkey(源數(shù)據(jù)庫)(目標(biāo)數(shù)據(jù)庫)keykey不存在于當(dāng)前MOVE沒有任何效果??捎冒姹荆?gt;=1.0.010#keyredis>SELECT0 #redis默認(rèn)使用數(shù)據(jù)庫0,為了清晰起見,這里再顯式指定一次。redis>SETsong"secretbase-Zone"redis>MOVEsong1 #song1(integer)1redis>EXISTS #song(integer)redis>SELECT #使用數(shù)據(jù)庫redis:1>EXISTSsong #song1(注意命令提示符變成了"redis:1",表明正在使用(integer)1#當(dāng)keyredis:1>EXISTSfake_key(integer)0redis:1>MOVEfake_key0 #1key0,失敗(integer)0redis:1>select0 #0redis>EXISTS #fake_key(integer)#keyredis>SELECT #使用數(shù)據(jù)庫redis>SETfavorite_fruit"banana"redis>SELECT #使用數(shù)據(jù)庫redis:1>SETfavorite_fruit"apple"redis:1>SELECT0 #使用數(shù)據(jù)庫0,并試圖將favorite_fruit移動到數(shù)據(jù)庫1redis>MOVEfavorite_fruit #(integer)redis>GET #數(shù)據(jù)庫0的favorite_fruitredis>SELECT1redis:1>GET #數(shù)據(jù)庫1的favorite_fruitOBJECTsubcommand[argumentsOBJECTkeyRedisRedis用作緩存程序時,你也可以通過OBJECTkey(evictionOBJECTRedisRedis命令參考,ReleaseRedisRedis命令參考,Release 1.9.1.9.ChapterChapter1.Key(鍵raw(一般字符串)int(64位數(shù)字是為了節(jié)約空間)列表可以被編碼為ziplist或linkedlist。ziplist集合可以被編碼為intset或者h(yuǎn)ashtable。intsetzipmaphashtable。zipmap有序集合可以被編碼為ziplist或者skiplist格式。ziplist用于表示小的有序集合,而2.2.3時間復(fù)雜度:O(1)REFCOUNTIDLETIMEENCODINGredis>SETgame #redis>OBJECTREFCOUNT #(integer) #(integer)redis>GET #game(active) #(integer)redis>OBJECTENCODING #redis>SETphone #redis>OBJECTENCODINGphoneredis>SETage20 #intredis>OBJECTENCODINGagePERSISTkeykey從『易失的』(key轉(zhuǎn)換成『持久的』(一個不帶生存時間、永不過期的key)。2.2.0時間復(fù)雜度:O(1)1keykey0redis>SETmykey"Hello"redis>EXPIREmykey10#key(integer)redis>TTLmykey(integer)10redis>PERSIST #移除key(integer)redis>TTLmykey(integer)-1PEXPIREkey這個命令和EXPIREkey的生存時間,而不像EXPIRE命令那2.6.0時間復(fù)雜度:O(1)redis>SETmykey"Hello"redis>PEXPIREmykey1500(integer)1redis>TTL #TTL(integer)redis>PTTL #(integer)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵PEXPIREATkeymilliseconds-這個命令和EXPIREATkeyunix時間戳,而不是像EXPIREAT2.6.0時間復(fù)雜度:O(1)1key0。(查看EXPIRE命令獲取更多信息redis>SETmykey"Hello"redis>PEXPIREATmykey1555555555005(integer)1redis>TTL #TTL(integer)redis>PTTL #PTTL(integer)PTTL這個命令類似于TTLkey的剩余生存時間,而不是像TTL命令那樣,以秒為key-2key-1。否則,以毫秒為單位,返回key的剩余生存時間。Note:Redis2.8keykey-1#不存在的(integer)-2#keyredis>SETkeyvalue(integer)-1#有剩余生存時間的redis>PEXPIREkey10086(integer)1redis>PTTLkey(integer)6179(不刪除key。可用版本:>=1.0.0key。當(dāng)數(shù)據(jù)庫為空時,返回nil。#redis>MSETfruit"apple"drink"beer"food"cookies" redis>KEYS #查看數(shù)據(jù)庫內(nèi)所有key,證明RANDOMKEY并不刪除#redis>FLUSHDB#刪除當(dāng)前數(shù)據(jù)庫所有keyRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵RENAMEkeynewkey已經(jīng)存在時,RENAME命令將覆蓋舊值。#keynewkeyredis>SETmessage"helloworld"redis>RENAMEmessagegreetingredis>EXISTS #message(integer)redis>EXISTS #greeting(integer)#keyredis>RENAMEfake_keynever_exists(error)ERRnosuchkey#newkey已存在時,RENAME會覆蓋舊redis>SETpc"lenovo"redis>SETpersonal_computer"dell"redis:1>GET #dellRENAMENXkey當(dāng)key不存在時,返回一個錯誤。1.0.0時間復(fù)雜度:O(1)1#redis>SETplayer"MPlyaer"redis>EXISTSbest_player(integer)0redis>RENAMENXplayerbest_player(integer)1#newkeyredis>SETanimal"bear"redis>SETfavorite_animal"butterfly"redis>RENAMENXanimalfavorite_animal(integer)0redis>getfavorite_animalRESTOREkeyttlserialized-valuettlkeyttl0RESTORERDBRDB版本不相同或者數(shù)據(jù)不完整的話,那么RESTORE會拒絕進(jìn)行反序列化,并返回一個錯誤。keyREPLACE選項,那么命令返回一個錯誤。更多信息可以參考DUMP命令。可用版本:>=2.6.0RedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵O(1)O(N*M)Nkey(sortedset)O(N*M*log(N))O(log(N))O(1)。#redis>SETgreeting"hello,dumpingworld!""\x00\x15hello,dumping#redis>RESTOREgreeting-again0"\x00\x15hello,dumpingworld!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"redis>GETgreeting-again"hello,dumpingworld!"#redis>RESTOREgreeting-again0"\x00\x15hello,dumpingworld!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"(error)ERRTargetkeynameisbusy.#redis>RESTOREgreeting-again0"\x00\x15hello,dumpingworld!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"REPLACE#redis>RESTOREfake-message0"hellomotomotoblahblah"(error)ERRDUMPpayloadversionorchecksumarewrongSORTkey[BYpattern][LIMIToffsetcount][GETpattern[GETpattern...]][ASC|DESC][ALPHA][STOREdestination]today_cost列表保存了今日的開銷金額,那么可以用SORT#redis>LPUSHtoday_cost301.510(integer)#redis>SORT1)#redis:6379>SORTtoday_cost1)2)3)4)因為SORT命令默認(rèn)排序?qū)ο鬄閿?shù)字,當(dāng)需要對字符串進(jìn)行排序時,需要顯式地在SORTALPHA#redis>LPUSHwebsite""(integer)1redis>LPUSHwebsite""(integer)2redis>LPUSHwebsite""(integer)3#默認(rèn)(按數(shù)字)redis>SORT#redis>SORTwebsiteLIMIToffsetcountoffsetcountoffset5(offset0表示沒有元素被跳過)#添加測試數(shù)據(jù),列表值為1指redis:6379>RPUSHrank1357(integer)redis:6379>RPUSHrank2468(integer)#返回列表中最小的5redis:6379>SORTrankLIMIT01)redis:6379>SORTrankLIMIT051)2)3)#redis:6379>LPUSHuid(integer)redis:6379>SETuser_name_1adminredis:6379>SETuser_level_1#redis:6379>LPUSHuid(integer)redis:6379>SETuser_name_2jackredis:6379>SETuser_level_210#redis:6379>LPUSHuid(integer)redis:6379>SETuser_name_3peterredis:6379>SETuser_level_325#redis:6379>LPUSHuid(integer)redis:6379>SETuser_name_4maryredis:6379>SETuser_level_470redis:6379>SORT # # # #比如說,以下代碼讓uid鍵按照user_level_{uid}redis:6379>SORTuidBY #jack,level= #peter,level= #mary,level= #admin,level=user_level_*是一個占位符,它先取出uid比如在對uid列表進(jìn)行排序時,程序就會先取出uid的值1、2、3、4,然后使用user_level_1user_level_2、user_level_3和user_level_4的值作為排序uiduiduser_name_{uid}redis:6379>SORTuidGET比如說,以下代碼先按user_level_{uid}來排序uid列表,再取出相應(yīng)的user_name_{uid}redis:6379>SORTuidBYuser_level_*GET #level= #level= #level= #level=SORTuidBYuser_level_*uiduser_level_{uid}user_name_{uid}redis:6379>SORTuidGETuser_level_*GET # ##uiduser_level_*user_name_*redis:6379>SORTuidGET#GETuser_level_*GET # # #redis:6379>SORTuidBYnot-exists-1)2)3)4)的獲取操作(類似于SQL數(shù)據(jù)庫的join關(guān)鍵字。redis:6379>SORTuidBYnot-exists-keyGET#GETuser_level_*GET # # #我們可以不將用戶的名字和級別保存在user_name_{uid}和user_level_{uid}兩個字符串鍵中,而是用nameleveluser_info_{uid}來保存用戶的名字和級別信息:redis:6379>HMSETuser_info_1nameadminlevel9999redis:6379>HMSETuser_info_2namejacklevel10redis:6379>HMSETuser_info_3namepeterlevel25redis:6379>HMSETuser_info_4namemarylevel70之后,BYGETkey->fieldkeyfieldredis:6379>SORTuidBYuser_info_*-1)2)3)4)redis:6379>SORTuidBYuser_info_*->levelGETuser_info_*-默認(rèn)情況下,SORT操作只是簡單地返回排序結(jié)果,并不進(jìn)行任何保存操作。如果被指定的key已存在,那么原有的值將被排序結(jié)果覆蓋。#redis:6379>RPUSHnumbers1357(integer)redis:6379>RPUSHnumbers2468(integer)redis:6379>LRANGEnumbers0-1)2)3)4)redis:6379>SORTnumbersSTOREsorted-numbers(integer)10#redis:6379>LRANGEsorted-numbers0-1)2)3)4)可以通過將SORT命令的執(zhí)行結(jié)果保存,并用EXPIRE為結(jié)果設(shè)置生存時間,以此來產(chǎn)生一個SORT操作這樣就可以避免對SORT操作的頻繁調(diào)用:只有當(dāng)結(jié)果集過期時,才需要再調(diào)用一次SORT另外,為了正確實現(xiàn)這一用法,你可能需要加鎖以避免多個客戶端同時進(jìn)行緩存重建(也就是多個客戶端,同一時間進(jìn)行SORT操作,并保存為結(jié)果集),具體參見SETNX命令。STORE參數(shù),返回排序結(jié)果的元素數(shù)量。TTLkey(TTL,timetolive)??捎冒姹荆?gt;=1.0.0key-2key-1。否則,以秒為單位,返回key的剩余生存時間。Note:Redis2.8keykey-1#不存在的(integer)-2#keyredis>SETkeyRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵(integer)-1#有剩余生存時間的redis>EXPIREkey10086(integer)1redis>TTLkey(integer)TYPEkey所儲存的值的類型。可用版本:>=1.0.0nonekey不存在)string(字符串)list(列表)set(集合)zset有序集)hash(哈希表#redis>SETweather"sunny"redis>TYPEweather#redis>LPUSHbook_list"programminginscala"(integer)1redis>TYPEbook_list#redis>SADDpat"dog"(integer)1redis>TYPEpatSCANcursor[MATCHpattern][COUNTSCAN命令及其相關(guān)的SSCAN命令、HSCAN命令和ZSCAN命令都用于增量地迭代(incrementallyiterate)一集元素(acollectionofelements:SCANSSCAN境,而不會出現(xiàn)像KEYS命令、SMEMBERS命令帶來的問題——當(dāng)KEYS命令被用于處理一個大的數(shù)據(jù)庫時,又或者SMEMBERS命令被用于處理一個大的集合鍵時,它們可能會阻塞服務(wù)器達(dá)數(shù)秒之久。不過,增量式迭代命令也不是沒有缺點(diǎn)的:舉個例子,使用SMEMBERS命令可以返回集合鍵當(dāng)前包含的所有元素,但是對于SCAN這類增量式迭代命令來說,因為在對鍵進(jìn)行增量式迭代的過程中,鍵可能會被修elements因為SCAN、SSCAN、HSCAN和ZSCAN四個命令的工作方式都非常相似,所以這個文檔會一并介紹這SSCAN命令、HSCAN命令和ZSCAN而SCAN命令則不需要在第一個參數(shù)提供任何數(shù)據(jù)庫鍵——因為它迭代的是當(dāng)前數(shù)據(jù)庫中的所有數(shù)據(jù)SCAN命令是一個基于游標(biāo)的迭代器(cursorbasediterator:SCAN命令每次被調(diào)用之后,都會向用戶返回一個新的游標(biāo),用戶在下次迭代時需要使用這個新游標(biāo)作為SCAN命令的游標(biāo)參數(shù),以此來延續(xù)之前的當(dāng)SCAN00的游以下是一個SCANredis:6379>scan1)1)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release1.21.1.21.ChapterChapter1.Key(鍵redis:6379>scan1)2)1)從上面的示例可以看到,SCAN命令的回復(fù)是一個包含兩個元素的數(shù)組,第一個數(shù)組元素是用于進(jìn)行下一在第二次調(diào)用SCAN0,這表示迭代已經(jīng)結(jié)束,整個數(shù)據(jù)集(collection)已經(jīng)被0作為游標(biāo)開始一次新的迭代,一直調(diào)用SCAN0,我們稱這個過程為一次完整遍歷(fulliteration。SCAN命令,以及其他增量式迭代命令,在進(jìn)行完整遍歷的情況下可以為用戶帶來以下保證:從完整遍歷元素,它從遍歷開始直到遍歷結(jié)束期間都存在于被遍歷的數(shù)據(jù)集當(dāng)中,那么SCAN命令總會在某次迭代中(undefined而對于一個足夠小的數(shù)據(jù)集來說,如果這個數(shù)據(jù)集的底層表示為編碼數(shù)據(jù)結(jié)構(gòu)(encodeddatastruc-(hint,COUNT10用MATCH選項,那么命令返回的元素數(shù)量通常和COUNT選項指定的一樣,或者比COUNT選項指定的和KEYSglob風(fēng)格的模式參數(shù),讓命令只返回和給定模式MATCH<pattern>參數(shù)來實現(xiàn)。以下是一個使用MATCHredis:6379>saddmyset123foofoobar(integer)redis:6379>sscanmyset0match1)2)1)redis:6379>scan0MATCH1)2)1)redis:6379>scan288MATCH1)2)(emptylistorredis:6379>scan224MATCH1)2)(emptylistorredis:6379>scan80MATCH1)2)(emptylistorredis:6379>scan176MATCH*11*COUNT1)1)(broken>=O(1)O(N),其中N為數(shù)據(jù)集中的元素數(shù)量。SCAN命令、SSCAN命令、HSCAN命令和ZSCANmulti-bulkmulti-bulkmulti-bulk回復(fù)包含了本次被迭代的元素。SCANSSCANZSCAN命令返回的每個元素都是一個有序集合元素,一個有序集合元素由一個成員(member)ChapterChapter2.String(字符串APPENDkeykey已經(jīng)存在并且是一個字符串,APPENDvaluekey原來的值的末尾。key不存在,APPENDkeyvalueSETkeyvalue一樣??捎冒姹荆?gt;=2.0.0value之后,key#對不存在的key執(zhí)行redis>EXISTS #(integer)redis>APPENDmyphone"nokia" (integer)5 #字符長度#"- #長度從5個字符增加到12(integer)"nokia-1110"APPEND(fixed-size)(sample)提供一種緊湊的表示方式,通常稱之為時間序列。APPENDtimeseries"fixed-sizeSTRLENRedisRedis命令參考,ReleaseRedisRedis命令參考,ReleaseGETRANGERedis2.6腳本和GETRANGESETRANGE串進(jìn)行修剪(tirm)的命令,但是,不管怎么說,這個模式的儲存方式還是可以節(jié)省下大量的空間。Note:UNIXkey因為保存過大的時(integer)4(integer)8redis>GETRANGEts0redis>GETRANGEts4BITCOUNTkey[start]startend參數(shù),可以讓計數(shù)只在特start和end參數(shù)的設(shè)置和GETRANGE命令類似,都可以使用負(fù)數(shù)值:比如-1表示最后一個位,而-可用版本:>=2.6.01redis>BITCOUNTbits(integer)0redis>SETBITbits0 #(integer)redis>BITCOUNTbits(integer)1redis>SETBITbits3 #(integer)redis>BITCOUNTbits(integer)2ChapterChapter2.String(字符串假設(shè)現(xiàn)在我們希望記錄自己網(wǎng)站上的用戶的上線頻率,比如說,計算用戶A上線了多少天,用戶B上線了多少天,諸如此類,以此作為數(shù)據(jù),從而決定讓哪些用戶參加beta測試等活動——這個模式可以使用SETBIT和BITCOUNT來實現(xiàn)。比如說,每當(dāng)用戶在某一天上線的時候,我們就使用SETBIT,以用戶名作為key,將那天所代表的網(wǎng)站offsetoffset1。1001peterSETBITpeter1011peter總共以來的上線次數(shù)時,就使用BITCOUNTBITCOUNTpeter,得出的結(jié)果就是peter上線的總天數(shù)。(墻外Fast,easyrealtimemetricsusingRedisbitmaps1010*365(bit),也即是每個456字節(jié)。對于這種大小的數(shù)據(jù)來說,BITCOUNT的處理速度就像GET和INCRO(1)復(fù)雜度的bitmapkeybitmapLua腳本可以很方便地完使用BITCOUNTstartend(accumu-lating)放到客戶端進(jìn)行,并且對結(jié)果進(jìn)行緩存(caching)。BITOPoperationdestkeykey[keykeydestkeyoperationAND、OR、NOT、XORBITOPANDdestkeykey[key...]keydestkeyBITOPORdestkeykey[key...]keydestkeyBITOPXORdestkeykey[key...]keydestkeyBITOPNOTdestkeykeykeydestkey。NOTkey作為輸入。當(dāng)BITOP0??盏膋ey也被看作是包含0的字符串序列。destkeykeyNote:BITOPO(N)(matrix)或者進(jìn)行大數(shù)據(jù)量的統(tǒng)計時,最好將任務(wù)指派到附屬節(jié)點(diǎn)(slave)進(jìn)行,避免阻塞主節(jié)點(diǎn)。redis>SETBITbits-10 #bits-1=(integer)redis>SETBITbits-13(integer)redis>SETBITbits-20 #bits-2=(integer)redis>SETBITbits-21(integer)redis>SETBITbits-23(integer)redis>BITOPANDand-resultbits-1bits-2(integer)1redis>GETBITand-result0 #and-result=1001(integer)1redis>GETBITand-result1(integer)0redis>GETBITand-result2(integer)0redis>GETBITand-result3(integer)1DECRkeykey0,然后再執(zhí)行DECR操作。本操作的值限制在64位(bit)有符號數(shù)字表示之內(nèi)。(increment)/(decrement)操作的更多信息,請參見INCR命令??捎冒姹荆?gt;=1.0.0DECRkeyRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter2.String(字符串#對存在的數(shù)字值key進(jìn)行redis>SETfailure_times10redis>DECRfailure_times(integer)9#對不存在的key值進(jìn)行redis>EXISTScount(integer)0redis>DECRcount(integer)-1#對存在但不是數(shù)值的key進(jìn)行redis>SETcompanyYOUR_CODE_SUCKS.LLCredis>DECR(error)ERRvalueisnotanintegeroroutofDECRBYkeykeydecrementkeykey0,然后再執(zhí)行DECRBY操作。64(bit)有符號數(shù)字表示之內(nèi)。(increment)/(decrement)操作的更多信息,請參見INCR命令??捎冒姹荆?gt;=1.0.0decrement之后,key#對已存在的key進(jìn)行redis>SETcount100redis>DECRBYcount20(integer)80#redis>EXISTSpages(integer)redis>DECRBYpages10(integer)-10GETkeynilkey儲存的值不是字符串類型,返回一個錯誤,因為GET只能用于處理字符串值??捎冒姹荆?gt;=1.0.0keynilkey的值。如果key不是字符串類型,那么返回一個錯誤。#keykeyredis>SETdbredisredis>GETdb#對不是字符串類型的key進(jìn)行redis>DELdb(integer)1redis>LPUSHdbredismongodbmysql(integer)3redis>GET(error)ERROperationagainstakeyholdingthewrongkindofGETBITkeykey(bit)offsetkey0??捎冒姹荆?gt;=2.2.0RedisRedis命令參考,ReleaseRedisRedis命令參考,Release 2.8.2.8.ChapterChapter2.String(字符串(bit)#對不存在的key或者不存在的offset進(jìn)行GETBIT,返回redis>EXISTSbit(integer)0redis>GETBITbit10086(integer)0#offsetGETBITredis>SETBITbit100861(integer)redis>GETBITbit10086(integer)1GETRANGEkeystartkeystartend(start在內(nèi))負(fù)數(shù)偏移量表示從字符串最后開始計數(shù),-1表示最后一個字符,-2GETRANGE(range)Note:<=2.0的版本里,GETRANGESUBSTR??捎冒姹荆?gt;=2.4.0redis>SETgreeting"hello,myfriend"redis>GETRANGEgreeting04 #0-44。redis>GETRANGEgreeting-1- #redis>GETRANGEgreeting-3- #redis>GETRANGEgreeting0- #"hello,myredis>GETRANGEgreeting0 #"hello,myGETSETkeykeyvaluekey(oldvalue)。當(dāng)key存在但不是字符串類型時,返回一個錯誤。1.0.0時間復(fù)雜度:O(1)keykey沒有舊值時,也即是,keynilredis>GETSETdbmongodb #nilredis>GETdbredis>GETSETdbredis #redis>GETdbGETSET可以和INCR(atomic)(counter)mycountkey調(diào)用INCR操作,通常我們還要在一個原子時間內(nèi)同時完成獲得計數(shù)器的值和將計數(shù)器值復(fù)位為0兩個操作。redis>INCRmycount(integer)11redis>GETSETmycount0#GETmycountSETmycount0redis>GET #INCRRedisRedis命令參考,ReleaseRedisRedis命令參考,Release 2.10.2.10.ChapterChapter2.String(字符串keykey0,然后再執(zhí)行INCR操作。本操作的值限制在64位(bit)有符號數(shù)字表示之內(nèi)。Note:Rediskey內(nèi)儲存的字符串被解釋為十進(jìn)制64位有符號整數(shù)來執(zhí)行INCR操作。INCRkeyredis>SETpage_view20redis>INCRpage_view(integer)21redis>GET #數(shù)字值在RedisRedis發(fā)送一個INCRpeter2012322INCRpeter::2012.3.22??梢酝ㄟ^組合使用INCR和EXPIRE(counting)客戶端可以通過使用GETSET命令原子性地獲取計數(shù)器的當(dāng)前值并將計數(shù)器清零,更多信息請參考GETSET命令。使用其他自增/自減操作,比如DECR和INCRBY,用戶可以通過執(zhí)行不同的操作增加或減少計數(shù)器APIAPI的最大請求數(shù)限制在每個IP地址每秒鐘十個之內(nèi):ts=CURRENT_UNIX_TIME()keyname=ip+":"+tsIFcurrent!=NULLANDcurrent>10ERROR"toomanyrequestsperEXPIRE(keyname,IP地址使用一個不同的計數(shù)器,并用EXPIRE(Redis就會注意,我們使用事務(wù)打包執(zhí)行INCR命令和EXPIRE命令,避免引入競條件,保證每次調(diào)用API時都可FUNCTIONcurrent=ERROR"toomanyrequestsper
value=INCR(ip)IFvalue==1THEN這個限速器只使用單個計數(shù)器,它的生存時間為一秒鐘,如果在一秒鐘內(nèi),這個計數(shù)器的值大于10的話,這個新的限速器在思路方面是沒有問題的,但它在實現(xiàn)方面不夠嚴(yán)謹(jǐn),如果我們仔細(xì)觀察一下的話,就會發(fā)現(xiàn)在INCREXPIRE之間存在著一個競條件,假如客戶端在執(zhí)INCR之后,因為某些原因比如客戶端失敗)而忘記設(shè)置EXPIRE的話,那么這個計數(shù)器就會一直存在下去,造成每個用戶只能訪問10次,噢,這簡直是個災(zāi)難!Redis2.6及以上的版本):localcurrent=redis.call("incr",KEYS[1])iftonumber(current)==1then通過將計數(shù)器作為腳本放到Redis上運(yùn)行,我們保證了INCR和EXPIRE兩個操作的原子性,現(xiàn)在這個腳RedisLua腳本的更多信息,請參考EVAL還有另一種消滅競條件的方法,就是使用Redis的列表結(jié)構(gòu)來代替INCR命令,這個方法無須腳本支持,因此它在Redis2.6以下的版本也可以運(yùn)行得很好:FUNCTIONcurrent=RedisRedis命令參考,ReleaseRedisRedis命令參考,Release 2.11.2.11.ChapterChapter2.String(字符串IFcurrent>10ERROR"toomanyrequestsper
IFEXISTS(ip)==FALSE
新的限速器使用了列表結(jié)構(gòu)作為容器,LLEN用于對訪問次數(shù)進(jìn)行檢查,一個事務(wù)包裹著RPUSH和EXPIRE兩個命令,用于在第一次執(zhí)行計數(shù)時創(chuàng)建列表,并正確設(shè)置地設(shè)置過期時間,最后,RPUSHXINCRBYkeykeyincrementkeykey0,然后再執(zhí)行INCRBY命令。本操作的值限制在64位(bit)有符號數(shù)字表示之內(nèi)。(increment)/(decrement)操作的更多信息,參見INCR命令。可用版本:>=1.0.0increment之后,key#keyredis>SETrank50(integer)70redis>GETrank#key(integer)0redis>INCRBYcounter30(integer)30redis>GET#keyredis>SETbook"longlongago..."redis>INCRBYbook(error)ERRvalueisnotanintegeroroutofINCRBYFLOATkeykeyincrementkey不存在,那么INCRBYFLOATkey0keyincrement2.0e7、3e5、90e-2(exponentialnotation)來表示,但是,執(zhí)行INCRBYFLOAT命令之后的值總是以同樣的形式儲存,也即是,它們總是由一個數(shù)字,一個(可選的)小數(shù)點(diǎn)和一個任意位的小數(shù)部分組成(比如3.14、69.768,諸如此類),0會被移除,如果有需要的話,還會將浮點(diǎn)數(shù)改為整數(shù)(3.03。除此之外,無論加法計算所得的浮點(diǎn)數(shù)的實際精度有多長,INCRBYFLOAT的計算結(jié)果也最多只能表示小key(Redis中的數(shù)字和浮點(diǎn)數(shù)都以字符串的形式保存,所以它們都屬于字keyincrement(parse)(doubleprecisionfloatingpointnumber)key#redis>SETmykey10.50#redis>SETmykey314e-2redis>GET #SETRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter2.String(字符串"314e-redis>INCRBYFLOATmykey #INCRBYFLOAT#redis>SETmykey3#后跟的0redis>SETmykey3.0redis>GETmykey #SET0redis>INCRBYFLOATmykey #但I(xiàn)NCRBYFLOAT會將無用的0MGETkey[key(一個或多個)keykeykeykeynil。因此,該命令永不失敗??捎冒姹荆?gt;=1.0.0時間復(fù)雜度:O(N),Nkeykeyredis>SETredisredis>MGETredisredis>MGETredismongodb #mysqlMSETkeyvalue[keyvaluekey-valuekey已經(jīng)存在,那么MSET會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用MSETNX命令:它只會在所有給定key都不存在的情況下進(jìn)行設(shè)置操作。MSET(atomic)keykey被更新而另一些給定key沒有改變的情況,不可能發(fā)生。(redis>MSETdate"2012.3.30"time"11:00a.m."weather"sunny"redis>MGETdatetime1)"11:00#redis>SETgoogle"google.hk"redis>MSETgoogle""redis>GETgoogleMSETNXkeyvalue[keyvaluekey-valuekeykey已存在,MSETNXkeyMSETNXkey(field)(uniquelogicobject),所有字段要么全被設(shè)置,要么全不被設(shè)置。key1key(key已經(jīng)存在)0RedisRedis命令參考,ReleaseRedisRedis命令參考,ReleaseChapterChapter2.String(字符串#對不存在的key進(jìn)行redis>MSETNXrmdbs"MySQL"nosql"MongoDB"key-value-store"redis"(integer)1redis>MGETrmdbsnosqlkey-value-#MSETkeyredis>MSETNXrmdbs"Sqlite"language"python"#rmdbs(integer)redis>EXISTS #MSET是原子性操作,language(integer)redis>GET #rmdbsPSETEXkeymilliseconds這個命令和SETEXkey的生存時間,而不是像SETEX命令那樣,以秒返回值:OKredis>PSETEXmykey1000"Hello"redis>PTTLmykey(integer)999SETkeyvalue[EXseconds][PXmilliseconds]valuekeykey已經(jīng)持有其他值,SET對于某個原本帶有生存時間(TTL)的鍵來說,當(dāng)SETTTL將Redis2.6.12版本開始,SETEXsecondsecond秒。SETkeyvalueEXsecondSETEXkeysecondvalue。PXmillisecondmillisecond毫秒。SETkeyvaluePXmillisecond效果PSETEXkeymillisecondvalue。Note:因為SET命令可以通過參數(shù)來實現(xiàn)和SETNX、SETEX和PSETEXRedis版本可能會廢棄并最終移除SETNX、SETEX和PSETEXRedis2.6.12版本以前,SETOKReply#redis:6379>SETkey"value"redis:6379>GETkey#redis:6379>SETkey"new-value"redis:6379>GETkey#EXredis:6379>SETkey-with-expire-time"hello"EX10086redis:6379>GETkey-with-expire-timeredis:6379>TTLkey-with-expire-time(integer)10069#PXRedisRedis命令參考,ReleaseRedisRedis命令參考,Release 2.17.2.17.ChapterChapter2.String(字符串redis:6379>SETkey-with-pexpire-time"moto"PX123321redis:6379>GETkey-with-pexpire-timeredis:6379>PTTLkey-with-pexpire-time(integer)111939#NXredis:6379>SETnot-exists-key"value"NX #鍵不存在,設(shè)置成功redis:6379>GETnot-exists-keyredis:6379>SETnot-exists-key"new-value"NX #鍵已經(jīng)存在,設(shè)置失敗redis:6379>GEtnot-exists-key"value"#維持原值不變#XXredis:6379>EXISTSexists-key(integer)0redis:6379>SETexists-key"value"XX #因為鍵不存在,設(shè)置失敗redis:6379>SETexists-key #redis:6379>SETexists-key"new-value"XX #設(shè)置新值成功redis:6379>GETexists-key#NXXXEXPXredis:6379>SETkey-with-expire-and-NX"hello"EX10086NXredis:6379>GETkey-with-expire-and-NXredis:6379>TTLkey-with-expire-and-NX(integer)10063redis:6379>SETkey-with-pexpire-and-XX"oldvalue"redis:6379>SETkey-with-pexpire-and-XX"newvalue"PXredis:6379>GETkey-with-pexpire-and-XX"newvalue"redis:6379>PTTLkey-with-pexpire-and-XX(integer)112999#EXPXredis:6379>SETkey"value"EX1000PX5000000redis:6379>TTLkey(integer)4993#PX參數(shù)設(shè)置的值redis:6379>SETanother-key"value"PX5000000EX1000redis:6379>TTLanother-key(integer) #EXSETresource-nameanystringNXEXmax-lock-timeRedis中實現(xiàn)鎖的簡單方法。(token不使用DELLua腳本,這個腳本只在客戶端傳入的值和鍵的口令串相ifredis.call("get",KEYS[1])==returnreturnEVAL...script...1resource-nametoken-valueRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter2.String(字符串SETBITkeyoffsetkey(bit)。value01。(grown)value保存在指定的偏移量上。當(dāng)字符串值進(jìn)行伸展時,空白位置以0填充。offset02^32(bit512MB之內(nèi))考SETRANGE命令,warning(警告)部分。時間復(fù)雜度:redis>SETBITbit10086(integer)redis>GETBITbit10086(integer)1redis>GETBITbit100 (integer)0SETEXkeysecondsvaluekeykeyseconds(以秒為單位)。key已經(jīng)存在,SETEX命令將覆寫舊值。SETkeyEXPIREkeyseconds#不同之處是,SETEX(atomic)操作,關(guān)聯(lián)值和設(shè)置生存時間兩個動作會在同一時間內(nèi)完成,該命令在Redis用作緩存時,非常實用。2.0.0時間復(fù)雜度:O(1)OKseconds#在key不存在時進(jìn)行redis>SETEXcache_user_id6010086redis>GETcache_user_id#redis>TTLcache_user_id#(integer)#key已經(jīng)存在時,SETEXredis>SETcd"timeless"redis>SETEXcd3000"goodbyemylove"redis>GETcd"goodbyemylove"redis>TTLcd(integer)SETNXkeykeyvaluekey不存在。key已經(jīng)存在,則SETNX不做任何動作。SETNX是『SETifNoteXists』(SET)的簡寫??捎冒姹荆?gt;=1.0.010redis>EXISTS #job(integer)redis>SETNXjob #job(integer)redis>SETNXjob"code- #job(integer)redis>GET #RedisRedis命令參考,ReleaseRedisRedis命令參考,Release 2.21.2.21.ChapterChapter2.String(字符串SETRANGEkeyoffsetvalue(overwrite)keyoffset開始。key當(dāng)作空白字符串處理。SETRANGEvaluekey原來儲存的字(5offset10),那么原字符和偏移量之間(zerobytes,"\x00")來填充。2^29-1(536870911)Redis512Warning:Warning:當(dāng)生成一個很長的字符串時,Redis需要分配內(nèi)存空間,該操作有時候可能會造成服務(wù)器阻(block)2010MacbookPro536870911(512MB內(nèi)存分配)300毫134217728(128MB內(nèi)存分配)8033554432(32MB內(nèi)存分配)308388608(8MB內(nèi)存分配)8毫秒。注意若首次內(nèi)存分配成功之后,再對同一個key調(diào)用SETRANGE操作,無須再重新內(nèi)存。(small)O(1)。(關(guān)于什么字符串是”小”的,請參考APPEND命令)O(M),Mvalue參數(shù)的長度。返回值:被SETRANGE#對非空字符串進(jìn)行redis>SETgreeting"helloworld"(integer)11redis>GETgreeting"helloRedis"#對空字符串/不存在的key進(jìn)行redis>EXISTSempty_string(integer)0redis>SETRANGEempty_string5"Redis!" #(integer)11redis>GET #空白處被"\x00"因為有了SETRANGE和GETRANGERedisO(1)隨機(jī)訪問時間的線性數(shù)組,這在很多真實用例中都是非??焖偾腋咝У膬Υ娣绞?,具體請參考APPEND命令的『模式:時間序列』STRLEN可用版本:>=2.2.0key0#redis>SETmykey"Helloworld"(integer)11#不存在的key長度為redis>STRLENnonexisting(integer)0ChapterChapter3.Hash(哈希表HDELkeyfield[field Redis2.4以下的版本里,HDEL每次只能刪除單個域,如果你需要在一個原子時間內(nèi)刪除多個域,請將命令包含在MULTI/EXEC塊內(nèi)。:返回值:#redis>HGETALL#redis>HDELabbra(integer)1#redis>HDELabbrnot-exists-field(integer)0#RedisRedis命令參考,Release RedisRedis命令參考,Release(integer)2redis>HGETALLHEXISTSkeykeyfield是否存在??捎冒姹荆?gt;=2.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 26189.2-2024工作場所照明第2部分:室外作業(yè)場所的安全保障照明要求
- Mevalonolactone-生命科學(xué)試劑-MCE-8562
- 二零二五年度版股東借款合同爭議調(diào)解與賠償協(xié)議書
- 二零二五年度電商平臺跨境電商稅收籌劃合作協(xié)議
- 二零二五年度特色小吃店整體轉(zhuǎn)讓合同
- 2025年度航空航天維修與服務(wù)版勞動合同
- 施工組織設(shè)計對土木工程項目的重要性探討
- 施工日志填寫樣本施工質(zhì)量檢查與驗收記錄
- 科技前沿電子產(chǎn)品的設(shè)計與制造新趨勢
- 營銷策略與學(xué)校品牌形象塑造探討
- 高考百日誓師動員大會
- 賈玲何歡《真假老師》小品臺詞
- 2024年北京東城社區(qū)工作者招聘筆試真題
- 《敏捷項目管理》課件
- 統(tǒng)編版(2024新版)七年級上學(xué)期道德與法治期末綜合測試卷(含答案)
- 黑龍江省哈爾濱市2024屆中考數(shù)學(xué)試卷(含答案)
- 前程無憂測評題庫及答案
- 高三日語一輪復(fù)習(xí)助詞「と」的用法課件
- 物業(yè)管理服務(wù)房屋及公用設(shè)施維修養(yǎng)護(hù)方案
- 醫(yī)療器械法規(guī)培訓(xùn)
- 無子女離婚協(xié)議書范文百度網(wǎng)盤
評論
0/150
提交評論