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),還有數字(整型、浮點型),二進制(圖片、音頻、視頻)redis

設值命令
//設置一個鍵的值,能夠帶一個過時時間
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特適合用於存儲對象。咱們假設有一個用戶信息以下json

用戶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 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。app

添加命令
//添加一個或多個指定的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    //取set一、set二、set3三個集合的交集

//取全部指定集合的並集
SUNION key [key ...]
sunion set1 set2 set3    //取set一、set二、set3三個集合的並集

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

順序集合(zset)

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

添加命令
//將全部指定成員添加到鍵爲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官網查看相關的文檔。線程

同時若是你們發現了錯誤,但願能留言提出來,以避免誤人子弟。

相關文章
相關標籤/搜索