作為阿裡早期的開源產品,DataX是一款非常優秀的數據集成工具,普遍被用於多個數據源之間的批量同步,包括類似Apache DolphinScheduler的Task類型也對DataX進行了適配和增強,可以直接在DolphinScheduler裡面利用通用的數據源調用DataX進行數據批量同步。 作為 ...
Redis 有5種基礎數據結構,分別為string(字元串)、list(列表)、hash(字典)、set(集合)和zset(有序集合)。
1 String 結構
1.1 字元串常用操作
SET key value //存入字元串鍵值對 MSET key value [key value...] //批量存儲字元串鍵值對 SETNX key value //存入一個不存在的字元串鍵值對,如果已將存在,則set創建不成功,原來的值不變。 GET key //獲取一個字元串鍵值 MGET key [key...] //批量獲取字元串鍵值 DEL key [key...] //刪除一個健 EXPIRE key seconds //設置一個健的過期時間(秒)
1.2 原子操作
INCR key //將key所存儲的數字值加1--value值需要是整數,它的範圍在signed long 的最大值和最小值之間,超出範圍,會報錯。 DECR key //將key所存儲的數字值減1 INCRBY key increment //將key所存儲的值加上increment DECRby key decrement //將key所存儲的值減去decrement
2. String 應用場景
2.1 單值緩存
SET key value GET key
2.2 對象緩存
SET user:1 value(json格式數據)
2.3 分散式鎖
SETNX product:10001 true //返回1代表獲取鎖成功 SETNX product:10001 true //返回0代表獲取鎖失敗 ...執行業務操作 DEL product:10001 //執行完業務釋放鎖 SET product:10001 true ex 10 nx //防止程式意外終止導致死鎖
2.4 計數器
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
2.5 分散式系統全局序列號
INCRBY orderId 100 //redis批量生成序列號提升性能
3. Hash 結構
Redis的hash相當於Java裡面的HashMap,它是無序字典,內部存儲了很多鍵值對。
Hash 常用操作
HSET key field value // 存儲一個哈希表key的鍵值 HSETNX key field value // 存儲一個不存在的哈希表key的鍵值 HMSET key field value [field value...] //在一個哈希表key中存儲多個鍵值對 HGET key field //獲取哈希表key對應的field鍵值 HMGET key field [field...] //批量獲取哈希表key中多個field鍵值 HDEL key field [field...] //刪除哈希表key中的field鍵值 HLEN key //返回哈希表key中field的數量 HGETALL key //返回哈希表key中所有的鍵值 HINCRBY key field increment //為哈希表key中field健的值加上增量increment
當hash移除了最後一個元素之後,該數據結構被自動刪除,記憶體數據被回收。
4 Hash 應用場景
4.1 對象緩存
hash 結構可以用來存儲用戶信息,與字元串需要一次性全部序列化整個對象不同,hash可以對用戶結構中的每個欄位單獨存儲。這樣當我們需要獲取用戶信息時,可以進行部分獲取。
// 例如記錄員工的信息(userid、username、balance) HMSET user {userid}:name xiaoming {userid}:balance 30000 HMSET user 1:name xiaoming 1:balance 30000 HMGET user 1:name 1:balance
4.2 電商購物車
1)以用戶id為key;2)以商品id為field;3)以商品數量為value。
購物車操作(假設此時用戶的id為1001;商品id為10088)
1)添加商品--> hset cart:1001 10088 1
2)增加數量-->hincrby cart:1001
3) 商品總數-->hlen cart:1001
4)刪除商品-->hdel cart:1001 10088
5)獲取購物車所有商品-->hgetall cart:1001
5.List 結構
List常用操作
LPUSH key value [value...] //將一個或多個值value插入到key列表的表頭(最左邊) RPUSH key value [value...] //將一個或多個值value插入到key列表的表尾(最右邊) LPOP key //移除並返回key列表的頭元素 RPOP key //移除並返回key列表的尾元素 LRANGE key start stop //返回列表key中指定區間內的元素,區間以偏移量start和stop指定 BLPOP key [key...] timeout //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key...] timeout //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
List 是鏈表而不是數組。這意味著list的插入和刪除操作非常快,時間複雜度為O(1),但是索引定位很慢,時間複雜度為O(n)。
當列表彈出了最後一個元素之後,該數據結構被自動刪除,記憶體數據被回收。
6 List應用場景
列表結構常用來做非同步隊列使用。將需要延後處理的任務結構體序列化成字元串,塞進Redis列表,另一個線程從這個列表種輪詢數據進行處理。
6.1 常用分散式數據結構
隊列是 先進先出 的數據結構,常用於消息排隊和非同步邏輯處理,它會確保元素的訪問順序。
Queue(隊列) = LPUSH + RPOP
棧是 先進後出 的數據結構,跟隊列正好相反。
Stack(棧) = LPUSH + LPOP
Blocking MQ(阻塞隊列) = LPUSH + BRPOP
6.2 微博和微信公眾號消息流
假如小明關註了Caoz,瘋狂賽車等大V
1)Caoz發微博,消息ID為10018
LPUSH msg:{小明-id} 10018
2)瘋狂賽車發微博,消息ID為10086
LPUSH msg:{小明-id} 10086
3)顯示最新的5條微博消息
LRANGE msg:{小明-id} 0 4
7 Set 結構
set 相當於Java裡面的HashSet,它內部的鍵值對是無序的、唯一的。它的內部實現相當於一個特殊的字典,字典中所有的value都是一個值NULL。
當集合中最後一個元素被移除後,數據結構被自動刪除,記憶體被回收。
7.1 Set 常用操作
SADD key member [member...] //往集合key中存入元素,元素存在則忽略,若key不存在則新建 SREM key member [member...] //從集合key中刪除元素 SMEMBERS key //獲取集合key中所有元素 SCARD key //獲取集合key的元素個數 SISMEMBER key member //判斷member元素是否存在於集合key中 SRANDMEMBER key [count] //從集合key中隨機選出count個元素,元素不從key中刪除 SPOP key [count] //從集合key中隨機選出count個元素,元素從key中刪除
7.2 Set運算操作
SINTER key [key...] //交集運算 SINTERSTORE destination key [key...] //將交集結果存入新集合destination中 SUNION key [key...] //並集運算 SUNIONSTORE destination key [key...] //將並集結果存入新集合destination中 SDIFF key [key...] //差集運算 SDIFFSTORE destination key [key...] //將差集結果存入新集合destination中
8. Set 應用場景
8.1 微信抽獎小程式
1)點擊參加抽獎進入集合
SADD key {userID} ----註意:此時key應替換為抽獎活動的ID
2)查看參與抽獎所有用戶
SMEMBERS key
3)抽取count名中獎者
SRANDMEMBER key [count] /SPOP key [count]
8.2 微信微博點贊,收藏,標簽
1)點贊
SADD like:{消息ID} {用戶ID}
2)取消點贊
SREM like:{消息ID} {用戶ID}
3)檢查用戶是否點過贊
SISMEMBER like:{消息ID} {用戶ID}
4)獲取點贊的用戶列表
SMEMBERS like:{消息ID}
5)獲取點贊用戶數
SCARD like:{消息ID}
8.3 通過集合操作 實現微博微信關註模型
1)諸葛老師關註的人:
zhugeSet-->{zhuangzhou,xushu}
2)樓蘭老師關註的人:
loulanSet-->{zhuge,zhouyu,zhuangzhou,xushu}
3)莊周老師關註的人:
zhuangzhouSet-->{zhuge,loulan,zhouyu,xushu,xunyu}
4)諸葛老師和樓蘭老師共同關註:
SINTER zhugeSet loulanSet -->{zhuanzhou,xushu}
5)我【諸葛老師】關註的人也關註他(樓蘭老師):【解析:我關註的就兩個人嘛 ,即zhuangzhou和xushu,那就去這兩個人的集合中,去判斷元素是否存在集合中唄】
SISMEMBER zhuangzhouSet loulan
SISMEMBER xushuSet loulan
6)我可能認識的人:
SDIFF loulanSet zhugeSet-->{zhuge,zhouyu}
9 ZSet 有序集合結構
zset 類似於Java中的SortedSet 和 HashMap的結合體,一方面它是一個set,保證了內部value的唯一性,另一方面,它可以給每個value賦予一個score,代表這個value的排序權重。
9.1 ZSet 常用操作
ZADD key score member [[score member]...] //往有序集合key中加入帶分值元素 ZREM key member [member...] //從有序集合key中刪除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCBY key increment member //為有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素個數 ZRANGE key start stop [WITHSCORES] //正序獲取有序集合key從start下標到stop下標的元素 ZREVRANGE key start stop [WITHSCORES] //倒序獲取有序集合key從start下標到stop下標的元素
9.2 ZSet集合操作
ZUNIONSTORE destkey numkeys key [key] //並集計算 ZINTERSTORE destkey numkeys key [key] //交集計算
zset中最後一個value被移除後,數據結構被自動刪除,記憶體被回收。
10 ZSet 集合操作實現排行榜
1)點擊新聞
ZINCRBY hotNews:20200819 1 XX發佈會
2)展示當日排行前十
ZREVRANGE hotNews:20200819 0 9 WITHSCORES
3)七日搜索榜單計算
ZUNIONSTORE hotNews:20200813-20200819 7 hotNews:20200813 hotNews:20200814...hotNews:20200819
4)展示七日排行前十
ZREVRANGE hotNews:20200813-20200819 0 9 WITHSCORES
11 結構總結
如果想查看key的結構類型,執行下麵的命令
type keyname
如果想查看key的存儲類型,例如,我知道了key是zset類型,但是我想知道它的存儲類型,是壓縮列表(ziplist),還是跳躍列表(skiplist),
可以執行下麵的命令,進行查看
object encoding keyname
12 容器類型數據結構的通用規則
list、set、hash、zset 這四種數據結構都是容器類型數據結構,他們共用下麵兩條通用規則
1)create if not exists
如果容器不存在,就創建一個,再進行操作。
比如rpush操作剛開始是沒有列表的,Redis就會自動創建一個,然後再rpush進去新元素。
2)drop if not elements
如果容器里的元素沒有了,那麼立即刪除容器,釋放記憶體。這意味著lpop操作到最後一個元素,列表就消失了。
學習參閱聲明
1.--【從原理到實戰(2023最新版)】
https://www.bilibili.com/video/BV1Gs4y1Q7Ls?p=6&vd_source=0e347fbc6c2b049143afaa5a15abfc1c
2.《Redis深度歷險--核心原理與應用實踐》