redis基本API的理解和使用

前言

在正式介紹5種數(shù)據(jù)結(jié)構(gòu)之前,了解一下Redis的一些全局命令、數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼等。

全局命令
  • 查看所有鍵
    keys * —o(n)
  • 鍵總數(shù)
    dbsize —o(1)
  • 檢查鍵是否存在
    exists key—o(1)如果鍵存在則返回1,不存在則返回0
  • 刪除鍵
    del key [key ...]—o(1)通用所有的數(shù)據(jù)結(jié)果
  • 鍵過(guò)期
    expire key seconds 設(shè)置過(guò)期時(shí)間
    ttl key 剩余過(guò)期時(shí)間,它有3種返回值:(1)大于等于0的整數(shù):鍵剩余的過(guò)期時(shí)間。(2)-1:鍵沒設(shè)置過(guò)期時(shí)間。(3)-2:鍵不存在
  • 鍵的數(shù)據(jù)結(jié)構(gòu)類型
    type key
5種數(shù)據(jù)結(jié)構(gòu)
字符串

字符串類型是Redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),字符串類型的值實(shí)際可以是字符串(簡(jiǎn)單的字符串、復(fù)雜的字符串(例如JSON、XML)、數(shù)字(整數(shù)、浮點(diǎn)數(shù)),甚至是二進(jìn)制(圖片、音頻、視頻),但是值最大不能超過(guò)512MB。

字符串?dāng)?shù)據(jù)結(jié)構(gòu).png
* 命令
(1)設(shè)置值
set key value [ex seconds] [px milliseconds] [nx|xx]

set hello world
OK

set命令有幾個(gè)選項(xiàng):
·ex seconds:為鍵設(shè)置秒級(jí)過(guò)期時(shí)間。
·px milliseconds:為鍵設(shè)置毫秒級(jí)過(guò)期時(shí)間。
·nx:鍵必須不存在,才可以設(shè)置成功,用于添加。
·xx:與nx相反,鍵必須存在,才可以設(shè)置成功,用于更新。
除了set選項(xiàng), Redis還提供了setex和setnx兩個(gè)命令:

setex key seconds value
setnx key value

(2)獲取值
get key

127.0.0.1:6379> get hello
"world"

(3)批量設(shè)置/獲取值
mset/mget key value [key value ...]
(4)計(jì)算相關(guān)
incr key (自增)、decr(自減)、 incrby(自增指定數(shù)字)、decrby(自減指定數(shù)字)、 incrbyfloat(自增浮點(diǎn)數(shù))
(5)不常用命令
append key value(追加)、strlen key(字符長(zhǎng)度)、getset key value(設(shè)置并返回原值)、setrange key offeset value(設(shè)置指定位置的字符)等

字符串類型命令時(shí)間復(fù)雜度.png

  • 內(nèi)部編碼
    (1)int: 8個(gè)字節(jié)的長(zhǎng)整型。
    (2)embstr:小于等于39個(gè)字節(jié)的字符串。
    (3)raw:大于39個(gè)字節(jié)的字符串
  • 典型使用場(chǎng)景
    (1)緩存功能
    (2)計(jì)數(shù)
    (3)共享Session
    (4)限速等
哈希

哈希類型是指鍵值本身又是一個(gè)鍵值對(duì)結(jié)構(gòu),形如value={{field1, value1}, ...{fieldN,valueN}}
字符串和哈希類型對(duì)比.png
  • 命令
    (1)設(shè)置/獲取值
    hset/hget key field value
    (2)刪除field
    hdel key field [field ...]
    (3)批量設(shè)置或獲取field-value
    hmget key field [field ...]/hmset key field value [field value ...]
    (4)判斷field是否存在
    hexists key
    (5)獲取所有field/獲取所有value
    hkeys/ hvals key
    (6)其他等
    hgetall key(獲取所有的field-value)、hincrby key field,hincrbyfloat key field(像incrby和incrbyfloat命令一樣,但是它們的作用域是filed)、hstrlen key field(計(jì)算長(zhǎng)度)等
    哈希類型命令的時(shí)間復(fù)雜度.png
  • 內(nèi)部編碼
    (1)ziplist(壓縮列表):當(dāng)哈希類型元素個(gè)數(shù)小于hash-max-ziplist-entries配置(默認(rèn)512個(gè))、同時(shí)所有值都小于hash-max-ziplist-value配置(默認(rèn)64字節(jié)時(shí), Redis會(huì)使用ziplist作為哈希的內(nèi)部實(shí)現(xiàn), ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),所以在節(jié)省內(nèi)存方面比hashtable更加優(yōu)秀。
    (2)hashtable(哈希表):當(dāng)哈希類型無(wú)法滿足ziplist的條件時(shí), Redis會(huì)使用hashtable作為哈希的內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降,而hashtable的讀寫時(shí)間復(fù)雜度為O(1)
  • 使用場(chǎng)景
    (1)緩存對(duì)象信息,省去string序列化消耗
    (2)哈希類型是稀疏的
列表

列表( list)類型是用來(lái)存儲(chǔ)多個(gè)有序且重復(fù)的字符串。

  • 命令
    (1)添加操作
    rpush key value [value ...](右邊添加)、lpush key value [value ...](左邊添加)、linsert key before|after pivot value(向某個(gè)元素前或者后插入元素)
    (2)查詢
    lrange key start end(指定范圍內(nèi)的元素列表)、lindex key index(列表指定索引下標(biāo)的元素)、llen key(列表長(zhǎng)度)
    (3)刪除
    lpop key(左邊刪除)、rpop key(右邊刪除)、lrem key count value(刪除指定元素)
    (4)修改
    lset key index newValue
    列表命令時(shí)間復(fù)雜度.png
  • 內(nèi)部編碼
    (1)ziplist(壓縮列表):當(dāng)列表的元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)512個(gè)),同時(shí)列表中每個(gè)元素的值都小于list-max-ziplist-value配置時(shí)(默認(rèn)64字節(jié)), Redis會(huì)選用ziplist來(lái)作為列表的內(nèi)部實(shí)現(xiàn)來(lái)減少內(nèi)存的使用。
    (2)linkedlist(鏈表):當(dāng)列表類型無(wú)法滿足ziplist的條件時(shí), Redis會(huì)使用linkedlist作為列表的內(nèi)部實(shí)現(xiàn)。
  • 使用場(chǎng)景
    (1)消息隊(duì)列
    (2)文章列表
集合

集合( set)類型也是用來(lái)保存多個(gè)的字符串元素,但和列表類型不一樣的是,集合中不允許有重復(fù)元素,并且集合中的元素是無(wú)序的,不能通過(guò)索引下標(biāo)獲取元素。
集合類型.png
  • 命令
    (1)集合內(nèi)操作
    sadd key element [element ...](添加元素)、srem key element [element ...](刪除元素)、scard key(計(jì)算個(gè)數(shù))、sismember key element(判斷是否在集合中)、srandmember key [count](隨即取指定元素)、spop key(隨即彈出元素)、smembers key(獲取所有元素)
    (2)集合間操作
    sinter key [key ...](交集)、suinon key [key ...](并集)、sdiff key [key ...](差集)
    集合常用命令時(shí)間復(fù)雜度.png
  • 內(nèi)部編碼
    (1)intset(整數(shù)集合):當(dāng)集合中的元素都是整數(shù)且元素個(gè)數(shù)小于set-maxintset-entries配置(默認(rèn)512個(gè))時(shí), Redis會(huì)選用intset來(lái)作為集合的內(nèi)部實(shí)
    現(xiàn),從而減少內(nèi)存的使用。
    (2)hashtable(哈希表):當(dāng)集合類型無(wú)法滿足intset的條件時(shí), Redis會(huì)使用hashtable作為集合的內(nèi)部實(shí)現(xiàn)。
  • 使用場(chǎng)景
    (1)打標(biāo)簽。
    (2)計(jì)算共同愛好用戶等。
有序集合

有序集合相對(duì)于哈希、列表、集合來(lái)說(shuō)會(huì)有一點(diǎn)點(diǎn)陌生,但既然叫有序集合,那么它和集合必然有著聯(lián)系,它保留了集合不能有重復(fù)成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標(biāo)作為排序依據(jù)不同的是,它給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù)( score)作為排序的依據(jù)。

eg:
有序集合.png
  • 命令
    (1)集合內(nèi)操作
    zadd key score member [score member...](添加元素)、zscore key member(計(jì)算某個(gè)成員的分?jǐn)?shù))、zcard key(計(jì)算個(gè)數(shù))、zrank/zrevrank key member(排名)等
    (2)集合間操作
    zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](交集)、zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](并集)
這個(gè)命令參數(shù)較多,下面分別進(jìn)行說(shuō)明:
(1)destination:交集計(jì)算結(jié)果保存到這個(gè)鍵。
(2)numkeys:需要做交集計(jì)算鍵的個(gè)數(shù)。
(3)key[key...]:需要做交集計(jì)算的鍵。
(4)weights weight[weight...]:每個(gè)鍵的權(quán)重,在做交集計(jì)算時(shí),每個(gè)鍵中的每個(gè)member會(huì)將自己分?jǐn)?shù)乘以這個(gè)權(quán)重,每個(gè)鍵的權(quán)重默認(rèn)是1。
(5)aggregate sum|min|max:計(jì)算成員交集后,分值可以按照sum(和)、min(最小值)、 max(最大值)做匯總,默認(rèn)值是sum。
eg:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1
user:ranking:2
(integer) 3
有序集合命令的時(shí)間復(fù)雜度.png
  • 內(nèi)部編碼
    (1)ziplist(壓縮列表):當(dāng)有序集合的元素個(gè)數(shù)小于zset-max-ziplistentries配置(默認(rèn)128個(gè)),同時(shí)每個(gè)元素的值都小于zset-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí), Redis會(huì)用ziplist來(lái)作為有序集合的內(nèi)部實(shí)現(xiàn),ziplist可以有效減少內(nèi)存的使用。
    (2)skiplist(跳躍表):當(dāng)ziplist條件不滿足時(shí),有序集合會(huì)使用skiplist作為內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降。
  • 使用場(chǎng)景
    (1)添加用戶贊數(shù)。
    (2)取消用戶贊。
    (3)展示獲取贊數(shù)最多的十個(gè)用戶。
    (4)展示用戶信息以及用戶分?jǐn)?shù)。
    列表、集合和有序集合三者的異同點(diǎn).png

注意事項(xiàng):命令遍歷所有的鍵,分別是keys和scan

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Redis的內(nèi)存優(yōu)化 聲明:本文內(nèi)容來(lái)自《Redis開發(fā)與運(yùn)維》一書第八章,如轉(zhuǎn)載請(qǐng)聲明。 Redis所有的數(shù)據(jù)都...
    meng_philip123閱讀 19,061評(píng)論 2 29
  • 參考來(lái)源 Redis的內(nèi)存優(yōu)化 Redis所有的數(shù)據(jù)都在內(nèi)存中,而內(nèi)存又是非常寶貴的資源。對(duì)于如何優(yōu)化內(nèi)存使用一直...
    秦漢郵俠閱讀 1,370評(píng)論 0 2
  • 全局命令 1.查看所有鍵 keys*命令會(huì)將所有的鍵輸出,遍歷O(n),線上禁用 2.鍵總數(shù) dbsize命令會(huì)返...
    何何與呵呵呵閱讀 770評(píng)論 0 2
  • 1.通用命令 1.1通用命令 keys *遍歷所有key keys [pattern]遍歷符合通配符的所有key ...
    香沙小熊閱讀 581評(píng)論 0 0
  • 聲明:本文內(nèi)容來(lái)自《Redis開發(fā)與運(yùn)維》一書第八章,如轉(zhuǎn)載請(qǐng)聲明。Redis所有的數(shù)據(jù)都在內(nèi)存中,而內(nèi)存又是非常...
    yoqu閱讀 1,610評(píng)論 0 2

友情鏈接更多精彩內(nèi)容