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的幾大特征
-
支持多數據庫,每個數據庫的數據是隔離的,不能共享,該特征基於單機才有,如果是集群就沒有數據庫的概念
-
redis是一個字典結構的存儲服務器,實際上是提供了多個用來存儲數據的字典。客戶端可以指定將數據存儲在哪個字典中。這與我們熟知的在一個關系數據庫實例中可以創建多個數據庫類似,所以可以將其中的每個字典都理解成一個獨立的數據庫。
-
每個數據庫對外都是一個從0開始的遞增數字命名,Redis默認支持16個數據庫(可以通過配置文件支持更多,無上限),可以通過配置databases來修改這一數字。客戶端與Redis建立連接后會自動選擇0號數據庫,不過可以隨時使用SELECT命令更換數據庫,如要選擇1號數據庫:
redis> SELECT 1 OK redis [1] > GET foo (nil)
-
然而這些以數字命名的數據庫又與我們理解的數據庫有所區別。首先Redis不支持自定義數據庫的名字,每個數據庫都以編號命名,開發者必須自己記錄哪些數據庫存儲了哪些數據。
-
另外Redis也不支持為每個數據庫設置不同的訪問密碼,所以一個客戶端要么可以訪問全部數據庫,要么連一個數據庫也沒有權限訪問。
-
最重要的一點是多個數據庫之間並不是完全隔離的,比如FLUSHALL命令可以清空一個Redis實例中所有數據庫中的數據。綜上所述,這些數據庫更像是一種命名空間,而不適宜存儲不同應用程序的數據。比如可以使用0號數據庫存儲某個應用生產環境中的數據,使用1號數據庫存儲測試環境中的數據,但不適宜使用0號數據庫存儲A應用的數據而使用1號數據庫B應用的數據,不同的應用應該使用不同的Redis實例存儲數據。由於Redis非常輕量級,一個空Redis實例占用的內在只有1M左右,所以不用擔心多個Redis實例會額外占用很多內存。