版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(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)該用哪一個(gè) RDB快 AOF重 AOF有多耐久 如果AOF文件出錯(cuò)了,怎么辦 AOF的運(yùn)作方 怎么從RDB持久化切換到AOF持久 RDB和AOF之間的相互作 備份Redis數(shù) TILT模 使用redis-rb-cluster編寫一個(gè)示例應(yīng) Redis集群規(guī) MOVED轉(zhuǎn) ASK轉(zhuǎn) 發(fā)布/訂閱(已實(shí)現(xiàn),但仍然需要改善 附錄A:CRC16算法的ANSI實(shí)現(xiàn)參 ChapterChapter1.Key(鍵DELkey[keykey。不存在的key會被忽略。key#刪除單個(gè)redis>SETnamehuangz(integer)1#刪除一個(gè)不存在的redis>EXISTSphone(integer)0redis>DELphone#key(integer)#同時(shí)刪除多個(gè)keyredis>SETname"redis"RedisRedis命令參考,Release RedisRedis命令參考,Releaseredis>SETtype"key-valuestore"redis>SETwebsite""redis>DELnametypewebsite(integer)3DUMPkey,并返回被序列化的值,使用RESTORERedis鍵。64位的校驗(yàn)和,用于檢測錯(cuò)誤,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),它會被自動(dòng)刪除。Rediskey被稱為『易失的』(volatile)。生存時(shí)間可以通過使用DELkey來移除,或者被SET和GETSET(overwrite),這意味著,如果一個(gè)命令只是修改(alter)一個(gè)帶生存時(shí)間的key的值而不是用一個(gè)新的key值來代替(replace)它的話,那么生存時(shí)間不會被改變。key執(zhí)行INCR命令,對一個(gè)列表進(jìn)行LPUSH命令,或者對一個(gè)哈希表執(zhí)行HSET命令,這類操作都不會修改key本身的生存時(shí)間。另一方面,如果使用RENAMEkeykeyRENAMEkeyanother_key(以及它的生存時(shí)間)keyanother_key,因此,新another_keykey一樣。使用PERSISTkeykeykey(persistent)keykey執(zhí)行EXPIRE命令,新指定的生存時(shí)間會取代舊的生存時(shí)間。Redis2.41key已經(jīng)過期,但它還是可能在過期Redis2.61毫秒之內(nèi)。Redis2.1.3Redis2.1.3keykey被刪除,這一行為是受當(dāng)時(shí)復(fù)制(replication)層的限制而作出的,現(xiàn)在這一限制已經(jīng)被修復(fù)。1.0.0時(shí)間復(fù)雜度:O(1)1keykey(2.1.3Rediskey的生存時(shí)間),返回0。redis>SETcache_page""redis>EXPIREcache_page30#設(shè)置過期時(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)用戶重新開始閱覽的時(shí)候,系統(tǒng)又會重新EXPIREATkeyEXPIREAT的作用和EXPIREkey不同在于EXPIREATUNIX(unixtimestamp)??捎冒姹荆?gt;=1.2.01key0redis>SETcacheredis>EXPIREATcache #這個(gè)key將在2012.12.12(integer)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release redis>TTLcache(integer)45081860KEYSpatternkeyKEYSh?llohello,hallohxlloKEYSh*llohlloheeeeelloKEYSh[ae]llohellohallohilloWarning:Warning:KEYS的速度非??欤谝粋€(gè)大的數(shù)據(jù)庫中使用它仍然可能造成性能問題,如果你需要從keyRedis(set)來代替。返回值:符合給定模式的key列表。redis>MSETone1two2three3four4#4keyredis>KEYSredis>KEYSredis>KEYSredis>KEYS*#MIGRATEhostportkeydestination-dbtimeout[COPY]key原子性地從當(dāng)前實(shí)例傳送到目標(biāo)實(shí)例的指定數(shù)據(jù)庫上,一旦傳送成功,key保證會出現(xiàn)在目標(biāo)實(shí)例上,而當(dāng)前實(shí)例上的key會被刪除。 RedisRedis命令參考,Release RedisRedis命令參考,ReleaseChapterChapter1.Key(鍵這個(gè)命令是一個(gè)原子操作,它在執(zhí)行的時(shí)候會阻塞進(jìn)行遷移的兩個(gè)實(shí)例,直到以下任意結(jié)果發(fā)生:遷移成功,遷移失敗,等到超時(shí)。key執(zhí)行DUMP目標(biāo)實(shí)例再使用RESTORE對數(shù)據(jù)進(jìn)行反序列化,并將反序列化所得的數(shù)據(jù)添加到數(shù)據(jù)庫中;當(dāng)前實(shí)例就RESTORE命令返回OK,它就會調(diào)用DEL刪除自己數(shù)據(jù)庫上的keytimeouttimeoutMIGRATEIOIO錯(cuò)誤,或者達(dá)到了超時(shí)時(shí)間,那么命令會停止執(zhí)行,并返回一個(gè)特殊的錯(cuò)誤:IOERR。keykey,因此,如果一個(gè)客戶端執(zhí)行MIGRATE如果有其他錯(cuò)誤發(fā)生,那么MIGRATEkey(當(dāng)然,目標(biāo)實(shí)例的給定數(shù)據(jù)庫上可能有和key同名的鍵,不過這和MIGRATE命令沒有關(guān)系。可用版本:>=2.6.0這個(gè)命令在源實(shí)例上實(shí)際執(zhí)行DUMP命令和DEL命令,在目標(biāo)實(shí)例執(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移動(dòng)到數(shù)據(jù)庫1redis>MOVEfavorite_fruit #(integer)redis>GET #數(shù)據(jù)庫0的favorite_fruitredis>SELECT1redis:1>GET #數(shù)據(jù)庫1的favorite_fruitOBJECTsubcommand[argumentsOBJECTkeyRedisRedis用作緩存程序時(shí),你也可以通過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時(shí)間復(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)換成『持久的』(一個(gè)不帶生存時(shí)間、永不過期的key)。2.2.0時(shí)間復(fù)雜度:O(1)1keykey0redis>SETmykey"Hello"redis>EXPIREmykey10#key(integer)redis>TTLmykey(integer)10redis>PERSIST #移除key(integer)redis>TTLmykey(integer)-1PEXPIREkey這個(gè)命令和EXPIREkey的生存時(shí)間,而不像EXPIRE命令那2.6.0時(shí)間復(fù)雜度:O(1)redis>SETmykey"Hello"redis>PEXPIREmykey1500(integer)1redis>TTL #TTL(integer)redis>PTTL #(integer)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵PEXPIREATkeymilliseconds-這個(gè)命令和EXPIREATkeyunix時(shí)間戳,而不是像EXPIREAT2.6.0時(shí)間復(fù)雜度:O(1)1key0。(查看EXPIRE命令獲取更多信息redis>SETmykey"Hello"redis>PEXPIREATmykey1555555555005(integer)1redis>TTL #TTL(integer)redis>PTTL #PTTL(integer)PTTL這個(gè)命令類似于TTLkey的剩余生存時(shí)間,而不是像TTL命令那樣,以秒為key-2key-1。否則,以毫秒為單位,返回key的剩余生存時(shí)間。Note:Redis2.8keykey-1#不存在的(integer)-2#keyredis>SETkeyvalue(integer)-1#有剩余生存時(shí)間的redis>PEXPIREkey10086(integer)1redis>PTTLkey(integer)6179(不刪除key??捎冒姹荆?gt;=1.0.0key。當(dāng)數(shù)據(jù)庫為空時(shí),返回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)存在時(shí),RENAME命令將覆蓋舊值。#keynewkeyredis>SETmessage"helloworld"redis>RENAMEmessagegreetingredis>EXISTS #message(integer)redis>EXISTS #greeting(integer)#keyredis>RENAMEfake_keynever_exists(error)ERRnosuchkey#newkey已存在時(shí),RENAME會覆蓋舊redis>SETpc"lenovo"redis>SETpersonal_computer"dell"redis:1>GET #dellRENAMENXkey當(dāng)key不存在時(shí),返回一個(gè)錯(cuò)誤。1.0.0時(shí)間復(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)行反序列化,并返回一個(gè)錯(cuò)誤。keyREPLACE選項(xiàng),那么命令返回一個(gè)錯(cuò)誤。更多信息可以參考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)因?yàn)镾ORT命令默認(rèn)排序?qū)ο鬄閿?shù)字,當(dāng)需要對字符串進(jìn)行排序時(shí),需要顯式地在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_*是一個(gè)占位符,它先取出uid比如在對uid列表進(jìn)行排序時(shí),程序就會先取出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}兩個(gè)字符串鍵中,而是用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è)置生存時(shí)間,以此來產(chǎn)生一個(gè)SORT操作這樣就可以避免對SORT操作的頻繁調(diào)用:只有當(dāng)結(jié)果集過期時(shí),才需要再調(diào)用一次SORT另外,為了正確實(shí)現(xiàn)這一用法,你可能需要加鎖以避免多個(gè)客戶端同時(shí)進(jìn)行緩存重建(也就是多個(gè)客戶端,同一時(shí)間進(jìn)行SORT操作,并保存為結(jié)果集),具體參見SETNX命令。STORE參數(shù),返回排序結(jié)果的元素?cái)?shù)量。TTLkey(TTL,timetolive)??捎冒姹荆?gt;=1.0.0key-2key-1。否則,以秒為單位,返回key的剩余生存時(shí)間。Note:Redis2.8keykey-1#不存在的(integer)-2#keyredis>SETkeyRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter1.Key(鍵(integer)-1#有剩余生存時(shí)間的redis>EXPIREkey10086(integer)1redis>TTLkey(integer)TYPEkey所儲存的值的類型??捎冒姹荆?gt;=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命令被用于處理一個(gè)大的數(shù)據(jù)庫時(shí),又或者SMEMBERS命令被用于處理一個(gè)大的集合鍵時(shí),它們可能會阻塞服務(wù)器達(dá)數(shù)秒之久。不過,增量式迭代命令也不是沒有缺點(diǎn)的:舉個(gè)例子,使用SMEMBERS命令可以返回集合鍵當(dāng)前包含的所有元素,但是對于SCAN這類增量式迭代命令來說,因?yàn)樵趯︽I進(jìn)行增量式迭代的過程中,鍵可能會被修elements因?yàn)镾CAN、SSCAN、HSCAN和ZSCAN四個(gè)命令的工作方式都非常相似,所以這個(gè)文檔會一并介紹這SSCAN命令、HSCAN命令和ZSCAN而SCAN命令則不需要在第一個(gè)參數(shù)提供任何數(shù)據(jù)庫鍵——因?yàn)樗氖钱?dāng)前數(shù)據(jù)庫中的所有數(shù)據(jù)SCAN命令是一個(gè)基于游標(biāo)的迭代器(cursorbasediterator:SCAN命令每次被調(diào)用之后,都會向用戶返回一個(gè)新的游標(biāo),用戶在下次迭代時(shí)需要使用這個(gè)新游標(biāo)作為SCAN命令的游標(biāo)參數(shù),以此來延續(xù)之前的當(dāng)SCAN00的游以下是一個(gè)SCANredis:6379>scan1)1)RedisRedis命令參考,ReleaseRedisRedis命令參考,Release1.21.1.21.ChapterChapter1.Key(鍵redis:6379>scan1)2)1)從上面的示例可以看到,SCAN命令的回復(fù)是一個(gè)包含兩個(gè)元素的數(shù)組,第一個(gè)數(shù)組元素是用于進(jìn)行下一在第二次調(diào)用SCAN0,這表示迭代已經(jīng)結(jié)束,整個(gè)數(shù)據(jù)集(collection)已經(jīng)被0作為游標(biāo)開始一次新的迭代,一直調(diào)用SCAN0,我們稱這個(gè)過程為一次完整遍歷(fulliteration。SCAN命令,以及其他增量式迭代命令,在進(jìn)行完整遍歷的情況下可以為用戶帶來以下保證:從完整遍歷元素,它從遍歷開始直到遍歷結(jié)束期間都存在于被遍歷的數(shù)據(jù)集當(dāng)中,那么SCAN命令總會在某次迭代中(undefined而對于一個(gè)足夠小的數(shù)據(jù)集來說,如果這個(gè)數(shù)據(jù)集的底層表示為編碼數(shù)據(jù)結(jié)構(gòu)(encodeddatastruc-(hint,COUNT10用MATCH選項(xiàng),那么命令返回的元素?cái)?shù)量通常和COUNT選項(xiàng)指定的一樣,或者比COUNT選項(xiàng)指定的和KEYSglob風(fēng)格的模式參數(shù),讓命令只返回和給定模式MATCH<pattern>參數(shù)來實(shí)現(xiàn)。以下是一個(gè)使用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ù)集中的元素?cái)?shù)量。SCAN命令、SSCAN命令、HSCAN命令和ZSCANmulti-bulkmulti-bulkmulti-bulk回復(fù)包含了本次被迭代的元素。SCANSSCANZSCAN命令返回的每個(gè)元素都是一個(gè)有序集合元素,一個(gè)有序集合元素由一個(gè)成員(member)ChapterChapter2.String(字符串APPENDkeykey已經(jīng)存在并且是一個(gè)字符串,APPENDvaluekey原來的值的末尾。key不存在,APPENDkeyvalueSETkeyvalue一樣??捎冒姹荆?gt;=2.0.0value之后,key#對不存在的key執(zhí)行redis>EXISTS #(integer)redis>APPENDmyphone"nokia" (integer)5 #字符長度#"- #長度從5個(gè)字符增加到12(integer)"nokia-1110"APPEND(fixed-size)(sample)提供一種緊湊的表示方式,通常稱之為時(shí)間序列。APPENDtimeseries"fixed-sizeSTRLENRedisRedis命令參考,ReleaseRedisRedis命令參考,ReleaseGETRANGERedis2.6腳本和GETRANGESETRANGE串進(jìn)行修剪(tirm)的命令,但是,不管怎么說,這個(gè)模式的儲存方式還是可以節(jié)省下大量的空間。Note:UNIXkey因?yàn)楸4孢^大的時(shí)(integer)4(integer)8redis>GETRANGEts0redis>GETRANGEts4BITCOUNTkey[start]startend參數(shù),可以讓計(jì)數(shù)只在特start和end參數(shù)的設(shè)置和GETRANGE命令類似,都可以使用負(fù)數(shù)值:比如-1表示最后一個(gè)位,而-可用版本:>=2.6.01redis>BITCOUNTbits(integer)0redis>SETBITbits0 #(integer)redis>BITCOUNTbits(integer)1redis>SETBITbits3 #(integer)redis>BITCOUNTbits(integer)2ChapterChapter2.String(字符串假設(shè)現(xiàn)在我們希望記錄自己網(wǎng)站上的用戶的上線頻率,比如說,計(jì)算用戶A上線了多少天,用戶B上線了多少天,諸如此類,以此作為數(shù)據(jù),從而決定讓哪些用戶參加beta測試等活動(dòng)——這個(gè)模式可以使用SETBIT和BITCOUNT來實(shí)現(xiàn)。比如說,每當(dāng)用戶在某一天上線的時(shí)候,我們就使用SETBIT,以用戶名作為key,將那天所代表的網(wǎng)站offsetoffset1。1001peterSETBITpeter1011peter總共以來的上線次數(shù)時(shí),就使用BITCOUNTBITCOUNTpeter,得出的結(jié)果就是peter上線的總天數(shù)。(墻外Fast,easyrealtimemetricsusingRedisbitmaps1010*365(bit),也即是每個(gè)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)計(jì)時(shí),最好將任務(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儲存的值不是字符串類型,返回一個(gè)錯(cuò)誤,因?yàn)镚ET只能用于處理字符串值??捎冒姹荆?gt;=1.0.0keynilkey的值。如果key不是字符串類型,那么返回一個(gè)錯(cuò)誤。#keykeyredis>SETdbredisredis>GETdb#對不是字符串類型的key進(jìn)行redis>DELdb(integer)1redis>LPUSHdbredismongodbmysql(integer)3redis>GET(error)ERROperationagainstakeyholdingthewrongkindofGETBITkeykey(bit)offsetkey0。可用版本:>=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ù)偏移量表示從字符串最后開始計(jì)數(shù),-1表示最后一個(gè)字符,-2GETRANGE(range)Note:<=2.0的版本里,GETRANGESUBSTR。可用版本:>=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存在但不是字符串類型時(shí),返回一個(gè)錯(cuò)誤。1.0.0時(shí)間復(fù)雜度:O(1)keykey沒有舊值時(shí),也即是,keynilredis>GETSETdbmongodb #nilredis>GETdbredis>GETSETdbredis #redis>GETdbGETSET可以和INCR(atomic)(counter)mycountkey調(diào)用INCR操作,通常我們還要在一個(gè)原子時(shí)間內(nèi)同時(shí)完成獲得計(jì)數(shù)器的值和將計(jì)數(shù)器值復(fù)位為0兩個(gè)操作。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ā)送一個(gè)INCRpeter2012322INCRpeter::2012.3.22。可以通過組合使用INCR和EXPIRE(counting)客戶端可以通過使用GETSET命令原子性地獲取計(jì)數(shù)器的當(dāng)前值并將計(jì)數(shù)器清零,更多信息請參考GETSET命令。使用其他自增/自減操作,比如DECR和INCRBY,用戶可以通過執(zhí)行不同的操作增加或減少計(jì)數(shù)器APIAPI的最大請求數(shù)限制在每個(gè)IP地址每秒鐘十個(gè)之內(nèi):ts=CURRENT_UNIX_TIME()keyname=ip+":"+tsIFcurrent!=NULLANDcurrent>10ERROR"toomanyrequestsperEXPIRE(keyname,IP地址使用一個(gè)不同的計(jì)數(shù)器,并用EXPIRE(Redis就會注意,我們使用事務(wù)打包執(zhí)行INCR命令和EXPIRE命令,避免引入競條件,保證每次調(diào)用API時(shí)都可FUNCTIONcurrent=ERROR"toomanyrequestsper
value=INCR(ip)IFvalue==1THEN這個(gè)限速器只使用單個(gè)計(jì)數(shù)器,它的生存時(shí)間為一秒鐘,如果在一秒鐘內(nèi),這個(gè)計(jì)數(shù)器的值大于10的話,這個(gè)新的限速器在思路方面是沒有問題的,但它在實(shí)現(xiàn)方面不夠嚴(yán)謹(jǐn),如果我們仔細(xì)觀察一下的話,就會發(fā)現(xiàn)在INCREXPIRE之間存在著一個(gè)競條件,假如客戶端在執(zhí)INCR之后,因?yàn)槟承┰虮热缈蛻舳耸?而忘記設(shè)置EXPIRE的話,那么這個(gè)計(jì)數(shù)器就會一直存在下去,造成每個(gè)用戶只能訪問10次,噢,這簡直是個(gè)災(zāi)難!Redis2.6及以上的版本):localcurrent=redis.call("incr",KEYS[1])iftonumber(current)==1then通過將計(jì)數(shù)器作為腳本放到Redis上運(yùn)行,我們保證了INCR和EXPIRE兩個(gè)操作的原子性,現(xiàn)在這個(gè)腳RedisLua腳本的更多信息,請參考EVAL還有另一種消滅競條件的方法,就是使用Redis的列表結(jié)構(gòu)來代替INCR命令,這個(gè)方法無須腳本支持,因此它在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)行檢查,一個(gè)事務(wù)包裹著RPUSH和EXPIRE兩個(gè)命令,用于在第一次執(zhí)行計(jì)數(shù)時(shí)創(chuàng)建列表,并正確設(shè)置地設(shè)置過期時(shí)間,最后,RPUSHXINCRBYkeykeyincrementkeykey0,然后再執(zhí)行INCRBY命令。本操作的值限制在64位(bit)有符號數(shù)字表示之內(nèi)。(increment)/(decrement)操作的更多信息,參見INCR命令??捎冒姹荆?gt;=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命令之后的值總是以同樣的形式儲存,也即是,它們總是由一個(gè)數(shù)字,一個(gè)(可選的)小數(shù)點(diǎn)和一個(gè)任意位的小數(shù)部分組成(比如3.14、69.768,諸如此類),0會被移除,如果有需要的話,還會將浮點(diǎn)數(shù)改為整數(shù)(3.03。除此之外,無論加法計(jì)算所得的浮點(diǎn)數(shù)的實(shí)際精度有多長,INCRBYFLOAT的計(jì)算結(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(一個(gè)或多個(gè))keykeykeykeynil。因此,該命令永不失敗??捎冒姹荆?gt;=1.0.0時(shí)間復(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這個(gè)命令和SETEXkey的生存時(shí)間,而不是像SETEX命令那樣,以秒返回值:OKredis>PSETEXmykey1000"Hello"redis>PTTLmykey(integer)999SETkeyvalue[EXseconds][PXmilliseconds]valuekeykey已經(jīng)持有其他值,SET對于某個(gè)原本帶有生存時(shí)間(TTL)的鍵來說,當(dāng)SETTTL將Redis2.6.12版本開始,SETEXsecondsecond秒。SETkeyvalueEXsecondSETEXkeysecondvalue。PXmillisecondmillisecond毫秒。SETkeyvaluePXmillisecond效果PSETEXkeymillisecondvalue。Note:因?yàn)镾ET命令可以通過參數(shù)來實(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 #因?yàn)殒I不存在,設(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中實(shí)現(xiàn)鎖的簡單方法。(token不使用DELLua腳本,這個(gè)腳本只在客戶端傳入的值和鍵的口令串相ifredis.call("get",KEYS[1])==returnreturnEVAL...script...1resource-nametoken-valueRedisRedis命令參考,ReleaseRedisRedis命令參考,Release ChapterChapter2.String(字符串SETBITkeyoffsetkey(bit)。value01。(grown)value保存在指定的偏移量上。當(dāng)字符串值進(jìn)行伸展時(shí),空白位置以0填充。offset02^32(bit512MB之內(nèi))考SETRANGE命令,warning(警告)部分。時(shí)間復(fù)雜度:redis>SETBITbit10086(integer)redis>GETBITbit10086(integer)1redis>GETBITbit100 (integer)0SETEXkeysecondsvaluekeykeyseconds(以秒為單位)。key已經(jīng)存在,SETEX命令將覆寫舊值。SETkeyEXPIREkeyseconds#不同之處是,SETEX(atomic)操作,關(guān)聯(lián)值和設(shè)置生存時(shí)間兩個(gè)動(dòng)作會在同一時(shí)間內(nèi)完成,該命令在Redis用作緩存時(shí),非常實(shí)用。2.0.0時(shí)間復(fù)雜度:O(1)OKseconds#在key不存在時(shí)進(jìn)行redis>SETEXcache_user_id6010086redis>GETcache_user_id#redis>TTLcache_user_id#(integer)#key已經(jīng)存在時(shí),SETEXredis>SETcd"timeless"redis>SETEXcd3000"goodbyemylove"redis>GETcd"goodbyemylove"redis>TTLcd(integer)SETNXkeykeyvaluekey不存在。key已經(jīng)存在,則SETNX不做任何動(dòng)作。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)生成一個(gè)很長的字符串時(shí),Redis需要分配內(nèi)存空間,該操作有時(shí)候可能會造成服務(wù)器阻(block)2010MacbookPro536870911(512MB內(nèi)存分配)300毫134217728(128MB內(nèi)存分配)8033554432(32MB內(nèi)存分配)308388608(8MB內(nèi)存分配)8毫秒。注意若首次內(nèi)存分配成功之后,再對同一個(gè)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"因?yàn)橛辛薙ETRANGE和GETRANGERedisO(1)隨機(jī)訪問時(shí)間的線性數(shù)組,這在很多真實(shí)用例中都是非??焖偾腋咝У膬Υ娣绞剑唧w請參考APPEND命令的『模式:時(shí)間序列』STRLEN可用版本:>=2.2.0key0#redis>SETmykey"Helloworld"(integer)11#不存在的key長度為redis>STRLENnonexisting(integer)0ChapterChapter3.Hash(哈希表HDELkeyfield[field Redis2.4以下的版本里,HDEL每次只能刪除單個(gè)域,如果你需要在一個(gè)原子時(shí)間內(nèi)刪除多個(gè)域,請將命令包含在MULTI/EXEC塊內(nèi)。:返回值:#redis>HGETALL#redis>HDELabbra(integer)1#redis>HDELabbrnot-exists-field(integer)0#RedisRedis命令參考,Release RedisRedis命令參考,Release(integer)2redis>HGETALLHEXISTSkeykeyfield是否存在。可用版本:>=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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年某服裝設(shè)計(jì)與某紡織廠關(guān)于環(huán)保材料應(yīng)用的合作協(xié)議
- 2024-2030年中國衛(wèi)生消毒場運(yùn)行狀況及投資發(fā)展前景預(yù)測報(bào)告
- 2024年度養(yǎng)老機(jī)構(gòu)與專業(yè)護(hù)理團(tuán)隊(duì)合作協(xié)議3篇
- 2024上海應(yīng)屆生落戶離職賠償金計(jì)算及協(xié)議3篇
- 2024年版房地產(chǎn)項(xiàng)目開發(fā)合作合同樣本版B版
- 珠海城市職業(yè)技術(shù)學(xué)院實(shí)訓(xùn)室安全事故應(yīng)急處置管理辦法(已發(fā)文)
- 滿洲里俄語職業(yè)學(xué)院《軟件工程原理與應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025技術(shù)咨詢標(biāo)準(zhǔn)合同書
- 2025年石家莊道路貨物運(yùn)輸駕駛員考試
- 2025年福州從業(yè)資格證模擬考試題貨運(yùn)考題
- 前程無憂測評題庫及答案
- 《中韓關(guān)系演講》課件
- 直系親屬股權(quán)無償轉(zhuǎn)讓合同(2篇)
- 浙江省強(qiáng)基聯(lián)盟2024-2025學(xué)年高一上學(xué)期11月聯(lián)考數(shù)學(xué)試題(原卷版)-A4
- 2024年成人高考成考(專升本)醫(yī)學(xué)綜合試卷與參考答案
- 2023-2024學(xué)年廣東省廣州市白云區(qū)九年級(上)期末語文試卷
- 【初中生物】嘗試對生物進(jìn)行分類-2024-2025學(xué)年七年級生物上冊同步教學(xué)課件(人教版2024)
- 企業(yè)愿景及三年規(guī)劃目標(biāo)
- 無子女離婚協(xié)議書范文百度網(wǎng)盤
- 北京市大興區(qū)2024-2025學(xué)年八年級上學(xué)期期中考試英語試題(含答案)
- wps課件教學(xué)課件
評論
0/150
提交評論