標籤:redis redis教程
Redis支援的種資料類型包括string、list 、set 、sorted set 和hash。
Redis相關的命令可以查看:http://redis.io/commands 這是官方的命令使用手冊,也有中文翻譯的:http://redis.readthedocs.org/en/2.4/index.html
1. keys:
redis本質上一個key-value store,所以首先瞭解它的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 |
randomkey |
返回從當前資料庫中隨機播放的一個key,如果當前資料庫是空的,返回空串 |
rename oldkey newkey |
原子的重新命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同 |
renamenx oldkey newkey |
同上,但是如果newkey存在返回失敗 |
dbsize |
返回當前資料庫的key數量 |
expire key seconds |
為key指定到期時間,單位是秒。返回1成功。 |
ttl key |
返回設定過到期時間的key的剩餘到期秒數 -1表示key不存在或者沒有設定過到期時間 |
select db-index |
將key從當前資料庫移動到指定資料庫。返回1成功。0 如果key不存在,或者已經在指定資料庫中 |
move key db-index |
將key從當前資料庫移動到指定資料庫。返回1成功。0 如果key不存在,或者已經在指定資料庫中 |
flushdb |
刪除當前資料庫中所有key,此方法不會失敗。慎用 |
flushall |
刪除所有資料庫中的所有key,此方法不會失敗。慎用 |
key相關命令簡單樣本:
redis 127.0.0.1:6379> set test dsf OK redis 127.0.0.1:6379> set tast dsaf OK redis 127.0.0.1:6379> set tist adff OK redis 127.0.0.1:6379> keys t* 1. "tist" 2. "tast" 3. "test" redis 127.0.0.1:6379> keys t[ia]st 1. "tist" 2. "tast" redis 127.0.0.1:6379> keys t?st 1. "tist" 2. "tast" 3. "test" |
2. string:
string是redis最基本的類型,而且string類型是二進位安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的對象。從內部實現來看其實string可以看作byte數組,最大上限是1G位元組。
下面是string類型的定義。
struct sdshdr { long len; long free; char buf[]; } |
buf是個char數組用於存貯實際的字串內容。char是一個位元組。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 |
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,返回新字串值的長度。 |
substr key start end |
返回截取過的key的字串值,注意並不修改key的值。下標是從0開始的 |
string相關命令簡單樣本:
redis 127.0.0.1:6379> set key hello OK redis 127.0.0.1:6379> append k ,world (integer) 11 redis 127.0.0.1:6379> get k "hello,world" redis 127.0.0.1:6379> substr k 0 8 "hello,wor" redis 127.0.0.1:6379> get k "hello,world" redis 127.0.0.1:6379> set k1 a OK redis 127.0.0.1:6379> set k2 b OK redis 127.0.0.1:6379> mget k1 k2 k3 1. "a" 2. "b" 3. (nil) |
3. list:
redis的list類型是一個每個子項目都是string類型的雙向鏈表。所以[lr]push和[lr]pop命令的演算法時間複雜度都是O(1)另外list會記錄鏈表的長度。所以llen操作也是O(1).鏈表的最大長度是(2的32次方-1)。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。
這使得list既可以用作棧,也可以用作隊列。有意思的是list的pop操作還有阻塞版本的。當我們[lr]pop一個list對象是,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會返回nil。
為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候背景工作執行緒可以立即返回,也可以避免輪詢帶來的延遲。
下面介紹list相關命令:
lpush key string |
在key對應list的頭部添加字串元素,返回值為添加新元素後list的元素個數,0表示key存在且不是list類型 |
rpush key string |
同上,在尾部添加 |
llen key |
返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤 |
lrange key start end |
返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表 |
ltrim key start end |
截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤 |
lset key index value |
設定list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤 |
lrem key count value |
從key對應list中刪除count個和value相同的元素。count為0時候刪除全部 |
lpop key |
從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤 |
rpop key |
同上,但是從尾部刪除 |
blpop key1...keyN timeout |
從左至右掃描返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空則對list2做lpop並返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果逾時發生,則返回nil。有點像unix的select或者poll |
brpop |
同blpop,一個是從頭部刪除一個是從尾部刪除 |
rpoplpush srckey destkey |
從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nil |
4.set:
redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實現的,所以添加,刪除,尋找的複雜度都是O(1)。hash table會隨著添加或者刪除自動的調整大小。需要注意的是調整hash table大小時候需要同步(擷取寫鎖)會阻塞其他讀寫操作。關於set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。
下面詳細介紹set相關命令:
sadd key member |
添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤 |
srem key member |
從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤 |
spop key |
刪除並返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nil |
srandmember key |
同spop,隨機取set中的一個元素,但是不刪除元素 |
smove srckey dstkey member |
從srckey對應set中移除member並添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤 |
scard key |
返回set的元素個數,如果set是空或者key不存在返回0 |
sismember key member |
判斷member是否在set中,存在返回1,0表示不存在或者key不存在 |
sinter key1 key2...keyN |
返回所有給定key的交集 |
sinterstore dstkey key1...keyN |
同sinter,但是會同時將交集存到dstkey下 |
sunion key1 key2...keyN |
返回所有給定key的並集 |
sunionstore dstkey key1...keyN |
同sunion,並同時儲存並集到dstkey下 |
sdiff key1 key2...keyN |
返回所有給定key的差集 |
sdiffstore dstkey key1...keyN |
同sdiff,並同時儲存差集到dstkey下 |
smembers key |
返回key對應set的所有元素,結果是無序的 |
5.sorted set:
sorted set和set一樣也是string類型元素的集合,不同的是每個元素都會關聯一個double類型的score。sorted set的實現是skip list(跳錶)和hash table的混合體當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,所以給定一個元素擷取score的開銷是O(1),另一個score到元素的映射被添加到skip list並按照score排序,所以就可以有序的擷取集合中的元素。添加,刪除操作開銷都是O(log(N))和skip list的開銷一致,redis的skip list實現用的是雙向鏈表,這樣就可以逆序從尾部取元素。sorted set最經常的使用方式應該是作為索引來使用。我們可以把要排序的欄位作為score儲存,對象的id當元素儲存。
下面是sorted set相關命令:
zadd key score member |
添加元素到集合,元素在集合中存在則更新對應score |
zrem key member |
刪除指定元素,1表示成功,如果元素不存在返回0 |
zincrby key incr member |
增加對應member的score值,然後移動元素並保持skip list保持有序。返回更新後的score值 |
zrank key member |
返回指定元素在集合中的排名(下標),集合中元素是按score從小到大排序的 |
zrevrank key member |
同上,但是集合中元素是按score從大到小排序 |
zrange key start end |
類似lrange操作從集合中去指定區間的元素。返回的是有序結果 |
zrevrange key start end |
同上,返回結果是按score逆序的 |
zrangebyscore key min max |
返回集合中score在給定區間的元素 |
zcount key min max |
返回集合中score在給定區間的數量 |
zcard key |
返回集合中元素個數 |
zscore key element |
返回給定元素對應的score |
zremrangebyrank key min max |
刪除集合中排名在給定區間的元素 |
zremrangebyscore key min max |
刪除集合中score在給定區間的元素 |
6.hash:
redis hash是一個string類型的field和value的映射表。它的添加,刪除操作都是O(1)(平均)。hash特別適合用於儲存物件。相較於將對象的每個欄位存成單個string類型。將一個Object Storage Service在hash類型中會佔用更少的記憶體,並且可以更方便的存取整個對象。記憶體的原因是因為它有儲存最佳化機制,後面介紹。
下面介紹hash相關命令:
hset key field value |
設定hash field為指定值,如果key不存在,則先建立 |
hget key field |
擷取指定的hash field |
hmget key filed1....fieldN |
擷取全部指定的hash filed |
hmset key filed1 value1 ... filedN valueN |
同時設定hash的多個field |
hincrby key field integer |
將指定的hash filed 加上給定值 |
hexists key field |
測試指定field是否存在 |
hdel key field |
刪除指定的hash field |
hlen key |
返回指定hash的field數量 |
hkeys key |
返回hash的所有field |
hvals key |
返回hash的所有value |
hgetall |
返回hash的所有filed和value |
7. 查看狀態資訊:
[[email protected] ~]# redis-cli info
redis_version:2.4.15
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
process_id:2204
uptime_in_seconds:25
uptime_in_days:0
lru_clock:2013834
used_cpu_sys:0.00
used_cpu_user:0.00
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
connected_clients:1
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:17505392
used_memory_human:16.69M
used_memory_rss:1617920
used_memory_peak:17496792
used_memory_peak_human:16.69M
mem_fragmentation_ratio:0.09
mem_allocator:jemalloc-2.2.1
loading:0
aof_enabled:1
changes_since_last_save:5
bgsave_in_progress:0
last_save_time:1320372561
bgrewriteaof_in_progress:0
total_connections_received:1
total_commands_processed:0
expired_keys:0
evicted_keys:0
keyspace_hits:2
keyspace_misses:8
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
vm_enabled:1
role:master
aof_current_size:237
aof_base_size:237
aof_pending_rewrite:0
vm_conf_max_memory:0
vm_conf_page_size:32
vm_conf_pages:134217728
vm_stats_used_pages:3
vm_stats_swapped_objects:3
vm_stats_swappin_count:0
vm_stats_swappout_count:3
vm_stats_io_newjobs_len:0
vm_stats_io_processing_len:0
vm_stats_io_processed_len:0
vm_stats_io_active_threads:0
vm_stats_blocked_clients:0
db0:keys=4,expires=0
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Redis教程2--Redis資料類型及相關命令