Redis-數(shù)據(jù)結(jié)構(gòu)&常用指令

零、本文綱要

一、Redis數(shù)據(jù)結(jié)構(gòu)
二、Redis常用命令
三、String類型&常用命令
四、Hash類型&常用命令
五、List類型&常用命令
六、Set類型&常用命令
七、SortedSet類型&常用命令
八、Geo類型&常用命令
九、BitMap類型&常用命令
十、HyperLogLog類型&常用命令

tips:Ctrl + F 快速定位到所需內(nèi)容閱讀吧。

一、Redis數(shù)據(jù)結(jié)構(gòu)

1、基本數(shù)據(jù)類型

  • ① String:hello world
  • ② Hash:{name:"tom",age:24}
  • ③ List:[A → B → C]
  • ④ Set:{a, b, c}
  • ⑤ SortedSet:{a:1, b:2, c:3}

2、其他常用數(shù)據(jù)類型

  • ① GEO:{A:(20.3, 18.4)}
  • ② BitMap:0001001100101101
  • ③ HyperLog:0100000110110001

二、Redis常用命令

1、查看通用命令

help @generic

查看通用命令.png

2、常用通用命令

  • ① 刪除指定的key
DEL key [key ...] 
  • ② 判斷指定的key是否存在
EXISTS key [key ...] 
  • ③ 設(shè)置指定的key過期時(shí)間
EXPIRE key seconds
  • ④ 查看所有匹配的key
KEYS pattern
  • ⑤ 查看指定key的過期時(shí)間
TTL key
常用通用命令.png

三、String類型&常用命令

1、認(rèn)識(shí)String類型

String類型,也就是字符串類型,是Redis中最簡單的存儲(chǔ)類型。

其value是字符串,根據(jù)字符串的格式不同,可以分為3類:
string:普通字符串;
int:整數(shù)類型,可以做自增、自減操作;
float:浮點(diǎn)類型,可以做自增、自減操作。

不管是哪種格式,底層都是字節(jié)數(shù)組形式存儲(chǔ),只不過是編碼方式不同。字符串類型的最大空間不能超過512m

2、String類型常用命令

① SET:添加或者修改已經(jīng)存在的一個(gè)String類型的鍵值對(duì);
② GET:根據(jù)key獲取String類型的value;
③ MSET:批量添加多個(gè)String類型的鍵值對(duì);
④ MGET:根據(jù)多個(gè)key獲取多個(gè)String類型的value;
⑤ INCR:讓一個(gè)整型的key自增1;
⑥ INCRBY:讓一個(gè)整型的key自增并指定步長,例如:incrby num 2 讓num值自增2;
⑦ INCRBYFLOAT:讓一個(gè)浮點(diǎn)類型的數(shù)字自增并指定步長;
⑧ SETNX:添加一個(gè)String類型的鍵值對(duì),前提是這個(gè)key不存在,否則不執(zhí)行;
⑨ SETEX:添加一個(gè)String類型的鍵值對(duì),并且指定有效期。

String類型常用命令.png

補(bǔ)充:查看單個(gè)指令的具體用法,如下:

127.0.0.1:6379> help SET

  SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

如我們?cè)O(shè)置SETNX和SETEX時(shí),如果希望NX和EX同時(shí)在一條指令內(nèi)完成設(shè)置,則可以按照SET key5 value5 EX 10 NX這種指令來執(zhí)行。

3、key的結(jié)構(gòu)

Redis的key允許有多個(gè)單詞形成層級(jí)結(jié)構(gòu),多個(gè)單詞之間用':'隔開,格式如下:

項(xiàng)目名:業(yè)務(wù)名:類型:id
socail:login:token:6eaa542573f549f28f26ac4e657b3455

四、Hash類型&常用命令

1、認(rèn)識(shí)Hash類型

Hash類型,也叫散列,其value是一個(gè)無序字典,類似于Java中的HashMap結(jié)構(gòu)。

2、對(duì)比String類型和Hash類型

String結(jié)構(gòu)是將對(duì)象序列化為JSON字符串后存儲(chǔ),當(dāng)需要修改對(duì)象某個(gè)字段時(shí)很不方便;

SET user1 "{\"name\":\"tom\",\"age\":24}"

Hash結(jié)構(gòu)可以將對(duì)象中的每個(gè)字段獨(dú)立存儲(chǔ),可以針對(duì)單個(gè)字段做CRUD

HSET user2 name jack age 25
對(duì)比String類型和Hash類型.png

3、Hash類型常用命令

① HSET key field value:添加或者修改hash類型key的field的值;
② HGET key field:獲取一個(gè)hash類型key的field的值;
③ HMSET:批量添加多個(gè)hash類型key的field的值;
④ HMGET:批量獲取多個(gè)hash類型key的field的值;
⑤ HGETALL:獲取一個(gè)hash類型的key中的所有的field和value;
⑥ HKEYS:獲取一個(gè)hash類型的key中的所有的field;
⑦ HVALS:獲取一個(gè)hash類型的key中的所有的value;
⑧ HINCRBY:讓一個(gè)hash類型key的字段值自增并指定步長;
⑨ HSETNX:添加一個(gè)hash類型的key的field值,前提是這個(gè)field不存在,否則不執(zhí)行。

Hash類型常用命令.png

五、List類型&常用命令

1、認(rèn)識(shí)List類型

Redis中的List類型與Java中的LinkedList類似,可以看做是一個(gè)雙向鏈表結(jié)構(gòu)。既可以支持正向檢索和也可以支持反向檢索。

特征也與LinkedList類似:
① 有序;
② 元素可以重復(fù);
③ 插入和刪除快;
④ 查詢速度一般。

常用來存儲(chǔ)一個(gè)有序數(shù)據(jù),例如:朋友圈點(diǎn)贊列表評(píng)論列表等。

2、List類型的常見命令

① LPUSH key element ... :向列表左側(cè)插入一個(gè)或多個(gè)元素;
② LPOP key:移除并返回列表左側(cè)的第一個(gè)元素,沒有則返回nil;
③ RPUSH key element ... :向列表右側(cè)插入一個(gè)或多個(gè)元素;
④ RPOP key:移除并返回列表右側(cè)的第一個(gè)元素;
⑤ LRANGE key star end:返回一段角標(biāo)范圍內(nèi)的所有元素;
⑥ BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時(shí)等待指定時(shí)間,而不是直接返回nil。

List類型的常見命令.png

六、Set類型&常用命令

1、認(rèn)識(shí)Set類型

Redis的Set結(jié)構(gòu)與Java中的HashSet類似,可以看做是一個(gè)value為null的HashMap。

因?yàn)橐彩且粋€(gè)hash表,因此具備與HashSet類似的特征:
① 無序;
② 元素不可重復(fù);
③ 查找快;
④ 支持交集、并集、差集等功能。

2、Set類型的常見命令

① SADD key member ... :向set中添加一個(gè)或多個(gè)元素;
② SREM key member ... : 移除set中的指定元素;
③ SCARD key: 返回set中元素的個(gè)數(shù);
④ SISMEMBER key member:判斷一個(gè)元素是否存在于set中;
⑤ SMEMBERS:獲取set中的所有元素;
⑥ SINTER key1 key2 ... :求key1與key2的交集;
⑦ SDIFF key1 key2 ... :求key1與key2的差集;
⑧ SUNION key1 key2 ..:求key1和key2的并集。

集合交并差情形.png

3、好友列表的案例

好友列表的案例.png

七、SortedSet類型&常用命令

1、認(rèn)識(shí)SortedSet類型

Redis的SortedSet是一個(gè)可排序的set集合,與Java中的TreeSet有些類似,但底層數(shù)據(jù)結(jié)構(gòu)卻差別很大。SortedSet中的每一個(gè)元素都帶有一個(gè)score屬性,可以基于score屬性對(duì)元素排序,底層的實(shí)現(xiàn)是一個(gè)跳表(SkipList)加 hash表。

SortedSet具備下列特性:
① 可排序;
② 元素不重復(fù);
③ 查詢速度快。

因?yàn)镾ortedSet的可排序特性,經(jīng)常被用來實(shí)現(xiàn)排行榜這樣的功能。

2、SortedSet類型的常見命令

① ZADD key score member:添加一個(gè)或多個(gè)元素到sorted set ,如果已經(jīng)存在則更新其score值;
② ZREM key member:刪除sorted set中的一個(gè)指定元素;
③ ZSCORE key member : 獲取sorted set中的指定元素的score值;
④ ZRANK key member:獲取sorted set 中的指定元素的排名;
⑤ ZCARD key:獲取sorted set中的元素個(gè)數(shù);
⑥ ZCOUNT key min max:統(tǒng)計(jì)score值在給定范圍內(nèi)的所有元素的個(gè)數(shù);
⑦ ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值;
⑧ ZRANGE key min max:按照score排序后,獲取指定排名范圍內(nèi)的元素;
⑨ ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內(nèi)的元素。
其他:ZDIFF、ZINTER、ZUNION:求差集、交集、并集。
注意:所有的排名默認(rèn)都是升序,如果要降序則在命令的Z后面添加REV即可。

3、班級(jí)排名的案例

班級(jí)排名的案例.png

八、Geo類型&常用命令

1、認(rèn)識(shí)Geo類型

GEO就是Geolocation的簡寫形式,代表地理坐標(biāo)。Redis在3.2版本中加入了對(duì)GEO的支持,允許存儲(chǔ)地理坐標(biāo)信息,幫助我們根據(jù)經(jīng)緯度來檢索數(shù)據(jù)。

2、Geo類型的常用命令

① GEOADD:添加一個(gè)地理空間信息,包含:經(jīng)度(longitude)、緯度(latitude)、值(member);
② GEODIST:計(jì)算指定的兩個(gè)點(diǎn)之間的距離并返回;
③ GEOHASH:將指定member的坐標(biāo)轉(zhuǎn)為hash字符串形式并返回;
④ GEOPOS:返回指定member的坐標(biāo);
⑤ GEORADIUS:指定圓心、半徑,找到該圓內(nèi)包含的所有member,并按照與圓心之間的距離排序后返回。6.2以后已廢棄;
⑥ GEOSEARCH:在指定范圍內(nèi)搜索member,并按照與指定點(diǎn)之間的距離排序后返回。范圍可以是圓形或矩形。6.2.新功能;
⑦ GEOSEARCHSTORE:與GEOSEARCH功能一致,不過可以把結(jié)果存儲(chǔ)到一個(gè)指定的key。 6.2.新功能。

補(bǔ)充:坐標(biāo)的相關(guān)內(nèi)容可以通過拾取坐標(biāo)系統(tǒng) (baidu.com)獲得。

Geo類型的常用命令.png

九、BitMap類型&常用命令

1、認(rèn)識(shí)BitMap類型

Redis中是利用string類型數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)BitMap,因此最大上限是512M,轉(zhuǎn)換為bit則是 2^32個(gè)bit位。

2、BitMap常用命令

① SETBIT:向指定位置(offset)存入一個(gè)0或1;
② GETBIT :獲取指定位置(offset)的bit值;
③ BITCOUNT :統(tǒng)計(jì)BitMap中值為1的bit位的數(shù)量;
④ BITFIELD :操作(查詢、修改、自增)BitMap中bit數(shù)組中的指定位置(offset)的值;
⑤ BITFIELD_RO :獲取BitMap中bit數(shù)組,并以十進(jìn)制形式返回;
⑥ BITOP :將多個(gè)BitMap的結(jié)果做位運(yùn)算(與 、或、異或);
⑦ BITPOS :查找bit數(shù)組中指定范圍內(nèi)第一個(gè)0或1出現(xiàn)的位置。

3、用戶每月簽到情形模擬

image.png

使用BitMap存儲(chǔ)指定的簽到數(shù)據(jù),其值存儲(chǔ)一個(gè)月的數(shù)據(jù)僅占4字節(jié)。

十、HyperLogLog類型&常用命令

1、認(rèn)識(shí)HyperLogLog類型

Hyperloglog(HLL)是從Loglog算法派生的概率算法,用于確定非常大的集合的基數(shù),而不需要存儲(chǔ)其所有值。

Redis中的HLL是基于string結(jié)構(gòu)實(shí)現(xiàn)的,單個(gè)HLL的內(nèi)存永遠(yuǎn)小于16kb,內(nèi)存占用低。作為代價(jià),其測(cè)量結(jié)果是概率性的,有小于0.81%的誤差。

2、HyperLogLog類型常用指令

① PFADD:將指定元素添加到指定的HLL;
② PFCOUNT:返回HLL中元素的近似數(shù)量值;
③ PFMERGE:將多個(gè)HLL合并為一個(gè)。

HyperLogLog類型常用指令.png

注意:由于HyperLogLog存在一定的統(tǒng)計(jì)誤差,實(shí)際業(yè)務(wù)允許情況下可以用于統(tǒng)計(jì)UV。

十一、結(jié)尾

以上即為Redis數(shù)據(jù)結(jié)構(gòu)部分的基礎(chǔ)內(nèi)容,感謝閱讀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容