杭州營銷seo顧問服務(wù)四川
5.redis常用的五種數(shù)據(jù)類型
5.1 Redis String字符串
5.1.1 簡介
- String類型在redis中最常見的一種類型
- string類型是二制安全的,可以存放字符串、數(shù)值、json、圖像數(shù)據(jù)
- value存儲最大數(shù)據(jù)量是512M
5.1.2 常用命令
set
< key>< value>:添加鍵值對(下面指令可以再后添加)- nx:當(dāng)數(shù)據(jù)庫中key不存在時(shí),可以將key-value添加到數(shù)據(jù)庫
- xx: 當(dāng)數(shù)據(jù)庫key存在時(shí),可以將key-value添加到數(shù)據(jù)庫,與nx參數(shù)互斥
- ex: 設(shè)置key-value添加到數(shù)據(jù)庫,并設(shè)置key的超時(shí)時(shí)間(以秒鐘為單位)
- px:設(shè)置key-value添加到數(shù)據(jù)庫,并設(shè)置key的超時(shí)時(shí)間(以豪秒鐘為單位),與ex互斥
get
< key>查詢對應(yīng)鍵值append
< key>< value>:將給定的值追加到key的末尾strlen
< key>:獲取值的長度setnx
< key>< value>:只有在key不存在時(shí),設(shè)置key-value加入到數(shù)據(jù)庫setex
< key> < timeout>< value>:添加鍵值對,同時(shí)設(shè)置過期時(shí)間(以秒為單位)incr
< key>:將key中存儲的數(shù)字加1處理,只能對數(shù)字值操作。如果是空,添加進(jìn)key并設(shè)值為1decr
< key>:將key中存儲的數(shù)字減1處理,只能對數(shù)字值操作。如果是空,值為1incrby
< key>< increment>:將key中存儲的數(shù)字值增加指定步長的數(shù)值,如果是空,值為步長。
(具有原子性)decrby
< key>< decrement>: 將key中存儲的數(shù)字值減少指定步長的數(shù)值,如果是空,值為步長。
(具有原子性)mset
< key1>< value1>[< key2>< value2>…]:同時(shí)設(shè)置1個(gè)或多個(gè)key-value值mget
< key1>[< key2>…]:同時(shí)獲取1個(gè)或多個(gè)valuemsetnx
< key1>< value1>[< key2>< value2>…]:當(dāng)所有給定的key都不存在時(shí),同時(shí)設(shè)置1個(gè)或
多個(gè)key-value值**(具有原子性)**getrange
/substr
< key>< start>< end> 將給定key,獲取從start(包含)到end(包含)的值setrange
< key>< offset>< value>:從偏移量offset開始,用value去覆蓋key中存儲的字符串值getset
< key>< value>: 對給定的key設(shè)置新值,同時(shí)返回舊值。如果key不存在,則添加一個(gè)key-value值
5.1.3應(yīng)用場景
單值緩存
- 設(shè)置值:
set key value
; - 獲取值:
get key
對象緩存
set stu:001 value(json)
(把對象轉(zhuǎn)為json串保存)mset stu:001:name zhangsan stu:001:age 18 stu:001:gender 男
(分別對每個(gè)字段進(jìn)行不同key的存儲)mget stu:001:name stu:001:age
(批量獲取)
分布式鎖
setnx key:001 true
//返回1代表加鎖成功setnx key:001 true
//返回0代表加鎖失敗,setnx如果存在,則無法存入數(shù)據(jù),返回0- //…業(yè)務(wù)操作
del key:001
//執(zhí)行完業(yè)務(wù)釋放鎖
set key:001 true ex 20 nx
//防止程序意外終止導(dǎo)致死鎖
計(jì)數(shù)器
incr article:read:1001
//統(tǒng)計(jì)文章閱讀數(shù)量,其中artcle:read:1001
是key
分布式系統(tǒng)全局序列號
incrby orderid 100
//批量生成序列號就是基于orderid的value加100
5.2 Redis List列表
5.2.1 簡介
- Redis列表是簡單的字符串列表,單鍵多值,按照插入順序排序。 可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)
- 一個(gè)列表最多可以包含2^31-1個(gè)元素
- 底層是一個(gè)雙向鏈表,對兩端的操作新能很高,通過下標(biāo)的操作中間節(jié)點(diǎn)性能較弱
5.2.2 常用命令
lpush
< key> < value1>[< value2>…]:從左側(cè)插入一個(gè)或多個(gè)值lpushx
< key> < value1>[< value2>…]:將一個(gè)或多個(gè)值插入到已存在的列表頭部 (有一個(gè)判斷功能,存在的話才做,不存在就不做)lrange
< key>< start>< stop>:獲取列表指定范圍內(nèi)的元素,0左邊第1位,-1右邊第1 位,0 ~-1取出所有rpush
< key> < value1>[< value2>…]:從右側(cè)插入一個(gè)或多個(gè)值rpushx
< key> < value1>[< value2>…]:將一個(gè)或多個(gè)值插入到已存在的列表尾部lpop
< key>[count]:移除并獲取列表中左邊第1個(gè)元素,count表明獲取的總數(shù)量,返回的為移除的
元素rpop
< key>[count]:移除并獲取列表中右邊第1個(gè)元素,count表明獲取的總數(shù)量,返回的為移除的元素rpoplpush
< source>< destination>:移除源列表的尾部的元素(右邊第一個(gè)),將該元素添加到目標(biāo)列表的頭部(左邊第一個(gè)),并返回該元素lindex
< key>< index>:通過索引獲取列表中的元素llen
< key>:獲取列表長度linsert
< key> before|after < pivot>< element>:在< pivot>基準(zhǔn)元素前或者后面插入< element>,如果key不存在,返回0。如果< pivot>不存在,返回-1,如果操作成功,返回執(zhí)行后的列表長度- lrem < key>< count>< element>:根據(jù)count的值,移除列表中與參數(shù)相等的元素
- count=0 移除表中所有與參數(shù)相等的值
- count>0 從表頭開始向表尾搜索,移除與參數(shù)相等的元素,數(shù)量為count
- count<0 從表尾開始向表頭搜索,移除與參數(shù)相等的元素,數(shù)量為count的絕對值
- lset < key>< index> < element>:設(shè)置給定索引位置的值
- ltrim< key>< start> < stop>:對列表進(jìn)行修剪,只保留給定區(qū)間的元素,不在指定區(qū)間的被刪除
- brpop < key> timeout:阻塞式移除指定key的元素,如果key中沒有元素,就等待,直到有元素或超時(shí),執(zhí)行結(jié)束
5.2.3 應(yīng)用場景
數(shù)據(jù)隊(duì)列
- 堆棧stack=lpush+lpop
- 隊(duì)列queue=lpush+rpop
- 阻塞式消息隊(duì)列 blocking mq=lpush+brpop
訂閱號時(shí)間線
- lrange key start stop(隊(duì)列就是數(shù)據(jù),然后根據(jù)想要獲取的元素,輸入對應(yīng)元素下標(biāo)獲取數(shù)據(jù))
5.3 Redis Hash 哈希
5.3.1 簡介
是一個(gè)String類型的鍵和value(對象),特別適合于儲存對象,類似于Java中的Map<String, Object>
,有以下幾種處理方式
- 用key存儲學(xué)生id,用value存儲序列化之后用戶對象(如果用戶屬性數(shù)據(jù)需要修改,操作較復(fù)雜,開銷較大)
- 用key存儲學(xué)生id+屬性名,用value存儲屬性值(用戶id數(shù)據(jù)冗余)
- 用key存儲學(xué)生id,用value存儲field+value的hash。通過key(學(xué)生d)+field(屬性)可以操作對應(yīng)數(shù)據(jù)。
5.3.2 常用命令
hset
< key>< field>< value>[< field>< value>…]:用于為哈希表中的字段賦值,如果字段在hash表中存在,則會被覆蓋hmset
:用法同hset,在redis4.0.0中被棄用hsetnx
< key>< field>< value>:只有在字段不存在時(shí),才設(shè)置哈希表字段中的值(不支持多個(gè))hget
< key>< field> 返回哈希表中指定的字段的值hmget
< key>< field>[< field>…]:獲取哈希表中所有給定的字段值hgetall
< key>:獲取在哈希表中指定key的所有字段和值hexists
< key>< field>:判斷哈希表中指定的字段是否存在,存在返回1 ,否則返回0hkeys
< key>:獲取哈希表中所有的字段hvals
< key>:獲取哈希表中所有的值hlen
< key>:獲取哈希表中的field數(shù)量hdel
< key>< field>[< field>…]:刪除一個(gè)或多個(gè)哈希表字段- hincrby < key>< field>< increment>:為哈希表key中指定的field字段的整數(shù)值加上增加increment值
- hincrbyfloat < key>< field>< increment>:為哈希表key中指定的field字段的浮點(diǎn)數(shù)值加上增加increment值
5.3.3 應(yīng)用場景
- 對象緩存 hset stu:001 name zhangsan age 20 gender man
- 電商購物車操作
- 以用戶id作為key, 以商品id作為field,以商品數(shù)量作為value
- 添加商品:
- hset user:001 s:001 1
- hset user:001 s:002 2
- 增減商品數(shù)量:hincrby user:001 s:001 3
- 查看購物車商品總數(shù): hlen user:001
- 刪除商品 : hdel user:001 s:001
- 獲取所有商品: hgetall user:001
5.4 Redis Set集合
5.4.1 簡介
set是String類型元素?zé)o序集合,對外提供的功能和list類似
5.4.2 常用命令
sadd
< key>< member>[< member>…]:將一個(gè)或多個(gè)成員元素加入到集合中,如果集合中已經(jīng)包含成員元素,則被忽略smembers
< key>:返回集合中的所有成員。sismember
< key>< member>:判斷給定的成員元素是否是集合中的成員,如果是返回1,否則返回0scard
< key>:返回集合中元素個(gè)數(shù)srem
< key>< member>[< member>…]:移除集合中一個(gè)或多個(gè)元素spop
< key>[< count>]:移除并返回集合中的一個(gè)或count個(gè)隨機(jī)元素srandmember
< key>[< count>]:與spop相似,返回隨機(jī)元素,不做移除smove
< source> < destination> < member>:將member元素從source源移動到destination目標(biāo)sinter
< key>[< key>…]:返回給定集合的交集(共同包含)元素sinterstore
< destination> < key1>[< key2>…]:返回給定所有集合的交集,并存儲到destination目標(biāo)中sunion
< key>[< key>…]:返回給定集合的并集(所有)元素sunionstore
< destination> < key1>[< key2>…]:返回給定所有集合的并集,并存儲到destination目標(biāo)中sdiff
< key>[< key>…]:返回給定集合的差集(key1中不包含key2中的元素)sdiffstore
< destination> < key1>[< key2>…]:返回給定所有集合的差集,并存儲到destination目標(biāo)中
5.4.3 應(yīng)用場景
- 抽獎
- 參與抽獎:sadd cj001 user:13000000000 user:13455556666 user:13566667777 (將參與抽獎用戶放入set中)
- 查看所有參與用戶: smembers cj001 (查看set數(shù)組所有數(shù)據(jù))
- 實(shí)現(xiàn)抽獎: spop cj001 3(彈出任意三個(gè)數(shù)據(jù)) / srandmember cj001 3 (返回任意三個(gè)數(shù)據(jù))
- 朋友圈點(diǎn)贊 快手/抖音
- 點(diǎn)贊 (向set數(shù)組中添加元素)
- sadd like:friend001 user:001
- sadd like:friend001 user:002
- 取消點(diǎn)贊 srem like:friend001 user:001 (移除此元素)
- 判斷用戶是否已點(diǎn)贊 sismember like:friend001 user:001 (查看此元素是否存在set中)
- 顯示點(diǎn)贊用戶 smembers like:friend001 (查看set中的元素)
- 獲取點(diǎn)贊次數(shù) scard like:friend001 (獲取set長度)
- 點(diǎn)贊 (向set數(shù)組中添加元素)
- 關(guān)注模型: sinter交集 sunion并集 sdiff 差集
- 微博 sadd g:list:u001 1001 sadd g:list:u002 1001 你們共同關(guān)注的 sinter交集
- QQ 你們有共同好友 sinter交集
- 快手 可能認(rèn)識的人 sdiff差集
5.5 Redis ZSet有序集合
5.5.1 簡介
- 有序集合是String的有序結(jié)合,不允許重復(fù)出現(xiàn)成員
- 每個(gè)元素關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù),redis通過分?jǐn)?shù)為集合中的成員進(jìn)行從小到大的排序
- 有序集合成員是唯一的,但是分?jǐn)?shù)可以重復(fù)
- 成員因?yàn)橛行?#xff0c;可以根據(jù)分?jǐn)?shù)或者次序來快速獲取一個(gè)范圍內(nèi)的元素
5.5.2常用命令
zadd
< key> < score>< member>[< score>< member>…]:將一個(gè)或多個(gè)元素及其分?jǐn)?shù)加入到有序集合中zrange
< key>< min>< max> [byscore|bylex] [rev] [ limit offset count] [withscores]:返回有序集合指定區(qū)間的成員,- byscore按分?jǐn)?shù)區(qū)間,使用此方法通過分?jǐn)?shù)排序獲取所有的數(shù)據(jù)
zrange z1 -inf +inf byscore
- bylex按字典區(qū)間[其中如果想要全部查詢,min和max是-和+],
- rev 反向排序(分?jǐn)?shù)大的寫前邊,小的寫后邊),
- limit分頁(offset偏移量,count返回的總數(shù)),
- withscores返回時(shí)帶有對應(yīng)的分?jǐn)?shù))
- byscore按分?jǐn)?shù)區(qū)間,使用此方法通過分?jǐn)?shù)排序獲取所有的數(shù)據(jù)
zrevrange
< key>< start>< stop>[ limit offset count]:返回集合反轉(zhuǎn)后的成員zrangebyscore
< key>< min>< max> [withscores] [ limit offset count]:參考zrange用法zrevrangebyscore
< key>< max>< min> [withscores] [ limit offset count]:參考zrange用法zrangebylex
< key>< min>< max>] [ limit offset count]:通過字典區(qū)間返回有序集合的成員zrangebylex
k2 - +:減號最小值,加號最大值zrangebylex
k2 [aa (ac:[ 中括號表示包含給定值,( 小括號表示不包含給定值
zcard
< key>:獲取集合中的成員數(shù)量zincrby
< key> < increment>< member> :為集合中指定成員分?jǐn)?shù)加上增量incrementzrem
< key> < member>[< member>…]:移除集合的一個(gè)或多個(gè)成員zcount
< key>< min>< max>:統(tǒng)計(jì)集合中指定區(qū)間分?jǐn)?shù)(都包含)的成員數(shù)量zrank
< key>< member>:獲取集合中成員的索引位置zscore
< key>< member>:獲取集合中成員的分?jǐn)?shù)值
5.3.3 應(yīng)用場景
- 按時(shí)間先后順序排序:朋友圈點(diǎn)贊 zadd 1656667779666(以時(shí)間作為分?jǐn)?shù)) value
- 熱搜: 微博 今日頭條 快手 (主要使用分?jǐn)?shù)做處理,每點(diǎn)擊一次分?jǐn)?shù)就加一,然后獲取熱點(diǎn))
- 獲取topN zrevrange k1 300 10 limit 0 10