Redis介紹及常用命令_第1頁
Redis介紹及常用命令_第2頁
Redis介紹及常用命令_第3頁
Redis介紹及常用命令_第4頁
Redis介紹及常用命令_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一 Redis介紹Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。Redis能運行在大多數(shù)POSIX(Linux, *BSD, OS X 和Solaris等)系統(tǒng)上,官方?jīng)]有支持Windows的版本。目前最新的版本是2.2.11,這個版本主要是修復(fù)了一個2.2.7版本中遍歷方式優(yōu)化帶來的一個bug。和普通的Key-Value結(jié)構(gòu)不同,Redis的Key支持靈活的數(shù)據(jù)結(jié)構(gòu),除了strings,還有hashes、lists、 sets 和sor

2、ted sets等結(jié)構(gòu)。正是這些靈活的數(shù)據(jù)結(jié)構(gòu),豐富了Redis的應(yīng)用場景,能滿足更多業(yè)務(wù)上的靈活存儲需求。Redis的數(shù)據(jù)都保存在內(nèi)存中,而且底層實現(xiàn)上是自己寫了epoll event loop部分,而沒有采用開源的libevent等通用框架,所以讀寫效率很高。為了實現(xiàn)數(shù)據(jù)的持久化,Redis支持定期刷新(可通過配置實現(xiàn))或?qū)懭罩镜姆绞絹肀4鏀?shù)據(jù)到磁盤。1、數(shù)據(jù)類型作為Key-value型數(shù)據(jù)庫,Redis也提供了鍵(Key)和鍵值(Value)的映射關(guān)系。但是,除了常規(guī)的數(shù)值或字符串,Redis的鍵值還可以是以下形式之一:Lists (列表)Sets (集合)Sorted sets (有序

3、集合)Hashes (哈希表)鍵值的數(shù)據(jù)類型決定了該鍵值支持的操作。Redis支持諸如列表、集合或有序集合的交集、并集、查集等高級原子操作;同時,如果鍵值的類型是普通數(shù)字,Redis則提供自增等原子操作。2、持久化通常,Redis將數(shù)據(jù)存儲于內(nèi)存中,或被配置為使用虛擬內(nèi)存。通過兩種方式可以實現(xiàn)數(shù)據(jù)持久化:使用截圖的方式,將內(nèi)存中的數(shù)據(jù)不斷寫入磁盤;或使用類似MySQL的日志方式,記錄每次更新的日志。前者性能較高,但是可能會引起一定程度的數(shù)據(jù)丟失;后者相反。3、主從同步Redis支持將數(shù)據(jù)同步到多臺從庫上,這種特性對提高讀取性能非常有益。4、性能相比需要依賴磁盤記錄每個更新的數(shù)據(jù)庫,基于內(nèi)存的特

4、性無疑給Redis帶來了非常優(yōu)秀的性能。讀寫操作之間有顯著的性能差異。5、提供API的語言CC+C#ClojureCommon LispErlangHaskellJavaJavascriptLuaObjective-CPerlPHPPythonRubyScalaGoTcl6、適用場合毫無疑問,Redis開創(chuàng)了一種新的數(shù)據(jù)存儲思路,使用Redis,我們不用在面對功能單調(diào)的數(shù)據(jù)庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用Redis靈活多變的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作,為不同的大象構(gòu)建不同的冰箱。希望你喜歡這個比喻。下面是Redis適用的一些場景:(1)、取最新N個數(shù)據(jù)的操作比如典型的取你網(wǎng)站的

5、最新文章,通過下面方式,我們可以將最新的5000條評論的ID放在Redis的List集合中,并將超出集合部分從數(shù)據(jù)庫獲取。使用LPUSH ments命令,向list集合中插入數(shù)據(jù)插入完成后再用LTRIM ments 0 5000命令使其永遠只保存最近5000個ID然后我們在客戶端獲取某一頁評論時可以用下面的邏輯FUNCTION get_latest_comments(start,num_items):id_list = redis.lrange(ments,start,start+num_items-1)IF id_list.length 455,240 34.8K/s in 13s19:07

6、:16 (34.8 KB/s) - redis-2.2.12.tar.gz saved 455240/455240rootlocalhost 4setup#步驟二: 編譯源程序rootlocalhost 4setup# ll總計 29168-rw-r-r- 1 root root 455240 2011-07-22 redis-2.2.12.tar.gzrootlocalhost 4setup# tar xzf redis-2.2.12.tar.gzrootlocalhost 4setup# cd redis-2.2.12rootlocalhost redis-2.2.12# makecd s

7、rc & make allmake1: Entering directory /root/4setup/redis-2.2.12/src步驟三: 啟動Redis服務(wù)src/redis-serverrootlocalhost redis-2.2.12# src/redis-server6246 05 Aug 19:17:22 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf6246

8、 05 Aug 19:17:22 * Server started, Redis version 2.2.126246 05 Aug 19:17:22 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add vm.overcommit_memory = 1 to /etc/sysctl.conf and then reboot or run the command sysctl vm.overcommit_memory=

9、1 for this to take effect.6246 05 Aug 19:17:22 * The server is now ready to accept connections on port 63796246 05 Aug 19:17:22 - 0 clients connected (0 slaves), 539544 bytes in useRedis 服務(wù)端的默認連接端口是 6379。使用指定配置文件啟動src/redis-server redis.conf步驟四: 將Redis作為 Linux 服務(wù)隨機啟動vi /etc/rc.local, 使用vi編輯器打開隨機啟動配置

10、文件,并在其中加入下面一行代碼。/root/4setup/redis-2.2.12/src/redis-server步驟五: 客戶端連接驗證新打開一個Session輸入:src/redis-cli,如果出現(xiàn)下面提示,那么您就可以開始Redis之旅了。rootlocalhost redis-2.2.12# src/redis-cliredis 127.0.0.1:6379步驟六: 查看Redis日志查看服務(wù)器端session,即可對Redis的運行狀況進行查看或分析了。6246 05 Aug 19:24:33 - 0 clients connected (0 slaves), 539544 by

11、tes in use6246 05 Aug 19:24:37 - Accepted 127.0.0.1:513816246 05 Aug 19:24:38 - 1 clients connected (0 slaves), 547372 bytes in use以上的幾個步驟就OK了!這樣一個簡單的Redis數(shù)據(jù)庫就可以暢通無阻地運行起來了。步驟七: 停止Redis實例最簡單的方法是在啟動實例的session中,直接使用Control-C來將實例停止。我們還可以用客戶端來停止服務(wù),如可以用shutdown來停止Redis實例, 具體如下:rootlocalhost redis-2.2.12#

12、src/redis-cli shutdown三、配置Redis使用配置文件啟動:src/redis-server redis.conf主要配置項:Redis支持很多的參數(shù),但都有默認值。daemonize:默認情況下,redis不是在后臺運行的,如果需要在后臺運行,把該項的值更改為yes。pidfile當Redis在后臺運行的時候,Redis默認會把pid文件放在/var/run/redis.pid,你可以配置到其他地址。當運行多個redis服務(wù)時,需要指定不同的pid文件和端口。bind指定Redis只接收來自于該IP地址的請求,如果不進行設(shè)置,那么將處理所有請求,在生產(chǎn)環(huán)境中最好設(shè)置該項。

13、port監(jiān)聽端口,默認為6379。timeout設(shè)置客戶端連接時的超時時間,單位為秒。當客戶端在這段時間內(nèi)沒有發(fā)出任何指令,那么關(guān)閉該連接。loglevellog等級分為4級,debug, verbose, notice, 和warning。生產(chǎn)環(huán)境下一般開啟notice。logfile配置log文件地址,默認使用標準輸出,即打印在命令行終端的窗口上。databases設(shè)置數(shù)據(jù)庫的個數(shù),可以使用SELECT 命令來切換數(shù)據(jù)庫。默認使用的數(shù)據(jù)庫是0。save設(shè)置Redis進行數(shù)據(jù)庫鏡像的頻率。if(在60秒之內(nèi)有10000個keys發(fā)生變化時)進行鏡像備份else if(在300秒之內(nèi)有10個k

14、eys發(fā)生了變化)進行鏡像備份else if(在900秒之內(nèi)有1個keys發(fā)生了變化)進行鏡像備份rdbcompression在進行鏡像備份時,是否進行壓縮。dbfilename鏡像備份文件的文件名。dir數(shù)據(jù)庫鏡像備份的文件放置的路徑。這里的路徑跟文件名要分開配置是因為Redis在進行備份時,先會將當前數(shù)據(jù)庫的狀態(tài)寫入到一個臨時文件中,等備份完成時,再把該該臨時文件替換為上面所指定的文件,而這里的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中。slaveof設(shè)置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫。masterauth當主數(shù)據(jù)庫連接需要密碼驗證時,在這里指定。requirepass設(shè)置客

15、戶端連接后進行任何其他指定前需要使用的密碼。警告:因為redis速度相當快,所以在一臺比較好的服務(wù)器下,一個外部的用戶可以在一秒鐘進行150K次的密碼嘗試,這意味著你需要指定非常非常強大的密碼來防止暴力破解。maxclients限制同時連接的客戶數(shù)量。當連接數(shù)超過這個值時,redis將不再接收其他連接請求,客戶端嘗試連接時將收到error信息。maxmemory設(shè)置redis能夠使用的最大內(nèi)存。當內(nèi)存滿了的時候,如果還接收到set命令,redis將先嘗試剔除設(shè)置過expire信息的key,而不管該key的過期時間還沒有到達。在刪除時,將按照過期時間進行刪除,最早將要被過期的key將最先被刪除。

16、如果帶有expire信息的key都刪光了,那么將返回錯誤。這樣,redis將不再接收寫請求,只接收get請求。maxmemory的設(shè)置比較適合于把redis當作于類似memcached的緩存來使用。appendonly默認情況下,redis會在后臺異步的把數(shù)據(jù)庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發(fā)生諸如拉閘限電、拔插頭等狀況,那么將造成比較大范圍的數(shù)據(jù)丟失。所以redis提供了另外一種更加高效的數(shù)據(jù)庫備份及災(zāi)難恢復(fù)方式。開啟append only模式之后,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof文件中,當redis重新啟動時,

17、會從該文件恢復(fù)出之前的狀態(tài)。但是這樣會造成appendonly.aof文件過大,所以redis還支持了BGREWRITEAOF指令,對appendonly.aof進行重新整理。所以我認為推薦生產(chǎn)環(huán)境下的做法為關(guān)閉鏡像,開啟appendonly.aof,同時可以選擇在訪問較少的時間每天對appendonly.aof進行重寫一次。appendfsync設(shè)置對appendonly.aof文件進行同步的頻率。always表示每次有寫操作都進行同步,everysec表示對寫操作進行累積,每秒同步一次。這個需要根據(jù)實際業(yè)務(wù)場景進行配置。vm-enabled是否開啟虛擬內(nèi)存支持。因為redis是一個內(nèi)存數(shù)據(jù)

18、庫,而且當內(nèi)存滿的時候,無法接收新的寫請求,所以在redis 2.0中,提供了虛擬內(nèi)存的支持。但是需要注意的是,redis中,所有的key都會放在內(nèi)存中,在內(nèi)存不夠時,只會把value值放入交換區(qū)。這樣保證了雖然使用虛擬內(nèi)存,但性能基本不受影響,同時,你需要注意的是你要把vm-max-memory設(shè)置到足夠來放下你的所有的key。vm-swap-file設(shè)置虛擬內(nèi)存的交換文件路徑。vm-max-memory這里設(shè)置開啟虛擬內(nèi)存之后,redis將使用的最大物理內(nèi)存的大小。默認為0,redis將把他所有的能放到交換文件的都放到交換文件中,以盡量少的使用物理內(nèi)存。在生產(chǎn)環(huán)境下,需要根據(jù)實際情況設(shè)置該

19、值,最好不要使用默認的0。vm-page-size設(shè)置虛擬內(nèi)存的頁大小,如果你的value值比較大,比如說你要在value中放置博客、新聞之類的所有文章內(nèi)容,就設(shè)大一點,如果要放置的都是很小的內(nèi)容,那就設(shè)小一點。vm-pages設(shè)置交換文件的總的page數(shù)量,需要注意的是,page table信息會放在物理內(nèi)存中,每8個page就會占據(jù)RAM中的1個byte??偟奶摂M內(nèi)存大小 = vm-page-size * vm-pages。vm-max-threads設(shè)置VM IO同時使用的線程數(shù)量。因為在進行內(nèi)存交換時,對數(shù)據(jù)有編碼和解碼的過程,所以盡管IO設(shè)備在硬件上本上不能支持很多的并發(fā)讀寫,但是還

20、是如果你所保存的vlaue值比較大,將該值設(shè)大一些,還是能夠提升性能的。glueoutputbuf把小的輸出緩存放在一起,以便能夠在一個TCP packet中為客戶端發(fā)送多個響應(yīng),具體原理和真實效果我不是很清楚。所以根據(jù)注釋,你不是很確定的時候就設(shè)置成yes。hash-max-zipmap-entries在redis 2.0中引入了hash數(shù)據(jù)結(jié)構(gòu)。當hash中包含超過指定元素個數(shù)并且最大的元素沒有超過臨界時,hash將以一種特殊的編碼方式(大大減少內(nèi)存使用)來存儲,這里可以設(shè)置這兩個臨界值。activerehashing開啟之后,redis將在每100毫秒時使用1毫秒的CPU時間來對redi

21、s的hash表進行重新hash,可以降低內(nèi)存的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這么嚴格的實時性要求,可以設(shè)置為yes,以便能夠盡可能快的釋放內(nèi)存。四、操作Redis1、插入數(shù)據(jù)redis 127.0.0.1:6379 set name wwlOK設(shè)置一個key-value對。2、查詢數(shù)據(jù)redis 127.0.0.1:6379 get namewwl取出key所對應(yīng)的value。3、刪除鍵值redis 127.0.0.1:6379 del name刪除這個key及對應(yīng)的value。4、驗證鍵是否存在

22、redis 127.0.0.1:6379 exists name(integer) 0其中0,代表此key不存在;1代表存在。五、各類型的基本操作1)strings類型及操作string是最簡單的類型,你可以理解成與Memcached是一模一樣的類型,一個key對應(yīng)一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。string類型是二進制安全的。意思是redis的string可以包含任何數(shù)據(jù),比如jpg圖片或者序列化的對象。從內(nèi)部實現(xiàn)來看其實string可以看作byte數(shù)組,最大上限是1G字節(jié),下面是string類型的定義:struct sdshdr long l

23、en;long free;char buf;len是buf數(shù)組的長度。free是數(shù)組中剩余可用字節(jié)數(shù),由此可以理解為什么string類型是二進制安全的了,因為它本質(zhì)上就是個byte數(shù)組,當然可以包含任何數(shù)據(jù)了buf是個char數(shù)組用于存貯實際的字符串內(nèi)容,其實char和c#中的byte是等價的,都是一個字節(jié)。另外string類型可以被部分命令按int處理.比如incr等命令,如果只用string類型,redis就可以被看作加上持久化特性的memcached。當然redis對string類型的操作比memcached還是多很多的,具體操作方法如下:1、set設(shè)置key對應(yīng)的值為string類型的

24、value。例如我們添加一個name= HongWan的鍵值對,可以這樣做:redis 127.0.0.1:6379 set name HongWanOKredis 127.0.0.1:63792、setnx設(shè)置key對應(yīng)的值為string類型的value。如果key已經(jīng)存在,返回0,nx是not exist的意思。例如我們添加一個name= HongWan_new的鍵值對,可以這樣做:redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:6379 setnx name HongWan_new(integer) 0redis 127.0.0.1

25、:6379 get nameHongWanredis 127.0.0.1:6379由于原來name有一個對應(yīng)的值,所以本次的修改不生效,且返回碼是0。3、setex設(shè)置key對應(yīng)的值為string類型的value,并指定此鍵值對應(yīng)的有效期。例如我們添加一個haircolor= red的鍵值對,并指定它的有效期是10秒,可以這樣做:redis 127.0.0.1:6379 setex haircolor 10 redOKredis 127.0.0.1:6379 get haircolorredredis 127.0.0.1:6379 get haircolor(nil)redis 127.0.0

26、.1:6379可見由于最后一次的調(diào)用是10秒以后了,所以取不到haicolor這個鍵對應(yīng)的值。4、setrange設(shè)置指定key的value值的子字符串。例如我們希望將HongWan的126郵箱替換為gmail郵箱,那么我們可以這樣做:redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:6379 setrange name 8 (integer) 17redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:6379其中的8是指從下標為8(包含8)的字符開始替換5、mset一次設(shè)置多個key的值,

27、成功返回ok表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置。redis 127.0.0.1:6379 mset key1 HongWan1 key2 HongWan2OKredis 127.0.0.1:6379 get key1HongWan1redis 127.0.0.1:6379 get key2HongWan2redis 127.0.0.1:63796、msetnx一次設(shè)置多個key的值,成功返回ok表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置,但是不會覆蓋已經(jīng)存在的key。redis 127.0.0.1:6379 get key1HongWan1redis 127.0.0

28、.1:6379 get key2HongWan2redis 127.0.0.1:6379 msetnx key2 HongWan2_new key3 HongWan3(integer) 0redis 127.0.0.1:6379 get key2HongWan2redis 127.0.0.1:6379 get key3(nil)可以看出如果這條命令返回0,那么里面操作都會回滾,都不會被執(zhí)行。7、get獲取key對應(yīng)的string值,如果key不存在返回nil。例如我們獲取一個庫中存在的鍵name,可以很快得到它對應(yīng)的valueredis 127.0.0.1:6379 get nameHongW

29、anredis 127.0.0.1:6379我們獲取一個庫中不存在的鍵name1,那么它會返回一個nil以表時無此鍵值對redis 127.0.0.1:6379 get name1(nil)redis 127.0.0.1:63798、getset設(shè)置key的值,并返回key的舊值。redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:6379 getset name HongWan_newHongWanredis 127.0.0.1:6379 get nameHongWan_newredis 127.0.0.1:6379接下來我們看一下如果ke

30、y不存的時候會什么樣兒?redis 127.0.0.1:6379 getset name1 aaa(nil)redis 127.0.0.1:6379可見,如果key不存在,那么將返回nil9、getrange獲取指定key的value值的子字符串。具體樣例如下:redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:6379 getrange name 0 6HongWanredis 127.0.0.1:6379字符串左面下標是從0開始的redis 127.0.0.1:6379 getrange name -7 -1redis 127.0.0.1

31、:6379字符串右面下標是從-1開始的redis 127.0.0.1:6379 getrange name 7 100redis 127.0.0.1:6379當下標超出字符串長度時,將默認為是同方向的最大下標10、mget一次獲取多個key的值,如果對應(yīng)key不存在,則對應(yīng)返回nil。具體樣例如下:redis 127.0.0.1:6379 mget key1 key2 key31) HongWan12) HongWan23) (nil)redis 127.0.0.1:6379key3由于沒有這個鍵定義,所以返回nil。11、incr對key的值做加加操作,并返回新的值。注意incr一個不是in

32、t的value會返回錯誤,incr一個不存在的key,則設(shè)置key為1redis 127.0.0.1:6379 set age 20OKredis 127.0.0.1:6379 incr age(integer) 21redis 127.0.0.1:6379 get age21redis 127.0.0.1:637912、incrby同incr類似,加指定值 ,key不存在時候會設(shè)置key,并認為原來的value是 0redis 127.0.0.1:6379 get age21redis 127.0.0.1:6379 incrby age 5(integer) 26redis 127.0.0.

33、1:6379 get nameHongWanredis 127.0.0.1:6379 get age26redis 127.0.0.1:637913、decr對key的值做的是減減操作,decr一個不存在key,則設(shè)置key為-1redis 127.0.0.1:6379 get age26redis 127.0.0.1:6379 decr age(integer) 25redis 127.0.0.1:6379 get age25redis 127.0.0.1:637914、decrby同decr,減指定值。redis 127.0.0.1:6379 get age25redis 127.0.0.

34、1:6379 decrby age 5(integer) 20redis 127.0.0.1:6379 get age20redis 127.0.0.1:6379decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現(xiàn)同樣效果,反之一樣。redis 127.0.0.1:6379 get age20redis 127.0.0.1:6379 incrby age -5(integer) 15redis 127.0.0.1:6379 get age15redis 127.0.0.1:637915、append給指定key的字符串值追加value,返回新字符串值的長度。例如我們向nam

35、e的值追加一個字符串,那么可以這樣做:redis 127.0.0.1:6379 append name (integer) 15redis 127.0.0.1:6379 get nameHongWanredis 127.0.0.1:637916、strlen取指定key的value值的長度。redis 127.0.0.1:6379 get nameHongWan_newredis 127.0.0.1:6379 strlen name(integer) 11redis 127.0.0.1:6379 get age15redis 127.0.0.1:6379 strlen age(integer)

36、 2redis 127.0.0.1:63792)hashRedis hash是一個string類型的field和value的映射表.它的添加、刪除操作都是O(1)(平均)。hash特別適合用于存儲對象。相較于將對象的每個字段存成單個string類型。將一個對象存儲在hash類型中會占用更少的內(nèi)存,并且可以更方便的存取整個對象。省內(nèi)存的原因是新建一個hash對象時開始是用zipmap(又稱為small hash)來存儲的。這個zipmap其實并不是hash table,但是zipmap相比正常的hash實現(xiàn)可以節(jié)省不少hash本身需要的一些元數(shù)據(jù)存儲開銷。盡管zipmap的添加,刪除,查找都是O

37、(n),但是由于一般對象的field數(shù)量都不太多。所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。如果field或者value的大小超出一定限制后,Redis會在內(nèi)部自動將zipmap替換成正常的hash實現(xiàn). 這個限制可以在配置文件中指定hash-max-zipmap-entries 64 #配置字段最多64個。hash-max-zipmap-value 512 #配置value最大為512字節(jié)。1、hset設(shè)置hash field為指定值,如果key不存在,則先創(chuàng)建。redis127.0.0.1:6379hset myhash field1 Hello(integer)1

38、redis127.0.0.1:63792、hsetnx設(shè)置hash field為指定值,如果key不存在,則先創(chuàng)建。如果field已經(jīng)存在,返回0,nx是not exist的意思。redis127.0.0.1:6379hsetnx myhash fieldHello(integer)1redis127.0.0.1:6379hsetnx myhash fieldHello(integer)0redis127.0.0.1:6379第一次執(zhí)行是成功的,但第二次執(zhí)行相同的命令失敗,原因是field已經(jīng)存在了。3、hmset同時設(shè)置hash的多個field。redis127.0.0.1:6379hmse

39、t myhash field1 Hello field2 WorldOKredis127.0.0.1:63794、hget獲取指定的hash field。redis127.0.0.1:6379hget myhash field1Helloredis127.0.0.1:6379hget myhash field2Worldredis127.0.0.1:6379hget myhash field3(nil)redis127.0.0.1:6379由于數(shù)據(jù)庫沒有field3,所以取到的是一個空值nil。5、hmget獲取全部指定的hash filed。redis127.0.0.1:6379hmget

40、myhash field1 field2 field31)Hello2)World3) (nil)redis127.0.0.1:6379由于數(shù)據(jù)庫沒有field3,所以取到的是一個空值nil。6、hincrby指定的hash filed 加上給定值。redis127.0.0.1:6379hset myhash field320(integer)1redis127.0.0.1:6379hget myhash field320redis127.0.0.1:6379hincrby myhash field3-8(integer)12redis127.0.0.1:6379hget myhash fie

41、ld312redis127.0.0.1:6379在本例中我們將field3的值從20降到了12,即做了一個減8的操作。7、hexists測試指定field是否存在。redis127.0.0.1:6379hexists myhash field1(integer)1redis127.0.0.1:6379hexists myhash field9(integer)0redis127.0.0.1:6379通過上例可以說明field1存在,但field9是不存在的。8、hlen返回指定hash的field數(shù)量。redis127.0.0.1:6379hlen myhash(integer)4redis1

42、27.0.0.1:6379通過上例可以看到myhash中有4個field。9、hdel返回指定hash的field數(shù)量。redis127.0.0.1:6379hlen myhash(integer)4redis127.0.0.1:6379hdel myhash field1(integer)1redis127.0.0.1:6379hlen myhash(integer)3redis127.0.0.1:637910、hkeys返回hash的所有field。redis127.0.0.1:6379hkeys myhash1)field22)field3)field3redis127.0.0.1:63

43、79說明這個hash中有3個field。11、hvals返回hash的所有value。redis127.0.0.1:6379hvals myhash1)World2)Hello3)12redis127.0.0.1:6379說明這個hash中有3個field。12、hgetall獲取某個hash中全部的filed及value。redis127.0.0.1:6379hgetall myhash1)field22)World3)field4)Hello5)field36)12redis127.0.0.1:6379可見,一下子將myhash中所有的field及對應(yīng)的value都取出來了。3)listR

44、edis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。鏈表的最大長度是(2的32次方)。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。有意思的是list的pop操作還有阻塞版本的,當我們lrpop一個list對象時,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的blrpop可以則可以阻塞,當然可以加超時時間,超時后也會返回nil。為什么要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現(xiàn)一個工作隊列。執(zhí)行任務(wù)的thread可以調(diào)用阻塞版本的pop去獲取任務(wù)這樣就可以

45、避免輪詢?nèi)z查是否有任務(wù)存在。當任務(wù)來時候工作線程可以立即返回,也可以避免輪詢帶來的延遲。說了這么多,接下來看一下實際操作的方法吧:1、lpush在key對應(yīng)list的頭部添加字符串元素:redis127.0.0.1:6379lpush mylistworld(integer)1redis127.0.0.1:6379lpush mylisthello(integer)2redis127.0.0.1:6379lrange mylist0-11)hello2)worldredis127.0.0.1:6379在此處我們先插入了一個world,然后在world的頭部插入了一個hello。其中l(wèi)range是用于取mylist的內(nèi)容。2、rpush在key對應(yīng)list的尾部添加字符串元素:redis127.0.0.1:6379rpush mylist2hello(integer)1redis127.0.0.1:6379rpush mylist2world(integer)2redis127.0.0.1:6379lrange mylist20-11)hello2)worldredis127.0.0.1:6379在此處我們先插入了一個hello,然后在hello的尾部插入了一個world。3、lin

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論