Redis常用命令
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等
https://gitee.com/nmwork/RedisUtil
1. Redis數據類型
1.1. List類型
1.1.1. 簡介
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)
è類似JAVA中的LinkedList
1.1.2. 命令
賦值語法:
LPUSH key value1 [value2] //將一個或多個值插入到列表頭部(從左側添加)
RPUSH key value1 [value2] //在列表中添加一個或多個值(從右側添加)
LPUSHX key value //將一個值插入到已存在的列表頭部。如果列表不在,操作無效
RPUSHX key value //一個值插入已存在的列表尾部(最右邊)。如果列表不在,操作無效。
取值語法:
LLEN key //獲取列表長度
LINDEX key index //通過索引獲取列表中的元素
LRANGE key start stop //獲取列表指定范圍內的元素
描述: 返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
start: 頁大小*(頁數-1)
stop : (頁大小*頁數)-1
刪除語法:
LPOP key 移出並獲取列表的第一個元素(從左側刪除)
RPOP key 移除列表的最后一個元素,返回值為移除的元素(從右側刪除)
BLPOP key1 [key2 ] timeout
移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
實例
redis 127.0.0.1:6379> BLPOP list1 100
在以上實例中,操作會被阻塞,如果指定的列表 key list1 存在數據則會返回第一個元素,否則在等待100秒后會返回 nil 。
BRPOP key1 [key2 ] timeout
移出並獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
修改語法:
LSET key index value 通過索引設置列表元素的值
LINSERT key BEFORE|AFTER world value 在列表的元素前或者后插入元素
描述:將值 value 插入到列表 key 當中,位於值 world 之前或之后。
高級語法:
RPOPLPUSH source destination
移除列表的最后一個元素,並將該元素添加到另一個列表並返回
示例描述:
RPOPLPUSH a1 a2 //a1的最后元素移到a2的左側
RPOPLPUSH a1 a1 //循環列表,將最后元素移到最左側
BRPOPLPUSH source destination timeout
從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
1.1.3. 應用場景
項目常應用於:1、對數據量大的集合數據刪減 2、任務隊列
1、 對數據量大的集合數據刪減
列表數據顯示、關注列表、粉絲列表、留言評價等…分頁、熱點新聞(Top5)等
利用LRANGE還可以很方便的實現分頁的功能,在博客系統中,每片博文的評論也可以存入一個單獨的list中。
2、 任務隊列
(list通常用來實現一個消息隊列,而且可以確保先后順序,不必像MySQL那樣還需要通過ORDER BY來進行排序)
任務隊列介紹(生產者和消費者模式):
在處理Web客戶端發送的命令請求時,某些操作的執行時間可能會比我們預期的更長一些,通過將待執行任務的相關信息放入隊列里面,並在之后對隊列進行處理,用戶可以推遲執行那些需要一段時間才能能完成的操作,這種將工作交給任務處理器來執行的做法被稱為任務隊列(task queue)。
RPOPLPUSH source destination
移除列表的最后一個元素,並將該元素添加到另一個列表並返回
示例描述:
常用案例:
1:訂單系統的下單流程、
2:用戶系統登錄注冊短信等
用戶登錄成功后,
三個資源:
列表頁面 (登錄后就允許訪問)
實名認證頁面(登錄后就允許訪問)
轉帳頁面 (登錄后、還要實名認證后)
代碼演示:
1.2. Set類型
1.2.1. 簡介
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重復的數據。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
類似於JAVA中的 Hashtable集合
redis的集合對象set的底層存儲結構特別神奇,底層使用了intset和hashtable兩種數據結構存儲的,intset我們可以理解為數組,hashtable就是普通的哈希表(key為set的值,value為null)。
intset內部其實是一個數組(int8_t coentents[]數組),而且存儲數據的時候是有序的,因為在查找數據的時候是通過二分查找來實現的。
1.2.2. 命令
賦值語法:
SADD key member1 [member2] 向集合添加一個或多個成員
取值語法:
SCARD key 獲取集合的成員數
SISMEMBER key member 判斷 member 元素是否是集合 key 的成員(開發中:驗證是否存在判斷)
SRANDMEMBER key [count] 返回集合中一個或多個隨機數
刪除語法:
SREM key member1 [member2] 移除集合中一個或多個成員
SPOP key [count] 移除並返回集合中的一個隨機元素
SMOVE source destination member
將 member 元素從 source 集合移動到 destination 集合
差集語法:
SDIFF key1 [key2] 返回給定所有集合的差集(左側)
SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中
交集語法:
SINTER key1 [key2] 返回給定所有集合的交集(共有數據)
SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中
並集語法:
SUNION key1 [key2] 返回所有給定集合的並集
SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中
1.2.3. 應用場景
常應用於:對兩個集合間的數據[計算]進行交集、並集、差集運算
1、以非常方便的實現如共同關注、共同喜好、二度好友等功能。對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存儲到一個新的集合中。
2、利用唯一性,可以統計訪問網站的所有獨立 IP
1.3. 有序集合(sorted set) ZSET
1.3.1. 簡介
1、 Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
2、不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
3、有序集合的成員是唯一的,但分數(score)卻可以重復。
4、集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
Redis的ZSet是有序、且不重復
(很多時候,我們都將redis中的有序集合叫做zsets,這是因為在redis中,有序集合相關的操作指令都是以z開頭的)
1.3.2. 命令
賦值語法:
ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
取值語法:
ZCARD key 獲取有序集合的成員數
ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
ZRANK key member 返回有序集合中指定成員的索引
ZRANGE key start stop [WITHSCORES]
通過索引區間返回有序集合成指定區間內的成員(低到高)
ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到底
刪除語法:
del key 移除集合
ZREM key member [member ...] 移除有序集合中的一個或多個成員
ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員(第一名是0)(低到高排序)
ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
1.3.3. 應用場景
常應用於:排行榜
1比如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。
2比如一個存儲全班同學成績的Sorted Set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
3還可以用Sorted Set來做帶權重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。