Redis的基本數據結構及基本命令詳解

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

至於如何安裝、配置redis,此處不做講解。此文主要講解redis的基本數據結構以及使用redis客戶端的基本操作命令。另外下面命令演示時,大寫的命令格式爲官方定義格式,小寫的爲具體使用格式

字符串(string)

實際上可以是字符串(包括xml、json),還有數字(整型、浮點型),二進制(圖片、音頻、視頻)

設值命令
//設置一個鍵的值,可以帶一個過期時間
SET key value [EX seconds] [PX milliseconds] [NX|XX]
set name jmx            //直接設置name=jmx
set version 1.0 ex 10     //設置version=1.0,並且10s後過期
ttl version                //設置了過期時間之後,使用ttl命令可以看到鍵的剩餘過去時間

//批量設置
MSET key value [key value ...]
mset sex boy age 18         //批量設置sex=boy,age=18

//如果key存在,不執行任何操作,如果key不存在,等價於set命令
SETNX key value
setnx name cndy            //不存在鍵name就設置成功,存在時設置失敗
取值命令
//獲取鍵的值
GET key
get name                 //返回jmx

//批量獲取鍵的值
MGET key [key ...]
mget name sex age         //批量獲取name、sex、age,返回jmx、boy、18

雖然存儲的是字符串,但是也可以是數字字符串,因此redis支持遞增或者遞減的操作

數字操作
set num 10                //先在redis中設置一個數字字符串

//對存儲在指定key的數值執行原子的加1操作
INCR key
incr num                //num自增加1,並且返回11

//將key對應的數字加decrement
INCRBY key increment
incrby num 10            //num的值加10,返回21

//對key對應的數字做減1操作
DECR key
decr num                 //num減1,返回20

//將key對應的數字減decrement
DECRBY key decrement
decrby num 10            //num值減20,返回10
其他命令
//如果 key 已經存在,並且值爲字符串,那麼這個命令會把 value 追加到原來值(value)的結尾。 
//如果 key 不存在,那麼它將首先創建一個空字符串的key,再執行追加操作
APPEND key value
append name luckly        //name原來的值爲:jmx,執行此命令之後name的值爲:jmxluckly

//返回key的string類型value的長度。
//如果key對應的非string類型,就返回錯誤
STRLEN key
strlen name             //返回jmxluckly的長度9

//截取字符串
//可以使用-1表示最後一個字符串的位置,-2表示倒數第二個字符串的位置
GETRANGE key start end
getrange name 1 5        //返回mxluc,返回第一個到第無個之間的字符串

哈希(hash)

Redis hash是一個string類型的field和value的映射表.一個key可對應多個field,一個field對應一個value。hash特適合用於存儲對象。我們假設有一個用戶信息如下

用戶id 用戶編碼 用戶名稱 性別 年齡
1 jmx 君莫笑 boy 18

接下來我們使用命令來將用戶信息以hash的方式存入到redis中

設值命令
//設置 key 指定的哈希集中指定字段的值。
//如果 key 指定的哈希集不存在,會創建一個新的哈希集並與 key 關聯。
//如果字段在哈希集中存在,它將被重寫。
HSET key field value
hset user:1 usercode jmx    //設置鍵user:1的屬性usercode的值爲jmx

//存在不做任何操作、不存在類似HSET的功能
HSETNX key field value
hsetnx user:1 usercode jmxs    //因爲user:1的usercode已存在,所以不執行任何操作。返回0

//批量設置key的屬性(多個屬性)
HMSET key field value [field value ...]
hmset user:1 usercode jmx sex boy age 18    //同時設值鍵userf:1的屬性usercode、sex、age

//增加 key 指定的哈希集中指定字段的數值
HINCRBY key field increment
hincrby user:1 age 1    //對age屬性加1(我又大一歲了)
取值命令
//返回 key 指定的哈希集中該字段所關聯的值
HGET key field
hget user:1 usercode    //返回user:1的屬性usercode的值jmx(因爲上面設值了user:1的usercode的值爲jmx)

//返回 key 指定的哈希集中指定字段的值。
//對於哈希集中不存在的每個字段,返回nil值,因爲不存在的keys被認爲是一個空的哈希集。
//對一個不存在的key執行HMGET將返回一個只含有nil值的列表
HMGET key field [field ...]
hmget user:1 age sex usercode    //返回:18 boy jmx

//返回 key 指定的哈希集中所有的字段和值。
//返回值中,每個字段名的下一個是它的值,所以返回值的長度是哈希集大小的兩倍
HGETALL key
hgetall user:1        //返回user:1的所有屬性和所有值

//返回 key 指定的哈希集中所有字段的名字
HKEYS key
hkeys user:1        //返回usercode、sex、age

//返回 key 指定的哈希集中所有字段的值
HVALS key
hvals user:1        //返回user:1的所有屬性對應的值(不包含屬性)
刪值命令
//從 key 指定的哈希集中移除指定的域。在哈希集中不存在的域將被忽略。
HDEL key field [field ...]
hdel user:1 age        //移除user:1的age屬性
其他命令
//返回hash裏面field是否存在
HEXISTS key field
hexists user:1 age        //返回0,因爲上面使用hdel命令把age屬性移除了

//返回 key 指定的哈希集包含的字段的數量
HLEN key
hlen user:1            //返回2,2個屬性(usercode和sex)

//返回hash指定field的value的字符串長度,如果hash或者field不存在,返回0.
HSTRLEN key field
hstrlen user:1 usercode        //返回3,usercode的值爲jmx,長度爲3
hstrlen user:1 age            //返回0,age屬性不存在,返回0

列表(list)

Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),也可以從頭部(左邊)或者尾部(右邊)拿到一個元素。

設值命令
//將所有指定的值插入到存於 key 的列表的頭部
//如果 key 不存在,那麼在進行 push 操作前會創建一個空列表。 
//如果 key 對應的值不是一個 list 的話,那麼會返回一個錯誤。
LPUSH key value [value ...]
lpush list a b c         //把a b c依次從頭部放入list中

//依次從尾部插入列表,使用方式和LPUSH方式一樣,省略演示代碼
RPUSH key value [value ...]

//在某個內容之前或者之後插入
LINSERT key BEFORE|AFTER pivot value
linsert list before b tearcher        //在b之前插入tearcher
取值命令
//移除並且返回 key 對應的 list 的第一個元素
LPOP key
lpop list        //返回並移除列表中的第一個元素

//移除並返回存於 key 的 list 的最後一個元素
RPOP key
rpop list        //返回並移除列表中的最後一個元素
查詢命令
//返回存儲在 key 的列表裏指定範圍內的元素
//從0開始。-1表示最後一個元素
LRANGE key start stop
lrange list 0 -1        //查詢list的所有元素(0爲起始下標,-1爲終止下標)

//返回存儲在 key 裏的list的長度
LLEN key
llen list
刪除命令
//從存於 key 的列表裏移除前 count 次出現的值爲 value 的元素。 
//這個 count 參數通過下面幾種方式影響這個操作:
//count > 0: 從頭往尾移除值爲 value 的元素。
//count < 0: 從尾往頭移除值爲 value 的元素。
//count = 0: 移除所有值爲 value 的元素。
LREM key count value
lrem list 0 a        //移除list中所有的a

集合(set)

Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。

添加命令
//添加一個或多個指定的member元素到集合的key中
SADD key member [member ...]
sadd sets write read play write        //因爲不能重複,因此sets中只有write、read、play

查詢命令
//返回key集合所有的元素
SMEMBERS key
smembers sets        //獲取sets中的所有元素

//返回成員 member 是否是存儲的集合 key的成員
SISMEMBER key member
sismember sets read        //返回1,表示存在該元素

//查詢集合的長度
SCARD key
scard sets        //返回sets中總共有多少元素之和

//取指定所有集合的交集
SINTER key [key ...]
sinter set1 set2 set3    //取set1、set2、set3三個集合的交集

//取所有指定集合的並集
SUNION key [key ...]
sunion set1 set2 set3    //取set1、set2、set3三個集合的並集

//取集合的差集
SDIFF key [key ...]
sidff set1 set2            //取集合set1、set2的差集
移除命令
//在key集合中移除指定的元素
SREM key member [member ...]
srem sets play        //將play屬性從sets中移除

順序集合(zset)

zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。因爲帶有排序,所以適合比如排行榜之類的功能。

添加命令
//將所有指定成員添加到鍵爲key有序集合(sorted set)裏面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
zadd scan 1500 gooda 500 goodb 1000 goodc    //商品a、b、c的瀏覽量爲分別爲1500、500、1000
zadd scan nx 100 goodd   //鍵scan必須不存在,主用於添加
zadd scan xx incr 200 goodd   //鍵scan必須存在,主用於修改,商品d新增200瀏覽量

//爲有序集key的成員member的score值加上增量increment
ZINCRBY key increment member
zincrby scan 200 gooda        //給商品a增加200的瀏覽量
查看命令
//返回存儲在有序集合key中的指定範圍的元素
//-1未之後一個元素
//返回的元素可以認爲是按得分從最低到最高排列
ZRANGE key start stop [WITHSCORES]
zrange scan 0 1 withscores        //查詢點擊量最低的2個商品

//返回存儲在有序集合key中的指定範圍的元素
//-1未之後一個元素
//返回的元素可以認爲是按得分從最高到低高排列
ZREVRANGE key start stop [WITHSCORES]
zrevrange scan 0 1 withscores        //查詢點擊量最高的2個商品

//以下命令比較簡單,省略演示
//返回有序集key中成員member的排名(從小到大)
ZRANK key member
//返回有序集key中成員member的排名(從大到小)
ZREVRANK key member
//返回有序集key中,成員member的score值
ZSCORE key member
//返回key的有序集元素個數
ZCARD key
刪除命令
//刪除一個元素
ZREM key member [member ...]
zrem scan goodc        //將商品c的瀏覽量從集合中刪除

其他常用命令

除了上述類型操作命令之後,還要一些常用的命令如下

//返回key所存儲的value的數據結構類型,它可以返回string, list, set, zset 和 hash等不同的類型
TYPE key
type name    //查看鍵name類型,返回string

//選擇一個數據庫,下標值從0開始,一個新連接默認連接的數據庫是DB0
SELLECT index
select 1    //切換到DB1

//爲redis服務請求設置一個密碼
AUTH password
auth 123456        //如果設置了redis密碼的話,使用此命令設置密碼

//刪除當前數據庫裏面的所有數據
FLUSHDB
//刪除所有數據庫裏面的所有數據,注意不是當前數據庫,而是所有數據庫
FLUSHALL
//返回當前數據裏面keys的數量
DBSIZE

//查找所有符合給定模式pattern(正則表達式)的 key
KEYS pattern
keys *         //查詢所有的key,慎用(因爲redis是單線程,使用此命令會阻塞其他的命令)

總結

因爲命令太多,上述命令只是redis中的一部分命令而已。更多的命令希望大家去redis官網查看相關的文檔。

同時如果上述事例中如果存在錯誤,希望大家能留言提出來,我定會改正以免誤人子弟。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章