redis之五大數據類型介紹


redis五大數據類型

1. string(字符串)

特點:

  • 一個鍵能儲存512MB
  • string類型是二進制安全的,可以存儲任何數據,比如jpg圖片或序列化對象

格式:

存--set key value [EX seconds] [PX milliseconds] [NX|XX]

EX seconds:將鍵的過期時間設置為 seconds 秒。 執行 SET key value EX seconds 的效果等同於執行 SETEX key seconds value

PX milliseconds:將鍵的過期時間設置為 milliseconds 毫秒。 執行 SET key value PX milliseconds 的效果等同於執行 PSETEX key milliseconds value

NX : 只在鍵不存在時, 才對鍵進行設置操作。 執行 SET key value NX 的效果等同於執行 SETNX key value

**XX **: 只在鍵已經存在時, 才對鍵進行設置操作。

取--get key

基本操作:

127.0.0.1:6379> set name panlifu
OK
127.0.0.1:6379> get name
"panlifu"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

2. hash(哈希)

特點:

  • 是一個鍵(key -->value)對集合。
  • 每個 hash 可以存儲 232 -1 鍵值對(40多億)。
  • 是一個string類型的field和value的映射表,hash特別適合用於儲存對象

格式:

存--HMGET key field [field ...]
取--HMGET key field [field ...]

基本操作

# 存 myhash 類似一個hash值,field1類似一個鍵,hello就是對應值,field2類似第2個鍵,world就是對應的值
127.0.0.1:6379> HMSET myhash field1 "hello" field2 "world"
OK
# 取  必須有hash值  加  鍵才能取到值
127.0.0.1:6379> HMGET myhash field1
1) "hello"
127.0.0.1:6379> HMGET myhash field2
1) "world"
# 刪除
127.0.0.1:6379> del myhash
(integer) 1
127.0.0.1:6379> HMGET myhash field2
1) (nil)
127.0.0.1:6379> HMGET myhash field1
1) (nil)

3. list(列表)

特點

  • 按照插入順序排序

格式

存---LPUSH key value [value ...]
取--LRANGE key start stop

基本操作

127.0.0.1:6379> lpush runoob redis
(integer) 1
127.0.0.1:6379> lpush runoob mongodb
(integer) 2
127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
127.0.0.1:6379> LRANGE runoob 1 3
1) "mongodb"
2) "redis"
127.0.0.1:6379> LRANGE runoob 0 3
1) "rabitmq"
2) "mongodb"
3) "redis"
127.0.0.1:6379> LRANGE runoob 0 4
1) "rabitmq"
2) "mongodb"
3) "redis"

4. set(集合)

特點

  • 無序
  • 集合是通過哈希實現的,所以添加,刪除,查找的復雜度都是O(1)

格式

存--sadd key member [member ...]
取--SMEMBERS key

基本操作

127.0.0.1:6379> sadd runoob redis
(integer) 1
127.0.0.1:6379> SADD runoob mongodb
(integer) 1
127.0.0.1:6379> SADD runoob rabitmq
(integer) 1
127.0.0.1:6379> SADD runoob rabitmq
(integer) 0
127.0.0.1:6379> SMEMBERS runoob
1) "mongodb"
2) "redis"
3) "rabitmq"

注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。

集合中最大的成員數為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。

5. zset(sorted set:有序集合)

特點

  • 和set一樣也是string類型元素的集合,且不允許重復的成員
  • 每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合的成員進行從小到大的排序
  • zset的成員是唯一的,但分數卻可以重復

格式

存--ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
  • XX: 僅僅更新存在的成員,不添加新成員。
  • NX: 不更新存在的成員。只添加新成員。
  • CH: 修改返回值為發生變化的成員總數,原始是返回新添加成員的總數 (CH 是 changed 的意思)。更改的元素是新添加的成員,已經存在的成員更新分數。 所以在命令中指定的成員有相同的分數將不被計算在內。注:在通常情況下,ZADD返回值只計算新添加成員的數量。
  • INCR: 當ZADD指定這個選項時,成員的操作就等同ZINCRBY命令,對成員的分數進行遞增操作。
取--ZRANGE key start stop [WITHSCORES]

基本操作

127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

各個數據類型應用場景

類型 簡介 特性 場景
String(字符串) 二進制安全 可以包含任何數據,比如jpg圖片或者序列化的對象,一個鍵最大能存儲512M ---
Hash(字典) 鍵值對集合,即編程語言中的Map類型 適合存儲對象,並且可以像數據庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字符串反序列化成對象修改完再序列化存回去) 存儲、讀取、修改用戶屬性
List(列表) 鏈表(雙向鏈表) 增刪快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的時間線) 2,消息隊列
Set(集合) 哈希表實現,元素不重復 1、添加、刪除,查找的復雜度都是O(1) 2、為集合提供了求交集、並集、差集等操作 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大於某個閾值就可以推薦
Sorted Set(有序集合) 將Set中的元素增加一個權重參數score,元素按score有序排列 數據插入集合時,已經進行天然排序 1、排行榜 2、帶權重的消息隊列

redis的幾大特征

  1. 支持多數據庫,每個數據庫的數據是隔離的,不能共享,該特征基於單機才有,如果是集群就沒有數據庫的概念

  2. redis是一個字典結構的存儲服務器,實際上是提供了多個用來存儲數據的字典。客戶端可以指定將數據存儲在哪個字典中。這與我們熟知的在一個關系數據庫實例中可以創建多個數據庫類似,所以可以將其中的每個字典都理解成一個獨立的數據庫。

  3. 每個數據庫對外都是一個從0開始的遞增數字命名,Redis默認支持16個數據庫(可以通過配置文件支持更多,無上限),可以通過配置databases來修改這一數字。客戶端與Redis建立連接后會自動選擇0號數據庫,不過可以隨時使用SELECT命令更換數據庫,如要選擇1號數據庫:

    redis> SELECT 1
    OK
    redis [1] > GET foo
    (nil)
    
  4. 然而這些以數字命名的數據庫又與我們理解的數據庫有所區別。首先Redis不支持自定義數據庫的名字,每個數據庫都以編號命名,開發者必須自己記錄哪些數據庫存儲了哪些數據。

  5. 另外Redis也不支持為每個數據庫設置不同的訪問密碼,所以一個客戶端要么可以訪問全部數據庫,要么連一個數據庫也沒有權限訪問。

  6. 最重要的一點是多個數據庫之間並不是完全隔離的,比如FLUSHALL命令可以清空一個Redis實例中所有數據庫中的數據。綜上所述,這些數據庫更像是一種命名空間,而不適宜存儲不同應用程序的數據。比如可以使用0號數據庫存儲某個應用生產環境中的數據,使用1號數據庫存儲測試環境中的數據,但不適宜使用0號數據庫存儲A應用的數據而使用1號數據庫B應用的數據,不同的應用應該使用不同的Redis實例存儲數據。由於Redis非常輕量級,一個空Redis實例占用的內在只有1M左右,所以不用擔心多個Redis實例會額外占用很多內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM