歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Redis教程筆記之數據類型

Redis教程筆記之數據類型

日期:2017/2/28 15:54:39   编辑:Linux教程

本文介紹下redis支持的各種數據類型包括string,list ,set ,sorted set 和hash

1. keys
redis本質上一個key-value db,所以我們首先來看看他的key.首先key也是字符串類型,但是key中不能包括邊界字符
由於key不是binary safe的字符串,所以像"my key"和"mykey\n"這樣包含空格和換行的key是不允許的
順便說一下在redis內部並不限制使用binary字符,這是redis協議限制的。"\r\n"在協議格式中會作為特殊字符。
redis 1.2以後的協議中部分命令已經開始使用新的協議格式了(比如MSET)。總之目前還是把包含邊界字符當成非法的key吧,免得被bug糾纏。
另外關於key的一個格式約定介紹下,object-type:id:field。比如user:1000:password,blog:xxidxx:title
還有key的長度最好不要太長。道理很明顯占內存啊,而且查找時候相對短key也更慢。不過也推薦過短的key,
比如u:1000:pwd,這樣的。顯然沒上面的user:1000:password可讀性好。

下面介紹下key相關的命令
exits key 測試指定key是否存在,返回1表示存在,0不存在
del key1 key2 ....keyN 刪除給定key,返回刪除key的數目,0表示給定key都不存在
type key 返回給定key的value類型。返回 none 表示不存在key,string字符類型,list 鏈表類型 set 無序集合類型...
keys pattern 返回匹配指定模式的所有key,下面給個例子
redis> set test dsf
OK
redis> set tast dsaf
OK
redis> set tist adff
OK
redis> keys t*
1. "tist"
2. "tast"
3. "test"
redis> keys t[ia]st
1. "tist"
2. "tast"
redis> keys t?st
1. "tist"
2. "tast"
3. "test"

randomkey 返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串
rename oldkey newkey 原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同
renamenx oldkey newkey 同上,但是如果newkey存在返回失敗
dbsize 返回當前數據庫的key數量
expire key seconds 為key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在
ttl key 返回設置過過期時間的key的剩余過期秒數 -1表示key不存在或者沒有設置過過期時間
select db-index 通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。返回1表示成功,0失敗
move key db-index 將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在,或者已經在指定數據庫中
flushdb 刪除當前數據庫中所有key,此方法不會失敗。慎用
flushall 刪除所有數據庫中的所有key,此方法不會失敗。更加慎用

2. string 類型
string是redis最基本的類型,而且string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象
。從內部實現來看其實string可以看作byte數組,最大上限是1G字節。下面是string類型的定義。
struct sdshdr {
long len;
long free;
char buf[];
};
buf是個char數組用於存貯實際的字符串內容。其實char和c#中的byte是等價的,都是一個字節
len是buf數組的長度,free是數組中剩余可用字節數。由此可以理解為什麼string類型是二進制安全的了。因為它本質上就是個byte數組。
當然可以包含任何數據了。另外string類型可以被部分命令按int處理.比如incr等命令,下面詳細介紹。還有redis的其他類型像list,set,sorted set ,hash
它們包含的元素與都只能是string類型。
如果只用string類型,redis就可以被看作加上持久化特性的memcached.當然redis對string類型的操作比memcached多很多啊。如下:

set key value 設置key對應的值為string類型的value,返回1表示成功,0失敗
setnx key value 同上,如果key已經存在,返回0 。nx 是not exist的意思
get key 獲取key對應的string值,如果key不存在返回nil
getset key value 原子的設置key的值,並返回key的舊值。如果key不存在返回nil
mget key1 key2 ... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗,首先清空當前數據庫,然後
設置k1,k2.獲取時k3對應返回nil
redis> flushdb
OK
redis> dbsize
(integer) 0
redis> set k1 a
OK
redis> set k2 b
OK
redis> mget k1 k2 k3
1. "a"
2. "b"
3. (nil)

mset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置
msetnx key1 value1 ... keyN valueN 同上,但是不會覆蓋已經存在的key
incr key 對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key為1
decr key 同上,但是做的是減減操作,decr一個不存在key,則設置key為-1
incrby key integer 同incr,加指定值 ,key不存在時候會設置key,並認為原來的value是 0
decrby key integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

append key value 給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子
redis> set k hello
OK
redis> append k ,world
(integer) 11
redis> get k
"hello,world"

substr key start end 返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的,接著上面例子
redis> substr k 0 8
"hello,wor"
redis> get k
"hello,world"

Copyright © Linux教程網 All Rights Reserved