Redis 簡(jiǎn)介
Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議抡草,是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中锅知,重啟的時(shí)候可以再次加載進(jìn)行使用。
Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù)脓钾,同時(shí)還提供list售睹,set,zset可训,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)昌妹。
Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份握截。
Redis 優(yōu)勢(shì)
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 飞崖。
豐富的數(shù)據(jù)類型– Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
原子 – Redis的所有操作都是原子性的谨胞,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行固歪。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性。
Redis與其他key-value存儲(chǔ)有什么不同胯努?
Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)他們的原子性操作牢裳,這是一個(gè)不同于其他數(shù)據(jù)庫(kù)的進(jìn)化路徑。
Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員透明叶沛,無(wú)需進(jìn)行額外的抽象蒲讯。
Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存恬汁,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存伶椿。 在內(nèi)存數(shù)據(jù)庫(kù)方面的另一個(gè)優(yōu)點(diǎn)是辜伟,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來(lái)非常簡(jiǎn)單脊另,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情导狡。 同時(shí),在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的偎痛,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問(wèn)旱捧。
Redis 安裝(Ubantu)
安裝命令
sudo apt-get update
sudo apt-get install redis-server
啟動(dòng) Redis
redis-server
查看是否啟動(dòng)Redis
redis-cli
以上命令將打開以下終端:
redis 127.0.0.1:6379>
127.0.0.1 是本機(jī) IP ,6379 是 redis 服務(wù)端口〔嚷螅現(xiàn)在我們輸入 PING 命令枚赡。
redis 127.0.0.1:6379> ping
PONG
Redis 配置
Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf谓谦。
你可以通過(guò) CONFIG 命令查看或設(shè)置配置項(xiàng)贫橙。
編輯配置
可以通過(guò)修改 redis.conf 文件或使用 CONFIG set 命令來(lái)修改配置。
語(yǔ)法
CONFIG SET 命令基本語(yǔ)法:
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
實(shí)例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
Redis 修改 訪問(wèn)密碼
通過(guò)命令修改
# 獲取密碼
config get requirepass
# 設(shè)置密碼
config set requirepass password
# 校驗(yàn)密碼
auth password
Redis 數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
獲取所有的key
keys "*"
清空當(dāng)前數(shù)據(jù)庫(kù)
flushdb
清空全部的數(shù)據(jù)
flushall
String(字符串)
string是redis最基本的類型反粥,你可以理解成與Memcached一模一樣的類型卢肃,一個(gè)key對(duì)應(yīng)一個(gè)value。
string類型是二進(jìn)制安全的才顿。意思是redis的string可以包含任何數(shù)據(jù)莫湘。比如jpg圖片或者序列化的對(duì)象 。
string類型是Redis最基本的數(shù)據(jù)類型郑气,一個(gè)鍵最大能存儲(chǔ)512MB幅垮。
實(shí)例
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
在以上實(shí)例中我們使用了 Redis 的SET 和 GET 命令。
鍵為name尾组,對(duì)應(yīng)的值為 runoob忙芒。
注意:一個(gè)鍵最大能存儲(chǔ)512MB。
Hash(哈希)
Redis hash 是一個(gè)鍵值對(duì)集合演怎。
Redis hash是一個(gè)string類型的field和value的映射表匕争,hash特別適合用于存儲(chǔ)對(duì)象。
實(shí)例
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"
以上實(shí)例中 hash 數(shù)據(jù)類型存儲(chǔ)了包含用戶腳本信息的用戶對(duì)象爷耀。
實(shí)例中我們使用了 Redis HMSET, HGETALL 命令甘桑,user:1 為鍵值。
每個(gè) hash 可以存儲(chǔ) 232 -1 鍵值對(duì)(40多億)
List(列表)
Redis 列表是簡(jiǎn)單的字符串列表歹叮,按照插入順序排序跑杭。
你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)。
實(shí)例
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
實(shí)例中我們使用了 Redis HMSET, HGETALL 命令咆耿,user:1 為鍵值德谅。
每個(gè) hash 可以存儲(chǔ) 232 -1 鍵值對(duì)(40多億)
Set(集合)
Redis的Set是string類型的無(wú)序集合。
集合是通過(guò)哈希表實(shí)現(xiàn)的萨螺,所以添加窄做,刪除愧驱,查找的復(fù)雜度都是O(1)。
sadd 命令
添加一個(gè)string元素到,key對(duì)應(yīng)的set集合中椭盏,成功返回1,如果元素已經(jīng)在集合中返回0,key對(duì)應(yīng)的set不存在返回錯(cuò)誤组砚。
sadd key member
實(shí)例
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
注意:以上實(shí)例中 rabitmq 添加了兩次,但根據(jù)集合內(nèi)元素的唯一性掏颊,第二次插入的元素將被忽略糟红。
集合中最大的成員數(shù)為 232 - 1(4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。
zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類型元素的集合乌叶,且不允許重復(fù)的成員盆偿。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。
redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序准浴。
zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)事扭。
zadd 命令
添加元素到集合,元素在集合中存在則更新對(duì)應(yīng)score
zadd key score member
實(shí)例
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> zadd runoob 1 test_1
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 test_0
(integer) 1
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
1) "redis"
2) "mongodb"
3) "rabitmq"
4) "test_0"
5) "test_1"
Redis 命令
Redis 命令用于在 redis 服務(wù)上執(zhí)行操作乐横。
要在 redis 服務(wù)上執(zhí)行命令需要一個(gè) redis 客戶端句旱。
Redis 客戶端在我們之前下載的的 redis 的安裝包中。
語(yǔ)法集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員晰奖。 不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序腥泥。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)匾南。
集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加蛔外,刪除蛆楞,查找的復(fù)雜度都是O(1)。 集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)夹厌。
Redis 客戶端的基本語(yǔ)法為:
$ redis-cli
實(shí)例
以下實(shí)例講解了如何啟動(dòng) redis 客戶端:
啟動(dòng) redis 客戶端豹爹,打開終端并輸入命令 redis-cli。該命令會(huì)連接本地的 redis 服務(wù)矛纹。
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
在以上實(shí)例中我們連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令臂聋,該命令用于檢測(cè) redis 服務(wù)是否啟動(dòng)。
在遠(yuǎn)程服務(wù)上執(zhí)行命令
如果需要在遠(yuǎn)程 redis 服務(wù)上執(zhí)行命令或南,同樣我們使用的也是 redis-cli 命令孩等。
語(yǔ)法
$ redis-cli -h host -p port -a password
實(shí)例
以下實(shí)例演示了如何連接到主機(jī)為 127.0.0.1,端口為 6379 采够,密碼為 mypass 的 redis 服務(wù)上肄方。
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
Redis 鍵(key)
Redis 鍵命令用于管理 redis 的鍵。
語(yǔ)法
Redis 鍵命令的基本語(yǔ)法如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME
實(shí)例
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1
在以上實(shí)例中 DEL 是一個(gè)命令蹬癌,** runoobkey** 是一個(gè)鍵权她。
如果鍵被刪除成功虹茶,命令執(zhí)行后輸出 (integer) 1,否則將輸出 (integer) 0
Redis keys 命令
下表給出了與 Redis 鍵相關(guān)的基本命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | DEL key | 該命令用于在 key 存在時(shí)刪除 key隅要。 |
2 | DUMP key | 序列化給定 key 蝴罪,并返回被序列化的值。 |
3 | EXISTS key | 檢查給定 key 是否存在拾徙。 |
4 | EXPIRE key | seconds 為給定 key 設(shè)置過(guò)期時(shí)間洲炊。 |
5 | EXPIREAT key timestamp | EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設(shè)置過(guò)期時(shí)間尼啡。 不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳(unix timestamp) 暂衡。 |
6 | PEXPIRE key milliseconds | 設(shè)置 key 的過(guò)期時(shí)間以毫秒計(jì)。 |
7 | PEXPIREAT key milliseconds-timestamp | 設(shè)置 key 過(guò)期時(shí)間的時(shí)間戳(unix timestamp)以毫秒計(jì) |
8 | KEYS pattern | 查找所有符合給定模式( pattern)的 key 崖瞭。 |
9 | MOVE key db | 將當(dāng)前數(shù)據(jù)庫(kù)的 key 移動(dòng)到給定的數(shù)據(jù)庫(kù) db 當(dāng)中狂巢。 |
10 | PERSIST key | 移除 key 的過(guò)期時(shí)間,key 將持久保持书聚。 |
11 | PTTL key | 以毫秒為單位返回 key 的剩余的過(guò)期時(shí)間唧领。 |
12 | TTL key | 以秒為單位,返回給定 key 的剩余生存時(shí)間(TTL, time to live) 雌续。 |
13 | RANDOMKEY | 從當(dāng)前數(shù)據(jù)庫(kù)中隨機(jī)返回一個(gè) key 斩个。 |
14 | RENAME key newkey | 修改 key 的名稱 |
15 | RENAMENX key newkey | 僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey 驯杜。 |
16 | TYPE key | 返回 key 所儲(chǔ)存的值的類型受啥。 |
更多命令請(qǐng)參考:http://redis.readthedocs.org/en/latest/index.html
Redis 字符串(String)
Redis 字符串?dāng)?shù)據(jù)類型的相關(guān)命令用于管理 redis 字符串值,基本語(yǔ)法如下:
語(yǔ)法
redis 127.0.0.1:6379> COMMAND KEY_NAME
實(shí)例
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> GET runoobkey
"redis"
在以上實(shí)例中我們使用了 SET 和 GET 命令鸽心,鍵為 runoobkey滚局。
Redis 字符串命令
下表列出了常用的 redis 字符串命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | SET key value | 設(shè)置指定 key 的值 |
2 | GET key | 獲取指定 key 的值。 |
3 | GETRANGE key start end | 返回 key 中字符串值的子字符 |
4 | GETSET key value | 將給定 key 的值設(shè)為 value 顽频,并返回 key 的舊值(old value)藤肢。 |
5 | GETBIT key offset | 對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量上的位(bit)糯景。 |
6 | MGET key1 [key2..] | 獲取所有(一個(gè)或多個(gè))給定 key 的值嘁圈。 |
7 | SETBIT key offset value | 對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)蟀淮。 |
8 | SETEX key seconds value | 將值 value 關(guān)聯(lián)到 key 丑孩,并將 key 的過(guò)期時(shí)間設(shè)為 seconds (以秒為單位)。 |
9 | SETNX key value | 只有在 key 不存在時(shí)設(shè)置 key 的值灭贷。 |
10 | SETRANGE key offset value | 用 value 參數(shù)覆寫給定 key 所儲(chǔ)存的字符串值温学,從偏移量 offset 開始。 |
11 | STRLEN key | 返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度甚疟。 |
12 | MSET key value [key value ...] | 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)仗岖。 |
13 | MSETNX key value [key value ...] | 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)逃延,當(dāng)且僅當(dāng)所有給定 key 都不存在。 |
14 | PSETEX key milliseconds value | 這個(gè)命令和 SETEX 命令相似轧拄,但它以毫秒為單位設(shè)置 key 的生存時(shí)間揽祥,而不是像 SETEX 命令那樣,以秒為單位檩电。 |
15 | INCR key | 將 key 中儲(chǔ)存的數(shù)字值增一拄丰。 |
16 | INCRBY key increment | 將 key 所儲(chǔ)存的值加上給定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment | 將 key 所儲(chǔ)存的值加上給定的浮點(diǎn)增量值(increment) 俐末。 |
18 | DECR key | 將 key 中儲(chǔ)存的數(shù)字值減一料按。 |
19 | DECRBY key decrement | key 所儲(chǔ)存的值減去給定的減量值(decrement) 。 |
20 | APPEND key value | 如果 key 已經(jīng)存在并且是一個(gè)字符串卓箫, APPEND 命令將 value 追加到 key 原來(lái)的值的末尾载矿。 |
更多命令請(qǐng)參考:http://redis.readthedocs.org/en/latest/index.html
Redis 哈希(Hash)
Redis hash 是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象烹卒。
Redis 中每個(gè) hash 可以存儲(chǔ) 232 - 1 鍵值對(duì)(40多億)闷盔。
實(shí)例
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
在以上實(shí)例中,我們?cè)O(shè)置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中旅急。
Redis hash 命令
下表列出了 redis hash 基本的相關(guān)命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | HDEL key field2 [field2] | 刪除一個(gè)或多個(gè)哈希表字段 |
2 | HEXISTS key field | 查看哈希表 key 中逢勾,指定的字段是否存在。 |
3 | HGET key field | 獲取存儲(chǔ)在哈希表中指定字段的值藐吮。 |
4 | HGETALL key | 獲取在哈希表中指定 key 的所有字段和值 |
5 | HINCRBY key field increment | 為哈希表 key 中的指定字段的整數(shù)值加上增量 increment 敏沉。 |
6 | HINCRBYFLOAT key field increment | 為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment 。 |
7 | HKEYS key | 獲取所有哈希表中的字段 |
8 | HLEN key | 獲取哈希表中字段的數(shù)量 |
9 | HMGET key field1 [field2] | 獲取所有給定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] | 同時(shí)將多個(gè) field-value (域-值)對(duì)設(shè)置到哈希表 key 中炎码。 |
11 | HSET key field value | 將哈希表 key 中的字段 field 的值設(shè)為 value 。 |
12 | HSETNX key field value | 只有在字段 field 不存在時(shí)秋泳,設(shè)置哈希表字段的值潦闲。 |
13 | HVALS key | 獲取哈希表中所有值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的鍵值對(duì)。 |
更多命令請(qǐng)參考:http://redis.readthedocs.org/en/latest/index.html
Redis 列表(List)
Redis列表是簡(jiǎn)單的字符串列表迫皱,按照插入順序排序歉闰。你可以添加一個(gè)元素導(dǎo)列表的頭部(左邊)或者尾部(右邊)
一個(gè)列表最多可以包含 232 - 1 個(gè)元素 (4294967295, 每個(gè)列表超過(guò)40億個(gè)元素)。
實(shí)例
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10
1) "mysql"
2) "mongodb"
3) "redis"
在以上實(shí)例中我們使用了** LPUSH** 將三個(gè)值插入了名為 runoobkey 的列表當(dāng)中卓起。
Redis 列表命令
下表列出了列表相關(guān)的基本命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | BLPOP key1 [key2 ] timeout | 移出并獲取列表的第一個(gè)元素和敬, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。 |
2 | BRPOP key1 [key2 ] timeout | 移出并獲取列表的最后一個(gè)元素戏阅, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止昼弟。 |
3 | BRPOPLPUSH source destination timeout | 從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它奕筐; 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止舱痘。 |
4 | LINDEX key index | 通過(guò)索引獲取列表中的元素 |
5 | LINSERT key BEFORE or AFTER pivot value | 在列表的元素前或者后插入元素 |
6 | LLEN key | 獲取列表長(zhǎng)度 |
7 | LPOP key | 移出并獲取列表的第一個(gè)元素 |
8 | LPUSH key value1 [value2] | 將一個(gè)或多個(gè)值插入到列表頭部 |
9 | LPUSHX key value | 將一個(gè)或多個(gè)值插入到已存在的列表頭部 |
10 | LRANGE key start stop | 獲取列表指定范圍內(nèi)的元素 |
11 | LREM key count value | 移除列表元素 |
12 | LSET key index value | 通過(guò)索引設(shè)置列表元素的值 |
13 | LTRIM key start stop | 對(duì)一個(gè)列表進(jìn)行修剪(trim)变骡,就是說(shuō),讓列表只保留指定區(qū)間內(nèi)的元素芭逝,不在指定區(qū)間之內(nèi)的元素都將被刪除塌碌。 |
14 | RPOP key | 移除并獲取列表最后一個(gè)元素 |
15 | RPOPLPUSH source destination | 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回 |
16 | RPUSH key value1 [value2] | 在列表中添加一個(gè)或多個(gè)值 |
17 | RPUSHX key value | 為已存在的列表添加值 |
Redis 集合(Set)
Redis的Set是string類型的無(wú)序集合旬盯。集合成員是唯一的台妆,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中 集合是通過(guò)哈希表實(shí)現(xiàn)的胖翰,所以添加接剩,刪除,查找的復(fù)雜度都是O(1)泡态。
集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)搂漠。
實(shí)例
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"
2) "mongodb"
3) "redis"
在以上實(shí)例中我們通過(guò) SADD 命令向名為 runoobkey 的集合插入的三個(gè)元素。
Redis 集合命令
序號(hào) | 命令 | 描述 |
---|---|---|
1 | SADD key member1 [member2] | 向集合添加一個(gè)或多個(gè)成員 |
2 | SCARD key | 獲取集合的成員數(shù) |
3 | SDIFF key1 [key2] | 返回給定所有集合的差集 |
4 | SDIFFSTORE destination key1 [key2] | 返回給定所有集合的差集并存儲(chǔ)在 destination 中 |
5 | SINTER key1 [key2] | 返回給定所有集合的交集 |
6 | SINTERSTORE destination key1 [key2] | 返回給定所有集合的交集并存儲(chǔ)在 destination 中 |
7 | SISMEMBER key member | 判斷 member 元素是否是集合 key 的成員 |
8 | SMEMBERS key | 返回集合中的所有成員 |
9 | SMOVE source destination member | 將 member 元素從 source 集合移動(dòng)到 destination 集合 |
10 | SPOP key | 移除并返回集合中的一個(gè)隨機(jī)元素 |
11 | SRANDMEMBER key [count] | 返回集合中一個(gè)或多個(gè)隨機(jī)數(shù) |
12 | SREM key member1 [member2] | 移除集合中一個(gè)或多個(gè)成員 |
13 | SUNION key1 [key2] | 返回所有給定集合的并集 |
14 | SUNIONSTORE destination key1 [key2] | 所有給定集合的并集存儲(chǔ)在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員某弦。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)桐汤。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)靶壮。
集合是通過(guò)哈希表實(shí)現(xiàn)的怔毛,所以添加,刪除腾降,查找的復(fù)雜度都是O(1)拣度。 集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。
實(shí)例
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
在以上實(shí)例中我們通過(guò)命令 ZADD 向 redis 的有序集合中添加了三個(gè)值并關(guān)聯(lián)上分?jǐn)?shù)螃壤。
Redis 有序集合命令
下表列出了 redis 有序集合的基本命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | ZADD key score1 member1 [score2 member2] | 向有序集合添加一個(gè)或多個(gè)成員抗果,或者更新已存在成員的分?jǐn)?shù) |
2 | ZCARD key | 獲取有序集合的成員數(shù) |
3 | ZCOUNT key min max | 計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù) |
4 | ZINCRBY key increment member | 有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment |
5 | ZINTERSTORE destination numkeys key [key ...] | 計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 key 中 |
6 | ZLEXCOUNT key min max | 在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量 |
7 | ZRANGE key start stop [WITHSCORES] | 通過(guò)索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員 |
8 | ZRANGEBYLEX key min max [LIMIT offset count] | 通過(guò)字典區(qū)間返回有序集合的成員 |
9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通過(guò)分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員 |
10 | ZRANK key member | 返回有序集合中指定成員的索引 |
11 | ZREM key member [member ...] | 移除有序集合中的一個(gè)或多個(gè)成員 |
12 | ZREMRANGEBYLEX key min max | 移除有序集合中給定的字典區(qū)間的所有成員 |
13 | ZREMRANGEBYRANK key start stop | 移除有序集合中給定的排名區(qū)間的所有成員 |
14 | ZREMRANGEBYSCORE key min max | 移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員 |
15 | ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定區(qū)間內(nèi)的成員,通過(guò)索引奸晴,分?jǐn)?shù)從高到底 |
16 | ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員冤馏,分?jǐn)?shù)從高到低排序 |
17 | ZREVRANK key member | 返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序 |
18 | ZSCORE key member | 返回有序集中寄啼,成員的分?jǐn)?shù)值 |
19 | ZUNIONSTORE destination numkeys key [key ...] | 計(jì)算給定的一個(gè)或多個(gè)有序集的并集逮光,并存儲(chǔ)在新的 key 中 |
20 | ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成員和元素分值) |
Redis HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 結(jié)構(gòu)。
Redis HyperLogLog 是用來(lái)做基數(shù)統(tǒng)計(jì)的算法墩划,HyperLogLog 的優(yōu)點(diǎn)是涕刚,在輸入元素的數(shù)量或者體積非常非常大時(shí),計(jì)算基數(shù)所需的空間總是固定 的乙帮、并且是很小的杜漠。
在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 2^64 個(gè)不同元素的基 數(shù)碑幅。這和計(jì)算基數(shù)時(shí)戴陡,元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對(duì)比。
但是沟涨,因?yàn)?HyperLogLog 只會(huì)根據(jù)輸入元素來(lái)計(jì)算基數(shù)恤批,而不會(huì)儲(chǔ)存輸入元素本身,所以 HyperLogLog 不能像集合那樣裹赴,返回輸入的各個(gè)元素喜庞。
什么是基數(shù)?
比如數(shù)據(jù)集 {1, 3, 5, 7, 5, 7, 8}, 那么這個(gè)數(shù)據(jù)集的基數(shù)集為 {1, 3, 5 ,7, 8}, 基數(shù)(不重復(fù)元素)為5棋返。 基數(shù)估計(jì)就是在誤差可接受的范圍內(nèi)延都,快速計(jì)算基數(shù)。
實(shí)例
以下實(shí)例演示了 HyperLogLog 的工作過(guò)程:
redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3
Redis HyperLogLog 命令
下表列出了 redis HyperLogLog 的基本命令:
序號(hào) | 命令 | 描述 |
---|---|---|
1 | PFADD key element [element ...] | 添加指定元素到 HyperLogLog 中睛竣。 |
2 | PFCOUNT key [key ...] | 返回給定 HyperLogLog 的基數(shù)估算值晰房。 |
3 | PFMERGE destkey sourcekey [sourcekey ...] | 將多個(gè) HyperLogLog 合并為一個(gè) HyperLogLog |