Redis資料結構詳解(一)

張龍豪發表於2015-11-17

前言

Redis和Memcached最大的區別,Redis 除啦支援資料持久化之外,還支援更多的資料型別而不僅僅是簡單key-value結構的資料記錄。Redis還支援對這些資料型別做更多的服務端操作,從而也能減少網路的IO次數與資料體積,這裡也比Memcached要方便與高效,只針對這一點啊,想噴的左上角群噴。上篇吹牛逼20分鐘教你做memcached大神

Redis主要支援的資料型別有5種:String ,Hash ,List ,Set ,和 Sorted Set。

下面我針對Redis支援的這幾種資料型別做詳細操作展示,供大家理解記憶。

Redis資料型別String

string型別在redis中是最常見的型別,value儲存最大資料量為512M,可以存放json資料,影象資料等等。

下面跟著敲Redis命令操作String型別資料的程式碼吧。

redis資料寫命令Set,相當於資料插入

redis 127.0.0.1:6379> set name zlh   --返回值: ok,說明插入成功。如果當前name存在值則覆蓋替換原有的value值。

redis資料讀命令Get,獲取資料

redis 127.0.0.1:6379> get name   --返回值: "zlh" ,如果當前key沒有value值,則返回null

redis資料追加命令Append,追加資料

redis 127.0.0.1:6379> append name ' is my friend'   --返回值:"zlh is my friend"  ,如果當前key的value有值則附加到原有string後面,如果沒有則寫入。

redis資料刪除

redis 127.0.0.1:6379>del name

redis資料讀寫操作命令GetSet,獲取原有value值的同時寫入新的value值

1、redis 127.0.0.1:6379>getset name zlh   --返回值:"zlh is my friend",這裡返回的是原有name的value值,同時又給name的value設定新值zlh。此時name的值真實值為zlh

2、redis 127.0.0.1:6379>get name  --返回值:zlh ,因為上面getset給name的value設定值為zlh。

redis資料加法計算命令incr,incrby,資料加法運算,incr為+1內建運算,incrby為+n自設n運算

1、redis 127.0.0.1:6379>incr name   ---返回值:“資料不是整型或資料超出64位有符號整形資料範圍” ,由於原有name的value為"zlh",所以不能轉換為整型,故報異常。

2、redis 127.0.0.1:6379>incr age   ----返回值:1,由於不存在age的key與value值,但是預設age為key值為0進行+1運算。

3、redis 127.0.0.1:6379>incr age   ---返回值:2,由於上一行程式碼給age賦值為1,這裡incr命令進行+1運算,故返回值為2。

4、redis 127.0.0.1:6379>incrby age 10   ---返回值:12 ,因為原有age是2,這裡+10故為12。

redis資料減法計算命令decr,decrby, 資料減法運算,decr為-1內建運算,decrby為減n自設n運算

1、redis 127.0.0.1:6379>decr name   --返回值:“資料不是整型或資料超出64位有符號整形資料範圍” ,由於原有name的value為"zlh",所以不能轉換為整型,故報異常。

2、redis 127.0.0.1:6379>decr age  --返回自:11,因為原有age的value值為12,這裡decr是自減1的意思,故為11。

3、redis 127.0.0.1:6379>decrby age 10   --返回值:1,因為原有age為11,這裡-10,故為1。

redis獲取string長度的命令strlen

redis 127.0.0.1:6379>strlen name   --返回值:3,因為name的value值為zlh,故長度為3,如果該key或者value不存在,則返回0。

redis設定value值並設定過期時間命令setex(單位秒)

redis 127.0.0.1:6379>setex sex 20 male   ---返回值:ok,設定key為sex的value值為male,快取的過期時間為20s。

redis 127.0.0.1:6379>ddl sex   ---返回值: 剩餘過期時間,0為已過期,-1為永不過期。

redis 127.0.0.1:6379>get sex   ---返回值:male,說明此時為沒有過期,當已經過期此處返回資料為null。

redis賦值判斷原值是否存在,存在不賦值,返回0;不存在才賦值,返回1;命令setnx

redis 127.0.0.1:6379>setnx name Tom  ---返回值:0,因為name的原有value為zlh,存在值則不賦值。

redis 127.0.0.1:6379>gete name  ---返回值:zlh,因為有值,故上面賦值為tom失敗,返回0。

redis 127.0.0.1:6379>setnx phone 18501733702   ---返回值:1,賦值成功,因為原來不存在phone的key與value。

redis 127.0.0.1:6379>get phone   ---返回值:18501733702,說明上面的setnx賦值成功。

redis字串替換賦值,從指定位置開始替換,命令setrange

redis 127.0.0.1:6379>setrange phone 9 123   --返回值:12,12為字串長度,11位號碼變成了12位。因為從第9位開始替換,替換到原有字串的最後一位還沒有替換完畢,所以在最後面新增啦一位設定為3。

redis 127.0.0.1:6379>get phone   ---返回值為:185017337123.

redis 127.0.0.1:6379>set phone  1    ---這裡為了下面說下setrange的其他特性,把電話設定為1.

redis 127.0.0.1:6379>setrange phone 3 aaa   ---返回值為:6,因為原有phone的value值為1,不到三位,用0*00替換2位,所以要新增2為才能替換第三位後面的值為aaa。

redis 127.0.0.1:6379>get phone  ---返回值:1\*00\*00aaa。理解下上面的操作就知道這裡為什麼是這樣的返回值了。

redis擷取字串,從下標為n開始擷取到n或n+1,類似c#中的substring,命令getrange

redis 127.0.0.1:6379>set phone 18501733701    ----方便下面操作

redis 127.0.0.1:6379>getrange phone  1 5   ---返回值:85017,因為getrange是從下標為1開始擷取擷取到下標為5,這裡包含下標為5的值。

redis 127.0.0.1:6379>getrange phone  0 0  ---返回值:1,從下標為0開始擷取,擷取到下標為0,包含下標為0。故返回值為1。

redis 127.0.0.1:6379>getrange phone 10 13   --返回值為:1,此號碼下標直到10的11位號碼,從10開始擷取,截到第13位,後2位不存在忽略,只返回第10位。故返回乾淨的1。

redis批量操作修改及讀取string資料,命令mget,批量讀取,命令mset,批量賦值,命令msetnx,帶事務性的賦值,發現有一個key已經存在,所有事務迴歸,不做賦值處理操作

redis 127.0.0.1:6379>mset name zlh age 30   ---返回值:ok,這裡設定了 key為name和age的value分別為zlh,30

redis 127.0.0.1:6379>mget name zlh      ---返回值:1>zlh  2>30 。

redis 127.0.0.1:6379>msetnx name Jim address China ---返回值為:0,沒有做任何修改,因為key為那麼已存在。

redis 127.0.0.1:6379>mget name address   ---返回值:1>zlh  2>null

redis 127.0.0.1:6379>msetnx address China,hobbies sports  --返回值為:1,插入成功

redis 127.0.0.1:6379>mget address hobbies   ---返回值:1>China   2>sports

說說windows環境安裝與下載

1、上面是扯淡的標題。

2、其它幾種資料型別,明晚再寫。

3、這裡太晚啦,我不寫啦,要不死求啦,安裝與下載,及redis從入門到精通我會一點點整理上來,希望您能加入左上角的群,我們一起做溝通交流,晚安。 

相關文章