深入聊聊Redis中的5種基本數據類型

本篇文章帶大家詳細了解一下redis中的5種基本數據類型(string字符串、list列表、set集合、hash散列、zset有序集合),希望對大家有所幫助!

深入聊聊Redis中的5種基本數據類型

redis數據結構簡介

對redis來說,所有的key(鍵)都是字符串。我們在談基礎數據結構時,討論的是存儲值的數據類型,主要包括常見的5種數據類型,分別是:String、List、Set、Zset、Hash。【相關推薦:Redis視頻教程

深入聊聊Redis中的5種基本數據類型

結構類型 結構存儲的值 結構的讀寫能力
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視頻教程!!

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享