本篇文章帶大家詳細了解一下redis中的5種基本數據類型(string字符串、list列表、set集合、hash散列、zset有序集合),希望對大家有所幫助!
redis數據結構簡介
對redis來說,所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash。【相關推薦:Redis視頻教程】
結構類型 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|
String字符串 | 可以是字符串、整數或浮點數 | 對整個字符串或字符串的一部分進行操作;對整數或浮點數進行自增或自減操作; |
List列表 | 一個鏈表,鏈表上的每個節點都包含一個字符串 | 對鏈表的兩端進行push和pop操作,讀取單個或多個元素;根據值查找或刪除元素; |
Set集合 | 包含字符串的無序集合 | 字符串的集合,包含基礎的方法有看是否存在添加、獲取、刪除;還包含計算交集、并集、差集等 |
Hash散列 | 包含鍵值對的無序散列表 | 包含方法有添加、獲取、刪除單個元素 |
Zset有序集合 | 和散列一樣,用于存儲鍵值對 | 字符串成員與浮點數分數之間的有序映射;元素的排列順序由分數的大小決定;包含方法有添加、獲取、刪除單個元素以及根據分值范圍或成員來獲取元素 |
基礎數據結構詳解
String字符串
String是redis中最基本的數據類型,一個key對應一個value。
String類型是二進制安全的,意思是 redis 的 string 可以包含任何數據。如數字,字符串,jpg圖片或者序列化的對象。
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
GET | 獲取存儲在給定鍵中的值 | GET name |
SET | 設置存儲在給定鍵中的值 | SET name value |
DEL | 刪除存儲在給定鍵中的值 | DEL name |
INCR | 將鍵存儲的值加1 | INCR key |
DECR | 將鍵存儲的值減1 | DECR key |
INCRBY | 將鍵存儲的值加上整數 | INCRBY key amount |
DECRBY | 將鍵存儲的值減去整數 | DECRBY key amount |
- 命令執行
127.0.0.1:6379>?set?hello?world OK 127.0.0.1:6379>?get?hello "world" 127.0.0.1:6379>?del?hello (integer)?1 127.0.0.1:6379>?get?hello (nil) 127.0.0.1:6379>?get?counter "2" 127.0.0.1:6379>?incr?counter (integer)?3 127.0.0.1:6379>?get?counter "3" 127.0.0.1:6379>?incrby?counter?100 (integer)?103 127.0.0.1:6379>?get?counter "103" 127.0.0.1:6379>?decr?counter (integer)?102 127.0.0.1:6379>?get?counter "102"
- 實戰場景
- 緩存: 經典使用場景,把常用信息,字符串,圖片或者視頻等信息放到redis中,redis作為緩存層,mysql做持久化層,降低mysql的讀寫壓力。
- 計數器:redis是單線程模型,一個命令執行完才會執行下一個,同時數據可以一步落地到其他的數據源。
- session:常見方案spring session + redis實現session共享,
List列表
Redis中的List其實就是鏈表(Redis用雙端鏈表實現List)。
使用List結構,我們可以輕松地實現最新消息排隊功能(比如新浪微博的TimeLine)。List的另一個應用就是消息隊列,可以利用List的 PUSH 操作,將任務存放在List中,然后工作線程再用 POP 操作將任務取出進行執行。
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
RPUSH | 將給定值推入到列表右端 | RPUSH key value |
LPUSH | 將給定值推入到列表左端 | LPUSH key value |
RPOP | 從列表的右端彈出一個值,并返回被彈出的值 | RPOP key |
LPOP | 從列表的左端彈出一個值,并返回被彈出的值 | LPOP key |
LRANGE | 獲取列表在給定范圍上的所有值 | LRANGE key 0 -1 |
LINDEX | 通過索引獲取列表中的元素。你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。 | LINEX key index |
- 使用列表的技巧
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊列)
- 命令執行
127.0.0.1:6379>?lpush?mylist?1?2?ll?ls?mem (integer)?5 127.0.0.1:6379>?lrange?mylist?0?-1 1)?"mem" 2)?"ls" 3)?"ll" 4)?"2" 5)?"1" 127.0.0.1:6379>?lindex?mylist?-1 "1" 127.0.0.1:6379>?lindex?mylist?10????????#?index不在?mylist?的區間范圍內 (nil)
- 實戰場景
- 微博TimeLine: 有人發布微博,用lpush加入時間軸,展示新的列表信息。
- 消息隊列
Set集合
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
SADD | 向集合添加一個或多個成員 | SADD key value |
SCARD | 獲取集合的成員數 | SCARD key |
SMEMBER | 返回集合中的所有成員 | SMEMBER key member |
SISMEMBER | 判斷 member 元素是否是集合 key 的成員 | SISMEMBER key member |
其它一些集合操作,請參考這里
https://www.runoob.com/redis/redis-sets.html
- 命令執行
127.0.0.1:6379>?sadd?myset?ycf?ycf1?xiao?ycf (integer)?3 127.0.0.1:6379>?smember?myset 1)?"xiao" 2)?"ycf1" 3)?"ycf" 127.0.0.1:6379>?sismember?myset?ycf (integer)?1
- 實戰場景
- 標簽(tag),給用戶添加標簽,或者用戶給消息添加標簽,這樣有同一標簽或者類似標簽的可以給推薦關注的事或者關注的人。
- 點贊,或點踩,收藏等,可以放到set中實現
Hash散列
Redis hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲對象。
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
HSET | 添加鍵值對 | HSET hash-key sub-key1 value1 |
HGET | 獲取指定散列鍵的值 | HGET hash-key key1 |
HGETALL | 獲取散列中包含的所有鍵值對 | HGETALL hash-key |
HDEL | 如果給定鍵存在于散列中,那么就移除這個鍵 | HDEL hash-key sub-key1 |
- 命令執行
127.0.0.1:6379>?hset?user?name1?ycf (integer)?1 127.0.0.1:6379>?hset?user?email1?ycf@163.com (integer)?1 127.0.0.1:6379>?hgetall?user 1)?"name1" 2)?"ycf" 3)?"email1" 4)?"ycf@163.com" 127.0.0.1:6379>?hget?user?user (nil) 127.0.0.1:6379>?hget?user?name1 "ycf" 127.0.0.1:6379>?hset?user?name2?xiaoycf (integer)?1 127.0.0.1:6379>?hset?user?email2?xiaoycf@163.com (integer)?1 127.0.0.1:6379>?hgetall?user 1)?"name1" 2)?"ycf" 3)?"email1" 4)?"ycf@163.com" 5)?"name2" 6)?"xiaoycf" 7)?"email2" 8)?"xiaoycf@163.com"
- 實戰場景
- 緩存: 能直觀,相比string更節省空間,的維護緩存信息,如用戶信息,視頻信息等。
Zset有序集合
Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復的成員。不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
- 命令使用
命令 | 簡述 | 使用 |
---|---|---|
ZADD | 將一個帶有給定分值的成員添加到哦有序集合里面 | ZADD zset-key 178 member1 |
ZRANGE | 根據元素在有序集合中所處的位置,從有序集合中獲取多個元素 | ZRANGE zset-key 0-1 withccores |
ZREM | 如果給定元素成員存在于有序集合中,那么就移除這個元素 | ZREM zset-key member1 |
更多命令請參考這里?
https://www.runoob.com/redis/redis-sorted-sets.html
- 命令執行
127.0.0.1:6379>?zadd?myscoreset?100?ycf?90?xiaoycf (integer)?2 127.0.0.1:6379>?ZRANGE?myscoreset?0?-1 1)?"xiaoycf" 2)?"ycf" 127.0.0.1:6379>?ZSCORE?myscoreset?ycf "100"
- 實戰場景
- 排行榜:有序集合經典使用場景。例如小說視頻等網站需要對用戶上傳的小說視頻做排行榜,榜單可以按照用戶關注數,更新時間,字數等打分,做排行。
更多編程相關知識,請訪問:Redis視頻教程!!