文章目錄 Docker安裝redis redis-benchmark 性能測試 基礎(chǔ)知識 五大數(shù)據(jù)類型 Redis-key String(字符串) List(列表) Set(集合) Hash(哈希) Zset(有序集合)
Docker安裝redis
拉取redis鏡像
docker pull redis:latest
運行redis
docker run -itd --name redis -p 6379:6379 redis
通過 redis-cli 連接測試使用 redis 服務(wù)
docker exec -it redis /bin/bash
CAIKE3>docker exec -it redis /bin/bash
root@9764b0a9bb1c:/data# redis-cli
127.0.0.1:6379> PING
PONG
redis-benchmark 性能測試
root@9764b0a9bb1c:/data# redis-benchmark
# 測試:100個并發(fā)連接 100000請求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
結(jié)果如下:
root@9764b0a9bb1c:/data# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
====== PING_INLINE ======100000 requests completed in 1.01 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no0.00% <= 0.1 milliseconds
0.00% <= 0.2 milliseconds
0.14% <= 0.3 milliseconds
1.47% <= 0.4 milliseconds
49.53% <= 0.5 milliseconds
86.89% <= 0.6 milliseconds
94.19% <= 0.7 milliseconds
96.63% <= 0.8 milliseconds
98.08% <= 0.9 milliseconds
98.93% <= 1.0 milliseconds
99.34% <= 1.1 milliseconds
99.64% <= 1.2 milliseconds
99.77% <= 1.3 milliseconds
99.82% <= 1.4 milliseconds
99.83% <= 1.5 milliseconds
99.85% <= 1.6 milliseconds
99.85% <= 1.7 milliseconds
99.86% <= 1.8 milliseconds
99.87% <= 1.9 milliseconds
99.88% <= 2 milliseconds
99.90% <= 3 milliseconds
99.92% <= 4 milliseconds
99.99% <= 5 milliseconds
100.00% <= 5 milliseconds
98522.17 requests per second====== PING_BULK ======100000 requests completed in 1.03 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no99.34% <= 1 milliseconds
99.97% <= 2 milliseconds
100.00% <= 2 milliseconds
96711.80 requests per second====== SET ======100000 requests completed in 1.02 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no98.72% <= 1 milliseconds
99.90% <= 2 milliseconds
100.00% <= 2 milliseconds
98425.20 requests per second====== GET ======100000 requests completed in 1.15 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no93.00% <= 1 milliseconds
98.74% <= 2 milliseconds
99.79% <= 3 milliseconds
99.94% <= 4 milliseconds
100.00% <= 5 milliseconds
100.00% <= 5 milliseconds
86805.56 requests per second====== INCR ======100000 requests completed in 1.41 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no84.55% <= 1 milliseconds
93.73% <= 2 milliseconds
96.63% <= 3 milliseconds
97.85% <= 4 milliseconds
98.33% <= 5 milliseconds
98.82% <= 6 milliseconds
99.18% <= 7 milliseconds
99.43% <= 8 milliseconds
99.61% <= 9 milliseconds
99.69% <= 10 milliseconds
99.75% <= 11 milliseconds
99.82% <= 13 milliseconds
99.87% <= 14 milliseconds
99.93% <= 15 milliseconds
99.98% <= 16 milliseconds
100.00% <= 17 milliseconds
70972.32 requests per second====== LPUSH ======100000 requests completed in 0.98 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no99.07% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 2 milliseconds
102249.49 requests per second====== RPUSH ======100000 requests completed in 0.98 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no99.44% <= 1 milliseconds
99.99% <= 2 milliseconds
100.00% <= 2 milliseconds
102459.02 requests per second====== LPOP ======100000 requests completed in 1.07 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no96.74% <= 1 milliseconds
99.79% <= 2 milliseconds
99.90% <= 3 milliseconds
99.90% <= 4 milliseconds
99.90% <= 5 milliseconds
99.91% <= 6 milliseconds
99.94% <= 7 milliseconds
100.00% <= 7 milliseconds
93370.68 requests per second====== RPOP ======100000 requests completed in 1.04 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no97.61% <= 1 milliseconds
99.64% <= 2 milliseconds
99.87% <= 3 milliseconds
99.97% <= 4 milliseconds
100.00% <= 4 milliseconds
95969.28 requests per second====== SADD ======100000 requests completed in 1.01 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no98.97% <= 1 milliseconds
99.91% <= 2 milliseconds
99.96% <= 3 milliseconds
99.97% <= 4 milliseconds
99.99% <= 5 milliseconds
100.00% <= 6 milliseconds
100.00% <= 6 milliseconds
99403.58 requests per second====== HSET ======100000 requests completed in 1.08 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no92.35% <= 1 milliseconds
98.18% <= 2 milliseconds
99.59% <= 3 milliseconds
99.88% <= 4 milliseconds
99.91% <= 5 milliseconds
99.92% <= 8 milliseconds
99.99% <= 9 milliseconds
100.00% <= 9 milliseconds
92592.59 requests per second====== SPOP ======100000 requests completed in 1.06 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no98.43% <= 1 milliseconds
99.88% <= 2 milliseconds
100.00% <= 2 milliseconds
94428.70 requests per second====== ZADD ======100000 requests completed in 1.14 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no92.07% <= 1 milliseconds
98.76% <= 2 milliseconds
99.72% <= 3 milliseconds
99.90% <= 4 milliseconds
99.97% <= 5 milliseconds
99.98% <= 6 milliseconds
99.99% <= 7 milliseconds
100.00% <= 8 milliseconds
87565.68 requests per second====== ZPOPMIN ======100000 requests completed in 1.02 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no99.24% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 2 milliseconds
97943.19 requests per second====== LPUSH (needed to benchmark LRANGE) ======100000 requests completed in 1.01 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no98.45% <= 1 milliseconds
99.80% <= 2 milliseconds
99.97% <= 3 milliseconds
99.98% <= 4 milliseconds
100.00% <= 5 milliseconds
100.00% <= 5 milliseconds
99009.90 requests per second====== LRANGE_100 (first 100 elements) ======100000 requests completed in 2.19 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no38.81% <= 1 milliseconds
96.56% <= 2 milliseconds
98.46% <= 3 milliseconds
99.21% <= 4 milliseconds
99.50% <= 5 milliseconds
99.61% <= 6 milliseconds
99.62% <= 7 milliseconds
99.67% <= 8 milliseconds
99.78% <= 9 milliseconds
99.88% <= 10 milliseconds
99.91% <= 11 milliseconds
100.00% <= 12 milliseconds
45745.65 requests per second====== LRANGE_300 (first 300 elements) ======100000 requests completed in 4.91 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no0.07% <= 1 milliseconds
13.22% <= 2 milliseconds
91.21% <= 3 milliseconds
96.73% <= 4 milliseconds
97.76% <= 5 milliseconds
98.36% <= 6 milliseconds
98.82% <= 7 milliseconds
99.23% <= 8 milliseconds
99.52% <= 9 milliseconds
99.67% <= 10 milliseconds
99.73% <= 11 milliseconds
99.78% <= 12 milliseconds
99.81% <= 13 milliseconds
99.86% <= 14 milliseconds
99.91% <= 15 milliseconds
99.94% <= 16 milliseconds
99.96% <= 17 milliseconds
99.97% <= 18 milliseconds
99.99% <= 19 milliseconds
100.00% <= 19 milliseconds
20354.16 requests per second====== LRANGE_500 (first 450 elements) ======100000 requests completed in 6.28 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no0.03% <= 1 milliseconds
0.74% <= 2 milliseconds
39.01% <= 3 milliseconds
93.95% <= 4 milliseconds
98.13% <= 5 milliseconds
99.05% <= 6 milliseconds
99.37% <= 7 milliseconds
99.52% <= 8 milliseconds
99.63% <= 9 milliseconds
99.74% <= 10 milliseconds
99.83% <= 11 milliseconds
99.86% <= 12 milliseconds
99.89% <= 13 milliseconds
99.91% <= 14 milliseconds
99.92% <= 15 milliseconds
99.92% <= 16 milliseconds
99.93% <= 17 milliseconds
99.95% <= 18 milliseconds
99.96% <= 19 milliseconds
99.98% <= 20 milliseconds
99.99% <= 21 milliseconds
100.00% <= 21 milliseconds
15936.25 requests per second====== LRANGE_600 (first 600 elements) ======100000 requests completed in 7.71 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no0.02% <= 1 milliseconds
0.22% <= 2 milliseconds
4.87% <= 3 milliseconds
63.60% <= 4 milliseconds
95.25% <= 5 milliseconds
98.17% <= 6 milliseconds
98.78% <= 7 milliseconds
99.11% <= 8 milliseconds
99.34% <= 9 milliseconds
99.46% <= 10 milliseconds
99.57% <= 11 milliseconds
99.66% <= 12 milliseconds
99.74% <= 13 milliseconds
99.81% <= 14 milliseconds
99.87% <= 15 milliseconds
99.91% <= 16 milliseconds
99.95% <= 17 milliseconds
99.96% <= 18 milliseconds
99.97% <= 19 milliseconds
99.98% <= 20 milliseconds
99.99% <= 21 milliseconds
100.00% <= 22 milliseconds
100.00% <= 22 milliseconds
12973.53 requests per second====== MSET (10 keys) ======100000 requests completed in 1.18 seconds100 parallel clients3 bytes payloadkeep alive: 1host configuration "save": 3600 1 300 100 60 10000host configuration "appendonly": nomulti-thread: no88.55% <= 1 milliseconds
97.72% <= 2 milliseconds
99.04% <= 3 milliseconds
99.34% <= 4 milliseconds
99.55% <= 5 milliseconds
99.64% <= 7 milliseconds
99.64% <= 9 milliseconds
99.69% <= 10 milliseconds
99.87% <= 11 milliseconds
99.90% <= 18 milliseconds
100.00% <= 19 milliseconds
100.00% <= 19 milliseconds
84674.01 requests per second
redis 性能測試工具可選參數(shù)如下所示:
基礎(chǔ)知識
redis默認有16個數(shù)據(jù)庫
127.0.0.1:6379> config get databases # 命令行查看數(shù)據(jù)庫數(shù)量databases
1) "databases"
2) "16"
16個數(shù)據(jù)庫為:DB 0~DB 15
默認使用DB 0 ,可以使用select n切換到DB n,dbsize可以查看當前數(shù)據(jù)庫的大小,與key數(shù)量相關(guān)。
127.0.0.1:6379> SELECT 8 # 切換數(shù)據(jù)庫 DB8
OK
127.0.0.1:6379[8]> DBSIZE # 查看數(shù)據(jù)庫大小
(integer) 0
# 不同數(shù)據(jù)庫之間 數(shù)據(jù)是不能互通的,并且dbsize 是根據(jù)庫中key的個數(shù)。
127.0.0.1:6379[8]> SET name kevin
OK
127.0.0.1:6379[8]> GET name
"kevin"
127.0.0.1:6379[8]> DBSIZE
(integer) 1
127.0.0.1:6379[8]> KEYS *
1) "name"
127.0.0.1:6379[8]> SELECT 0
OK
127.0.0.1:6379> DBSIZE
(integer) 0
127.0.0.1:6379> GET NAME # DB0 中并不能獲取DB8 中的鍵值對。
(nil)
keys * :查看當前數(shù)據(jù)庫中所有的key。
flushdb:清空當前數(shù)據(jù)庫中的鍵值對。
flushall:清空所有數(shù)據(jù)庫的鍵值對。
五大數(shù)據(jù)類型
Redis是一個開源(BSD許可),內(nèi)存存儲的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,可用作數(shù)據(jù)庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數(shù)據(jù)類型。內(nèi)置復(fù)制、Lua腳本、LRU收回、事務(wù)以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區(qū)。
Redis-key
在redis中無論什么數(shù)據(jù)類型,在數(shù)據(jù)庫中都是以key-value形式保存,通過進行對Redis-key的操作,來完成對數(shù)據(jù)庫中數(shù)據(jù)的操作。
exists key:判斷鍵是否存在 del key:刪除鍵值對 move key db:將鍵值對移動到指定數(shù)據(jù)庫 expire key second:設(shè)置鍵值對的過期時間 persist key: 取消鍵值對的過期時間設(shè)置 type key:查看value的數(shù)據(jù)類型
127.0.0.1:6379> keys * # 查看當前數(shù)據(jù)庫所有key
(empty array)
127.0.0.1:6379> set name kevin
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> move age 1 # 將鍵值對移動到指定數(shù)據(jù)庫
(integer) 1
127.0.0.1:6379> EXISTS age # 判斷鍵是否存在
(integer) 0 # 不存在
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> EXISTS age
(integer) 1 # 存在
127.0.0.1:6379[1]> keys *
1) "age"
127.0.0.1:6379[1]> del age # 刪除鍵值對
(integer) 1 # 刪除個數(shù)
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> EXPIRE age 15 # 設(shè)置鍵值對的過期時間
(integer) 1
127.0.0.1:6379> ttl age # 查看key的過期剩余時間
(integer) 12
127.0.0.1:6379> ttl age
(integer) 10
127.0.0.1:6379> ttl age
(integer) 9
127.0.0.1:6379>
127.0.0.1:6379> ttl age
(integer) 6
127.0.0.1:6379> ttl age
(integer) 2
127.0.0.1:6379> ttl age
(integer) 1
127.0.0.1:6379> ttl age # -2 表示key過期
(integer) -2
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name kevin
OK
127.0.0.1:6379> ttl name
(integer) -1 # -1表示key未設(shè)置過期時間
127.0.0.1:6379> type name # 查看value的數(shù)據(jù)類型
string
127.0.0.1:6379> EXPIRE name 30
(integer) 1
127.0.0.1:6379> ttl name
(integer) 28
127.0.0.1:6379> persist name # 取消key的過期時間設(shè)置
(integer) 1
127.0.0.1:6379> ttl name
(integer) -1
關(guān)于TTL命令
Redis的key,通過TTL命令返回key的過期時間,一般來說有3種:
當前key沒有設(shè)置過期時間,所以會返回-1. 當前key有設(shè)置過期時間,而且key已經(jīng)過期,所以會返回-2. 當前key有設(shè)置過期時間,且key還沒有過期,故會返回key的正常剩余時間.
重命名RENAME和RENAMENX
RENAME key newkey:修改 key 的名稱 RENAMENX key newkey:僅當 newkey 不存在時,將 key 改名為 newkey 。
RENAME key newkey的測試:
127.0.0.1:6379> set name kevin
OK
127.0.0.1:6379> set name2 cc
OK
127.0.0.1:6379> RENAME name name2 # 如果newKey已經(jīng)存在,則會覆蓋
OK
127.0.0.1:6379> keys *
1) "name2"
127.0.0.1:6379> get name2
"kevin"
127.0.0.1:6379> set age1 20
OK
127.0.0.1:6379> RENAME age1 age2
OK
127.0.0.1:6379> get age2
"20"
RENAMENX key newkey的測試
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set name1 kevin
OK
127.0.0.1:6379> set name2 cc
OK
127.0.0.1:6379> RENAMENX name1 name2 # 如果newKey已經(jīng)存在,則不會進行rename操作
(integer) 0
127.0.0.1:6379> keys *
1) "name1"
2) "name2"
127.0.0.1:6379> set age1 20
OK
127.0.0.1:6379> RENAMENX age1 age2
(integer) 1
127.0.0.1:6379> keys *
1) "age2"
2) "name1"
3) "name2"
127.0.0.1:6379> get age2
"20"
String(字符串)
SET key value: 設(shè)置指定 key 的值 GET key: 獲取指定 key 的值。
這兩個命令就不進行測試了。
APPEND key value: 如果 key 已經(jīng)存在并且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。
127.0.0.1:6379> SET msg hello
OK
127.0.0.1:6379> APPEND msg world # 如果存在這個key,就在末尾進行append
(integer) 10
127.0.0.1:6379> get msg
"helloworld"
127.0.0.1:6379> keys *
1) "msg"
127.0.0.1:6379> APPEND msg2 aaa # 如果不存在,相當于set key
(integer) 3
127.0.0.1:6379> keys *
1) "msg"
2) "msg2"
127.0.0.1:6379> get msg2
"aaa"
DECR/INCR key: 將key中儲存的數(shù)字值進行加減。只是針對于數(shù)值
127.0.0.1:6379> set number 1
OK
127.0.0.1:6379> INCR number
(integer) 2
127.0.0.1:6379> get number
"2"
127.0.0.1:6379> DECR number
(integer) 1
127.0.0.1:6379> get number
"1"
127.0.0.1:6379> set msg test
OK
127.0.0.1:6379> INCR msg
(error) ERR value is not an integer or out of range
INCRBY/DECRBY key n: 按指定的步長對數(shù)值進行加減
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set number 1
OK
127.0.0.1:6379> INCRBY number 2
(integer) 3
127.0.0.1:6379> get number
"3"
127.0.0.1:6379> DECRBY number 2
(integer) 1
127.0.0.1:6379> get number
"1"
INCRBYFLOAT key n: 為數(shù)值加上浮點型數(shù)值
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set number 1
OK
127.0.0.1:6379> INCRBYFLOAT number 0.2
"1.2"
127.0.0.1:6379> get number
"1.2"
STRLEN key: 獲取key保存值的字符串長度
127.0.0.1:6379> set msg hello
OK
127.0.0.1:6379> STRLEN msg
(integer) 5
GETRANGE key start end: 按起止位置獲取字符串(閉區(qū)間,起止位置都取)
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> get msg
"hello world"
127.0.0.1:6379> GETRANGE msg 3 9
"lo worl"
SETRANGE key offset value: 用指定的value 替換key中 offset開始的值
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> SETRANGE msg 2 test
(integer) 11
127.0.0.1:6379> get msg
"hetestworld"
GETSET key value: 將給定 key 的值設(shè)為value ,并返回 key的舊值(old value)。
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> GETSET msg test
SETNX key value: 僅當key不存在時進行set
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> SETNX msg test
(integer) 0
127.0.0.1:6379> get msg
"hello world"
127.0.0.1:6379> SETNX msg2 test
(integer) 1
127.0.0.1:6379> get msg2
"test"
SETEX key seconds value: set 鍵值對并設(shè)置過期時間
127.0.0.1:6379> SETEX msg 10 "hello world"
OK
127.0.0.1:6379> ttl msg
(integer) 7
127.0.0.1:6379> ttl msg
(integer) 6
127.0.0.1:6379> ttl msg
(integer) 4
127.0.0.1:6379> ttl msg
(integer) -2
MSET key1 value1 [key2 value2..]: 批量set鍵值對
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> MSET msg1 test1 msg2 test2 msg3 test3
OK
127.0.0.1:6379> get msg1
"test1"
127.0.0.1:6379> get msg2
"test2"
127.0.0.1:6379> get msg3
"test3"
MSETNX key1 value1 [key2 value2..]: 批量設(shè)置鍵值對,僅當參數(shù)中所有的key都不存在時執(zhí)行.
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> MSETNX msg1 test1 msg2 test2 msg3 test3
(integer) 1
MGET key1 [key2..]: 批量獲取多個key保存的值
127.0.0.1:6379> MGET msg1 msg2 msg3
1) "test1"
2) "test2"
3) "test3"
PSETEX key milliseconds value 和 SETEX 命令相似,但它以毫秒為單位設(shè)置 key 的生存時間
127.0.0.1:6379> PSETEX msg 50000 "hello wolrd"
OK
127.0.0.1:6379> ttl msg
(integer) 47
127.0.0.1:6379> get msg
"hello wolrd"
127.0.0.1:6379> ttl msg
(integer) 42
127.0.0.1:6379> ttl msg
(integer) 41
127.0.0.1:6379> get msg
"hello wolrd"
List(列表)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊) 一個列表最多可以包含 2^32 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
LPUSH/RPUSH key value1[value2..]: 從左邊/右邊向列表中PUSH值(一個或者多個)。 如果 key 不存在,一個空列表會被創(chuàng)建并執(zhí)行 LPUSH 操作。 當 key 存在但不是列表類型時,返回一個錯誤。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4 # 從左到右的順序依次插入到表頭,列表的值將是 v4,v3,v2,v1
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1
(integer) 1
127.0.0.1:6379> LPUSH list v2
(integer) 2
127.0.0.1:6379> LPUSH list v3
(integer) 3
127.0.0.1:6379> LPUSH list v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 # 從左到右遍歷list的數(shù)據(jù)
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> RPUSH list v1 v2 v3 v4 #從右到左的順序依次插入到表頭,列表的值將是 v1,v2,v3,v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 # get list ---> 普通的get是無法獲取list值的
1) "v1"
2) "v2"
3) "v3"
4) "v4"
LRANGE key start end: 返回列表中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量 start 和 end 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數(shù)下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數(shù)第二個元素。
127.0.0.1:6379> RPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 # 獲取全部元素
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> LRANGE list 0 -2
1) "v1"
2) "v2"
3) "v3"
LPUSHX/RPUSHX key value: 向已存在的列名中push值(一個或者多個),列表不存在時操作無效。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSHX list v1 # 列表不存在時操作無效
(integer) 0
127.0.0.1:6379> LRANGE list 0 -1
(empty array)
127.0.0.1:6379> RPUSHX list v2
(integer) 0
127.0.0.1:6379> LRANGE list 0 -1
(empty array)
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1
(integer) 1
127.0.0.1:6379> LPUSHX list v2 # 列表存在時,操作有效
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "v2"
2) "v1"
LINSERT key BEFORE|AFTER pivot value: 在列表的元素前或者后插入元素。當指定元素不存在于列表中時,不執(zhí)行任何操作。當列表不存在時,被視為空列表,不執(zhí)行任何操作。如果 key 不是列表類型,返回一個錯誤。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> LINSERT list after v2 v5 # 在v2元素后插入v5
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v5"
5) "v1"
127.0.0.1:6379> LINSERT list before v2 v6 # 在v2元素前插入v6
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v6"
4) "v2"
5) "v5"
6) "v1"
127.0.0.1:6379>
LLEN key: 查看列表長度, 返回列表的長度。 如果列表 key 不存在,則 key 被解釋為一個空列表,返回 0。 如果 key 不是列表類型,返回一個錯誤。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LLEN list
(integer) 4
127.0.0.1:6379> LLEN list1 # 如果key不存在,則返回0
(integer) 0
LINDEX key index: 通過索引獲取列表中的元素。你也可以使用負數(shù)下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數(shù)第二個元素,以此類推。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> LINDEX list 0
"v4"
127.0.0.1:6379> LINDEX list -1
"v1"
127.0.0.1:6379> LINDEX list -2
"v2"
LSET key index value 通過索引為元素設(shè)值
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4 v5
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> LSET list 2 v6
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "v4"
3) "v6"
4) "v2"
5) "v1"
LPOP/RPOP key: 從最左邊/最右邊移除值 并返回
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2
(integer) 2
127.0.0.1:6379> LPOP list # 左側(cè)(頭部)彈出
"v2"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2
(integer) 2
127.0.0.1:6379> RPOP list # 右側(cè)(尾部)彈出
"v1"
RPOPLPUSH source destination: 將列表的尾部(右)最后一個值彈出,并返回,然后加到另一個列表的頭部.
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> RPOPLPUSH list newlist # 將mylist的最后一個值(k1)彈出,加入到newlist的頭部
"v1"
127.0.0.1:6379> LRANGE newlist 0 -1
1) "v1"
LTRIM key start end: 通過下標截取指定范圍內(nèi)的列表
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> LTRIM list 0 1 # 截取list中的 0~1部分
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
LREM key count value: List中是允許value重復(fù)的 count > 0:從頭部開始搜索 然后刪除指定的value 至多刪除count個 count < 0:從尾部開始搜索… count = 0:刪除列表中所有的指定value。
127.0.0.1:6379> LPUSH list v1 v2 v3 v4 v4
(integer) 5
127.0.0.1:6379> LREM list 1 v4
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v2 v4
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v2"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> LREM list -1 v2
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v2"
3) "v3"
4) "v1"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH list v1 v2 v3 v3 v4
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> LREM list 0 v3
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v2"
3) "v1"
BLPOP/BRPOP key1[key2] timout: 移出并獲取列表的第一個/最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> LPUSH mylist k2 k2 k4 k2 k2 k2
(integer) 6
127.0.0.1:6379> LPUSH newlist k1
(integer) 1
127.0.0.1:6379> BLPOP newlist mylist 30 # 從newlist中彈出第一個值,mylist作為候選
1) "newlist" # newlist有值, 所以彈出newlist
2) "k1"
127.0.0.1:6379> BLPOP newlist mylist 30
1) "mylist" # 由于newlist空了 從mylist中彈出
2) "k2"
127.0.0.1:6379> BLPOP newlist 30
(nil)
(30.07s) # 超時了
127.0.0.1:6379> BLPOP newlist 30 # 我們連接另一個客戶端向newlist中push了test, 阻塞被解決。
1) "newlist"
2) "test"
(2.86s)
總結(jié):
list實際上是一個鏈表 如果key不存在,則創(chuàng)建新的鏈表;如果key存在,新增內(nèi)容 如果移除了所有值,空鏈表,也代表不存在 在兩邊插入或者改動值,效率最高!修改中間元素,效率相對較低 應(yīng)用:消息排隊!消息隊列(Lpush Rpop),棧(Lpush Lpop)
Set(集合)
Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。 Redis中集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。集合中最大的成員數(shù)為 2^32 - 1 (4294967295, 每個集合可存儲40多億個成員)。
SADD key member1[member2..]: 向集合中無序增加一個/多個成員
127.0.0.1:6379> LPUSH newlist test
(integer) 1
127.0.0.1:6379> SADD myset m1 m2 m3 m4 m4
(integer) 4
SCARD key: 獲取集合的成員數(shù)
127.0.0.1:6379> SCARD myset
(integer) 4
SMEMBERS key: 返回集合中所有的成員
127.0.0.1:6379> SMEMBERS myset
1) "m4"
2) "m2"
3) "m3"
4) "m1"
SISMEMBER key member: 查詢member元素是否是集合的成員,如果成員元素是集合的成員,返回 1 。 如果成員元素不是集合的成員,或 key 不存在,返回 0。
127.0.0.1:6379> SISMEMBER myset m1
(integer) 1
127.0.0.1:6379> SISMEMBER myset m5
(integer) 0
SRANDMEMBER key [count]: 隨機返回集合中count個成員,count缺省值為1
127.0.0.1:6379> SRANDMEMBER myset
"m3"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "m4"
2) "m2"
SPOP key [count]: 隨機移除并返回集合中count個成員,count缺省值為1
127.0.0.1:6379> SMEMBERS myset
1) "m2"
2) "m4"
3) "m3"
4) "m1"
127.0.0.1:6379> SPOP myset
"m4"
127.0.0.1:6379> SPOP myset 2
1) "m2"
2) "m1"
127.0.0.1:6379> SMEMBERS myset
1) "m3"
SMOVE source destination member: 將source集合的成員member移動到destination集合
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD myset m1 m2 m3 m4
(integer) 4
127.0.0.1:6379> SADD newset m5 m6
(integer) 2
127.0.0.1:6379> SMOVE myset newset m1 # 將myset中m1成員移動到newset集合
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "m3"
2) "m2"
3) "m4"
127.0.0.1:6379> SMEMBERS newset
1) "m5"
2) "m1"
3) "m6"
SREM key member1[member2..]: 移除集合中一個/多個成員
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD myset m1 m2 m3 m4
(integer) 4
127.0.0.1:6379> SREM myset m1 m2 # myset中移除m1, m2元素
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "m3"
2) "m4"
SDIFF key1[key2..]: 返回第一個集合與其他集合之間的差異,也可以認為說第一個集合中獨有的元素。不存在的集合 key 將視為空集。 例如:
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD key1 a b c d
(integer) 4
127.0.0.1:6379> SADD key2 c
(integer) 1
127.0.0.1:6379> SADD key3 a c e
(integer) 3
127.0.0.1:6379> SDIFF key1 key2 key3
1) "b"
2) "d"
SDIFFSTORE destination key1[key2..]: 將給定集合之間的差集存儲在指定的集合中。如果指定的集合 key 已存在,則會被覆蓋。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD key1 a b c d
(integer) 4
127.0.0.1:6379> SADD key2 c
(integer) 1
127.0.0.1:6379> SADD key3 a c e
(integer) 3
127.0.0.1:6379> SDIFFSTORE newset key1 key2 key3
(integer) 2
127.0.0.1:6379> SMEMBERS newset
1) "b"
2) "d"
SINTER key1 [key2..]: 返回給定所有給定集合的交集。 不存在的集合 key 被視為空集。 當給定集合當中有一個空集時,結(jié)果也為空集(根據(jù)集合運算定律)。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD setx m1 m2 m4 m6
(integer) 4
127.0.0.1:6379> SADD sety m2 m5 m6
(integer) 3
127.0.0.1:6379> SADD setz m1 m3 m6
(integer) 3
127.0.0.1:6379> SINTER setx sety setz # 求 setx、sety、setx的交集
1) "m6"
127.0.0.1:6379> SINTER setx sety # 求setx sety的交集
1) "m2"
2) "m6"
SINTERSTORE destination key1[key2..]:將給定集合之間的交集存儲在指定的集合中。如果指定的集合已經(jīng)存在,則將其覆蓋。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD setx m1 m2 m4 m6
(integer) 4
127.0.0.1:6379> SADD sety m2 m5 m6
(integer) 3
127.0.0.1:6379> SADD setz m1 m3 m6
(integer) 3
127.0.0.1:6379> SINTERSTORE newset setx sety setz
(integer) 1
127.0.0.1:6379> SMEMBERS newset
1) "m6"
SUNION key1 [key2..]: 返回給定集合的并集。不存在的集合 key 被視為空集。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD setx m1 m2 m4 m6
(integer) 4
127.0.0.1:6379> SADD sety m2 m5 m6
(integer) 3
127.0.0.1:6379> SADD setz m1 m3 m6
(integer) 3
127.0.0.1:6379> SUNION setx sety setz
1) "m3"
2) "m2"
3) "m5"
4) "m6"
5) "m4"
6) "m1"
127.0.0.1:6379> SUNION setx sety
1) "m2"
2) "m5"
3) "m6"
4) "m4"
5) "m1"
127.0.0.1:6379>
SUNIONSTORE destination key1 [key2..]:將給定集合的并集存儲在指定的集合 destination 中。如果 destination 已經(jīng)存在,則將其覆蓋。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SADD setx m1 m2 m4 m6
(integer) 4
127.0.0.1:6379> SADD sety m2 m5 m6
(integer) 3
127.0.0.1:6379> SADD setz m1 m3 m6
(integer) 3
127.0.0.1:6379> SUNIONSTORE newset setx sety
(integer) 5
127.0.0.1:6379> SMEMBERS newset
1) "m2"
2) "m5"
3) "m6"
4) "m4"
5) "m1"
SSCAN KEY [MATCH pattern] [COUNT count]: 在大量數(shù)據(jù)環(huán)境下,使用此命令遍歷集合中元素,每次遍歷部分
Hash(哈希)
Redis hash 是一個string類型的field和value的映射表,hash特別適合用于存儲對象??梢詫⒁粋€Hash表作為一個對象進行存儲,表中存放對象的信息。
HSET key field value: 將哈希表 key 中的字段 field 的值設(shè)為 value 。重復(fù)設(shè)置同一個field會覆蓋,返回0
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> HSET studentx name kevin # 將studentx哈希表作為一個對象,設(shè)置name為kevin
(integer) 1
127.0.0.1:6379> HSET studentx name cai # 重復(fù)設(shè)置field進行覆蓋,并返回0
(integer) 0
127.0.0.1:6379> HSET studentx age 20 # 設(shè)置studentx的age為20
(integer) 1
HMSET key field1 value1 [field2 value2..]: 同時將多個 field-value (域-值)對設(shè)置到哈希表 key 中。
127.0.0.1:6379> HMSET studentx sex 1 tel 123456789
OK
HSETNX key field value:只有在字段 field 不存在時,設(shè)置哈希表字段的值。
127.0.0.1:6379> HSETNX studentx name kkk # HSETNX 設(shè)置已存在的field
(integer) 0 # 失敗
127.0.0.1:6379> HSETNX studentx email test@qq.com
(integer) 1 # 成功
HEXISTS key field:查看哈希表 key 中,指定的字段是否存在。
127.0.0.1:6379> HEXISTS studentx name # name字段在studentx中是否存在
(integer) 1 # 存在
127.0.0.1:6379> HEXISTS studentx addr
(integer) 0 # 不存在
HGET key field value: 獲取存儲在哈希表中指定字段的值
127.0.0.1:6379> HGET studentx name
"cai"
127.0.0.1:6379> HGET studentx age
"20"
HMGET key field1 [field2..]: 獲取所有給定字段的值
127.0.0.1:6379> HMGET studentx name age sex email
1) "cai"
2) "20"
3) "1"
4) "test@qq.com"
HGETALL key:獲取在哈希表key的所有字段和值
127.0.0.1:6379> HGETALL studentx1) "name"2) "cai"3) "age"4) "20"5) "sex"6) "1"7) "tel"8) "123456789"9) "email"
10) "test@qq.com"
HKEYS key: 獲取哈希表key中所有的字段
127.0.0.1:6379> HKEYS studentx
1) "name"
2) "age"
3) "sex"
4) "tel"
5) "email"
HLEN key: 獲取哈希表中字段的數(shù)量
127.0.0.1:6379> HLEN studentx
(integer) 5
HVALS key: 獲取哈希表中所有值
127.0.0.1:6379> HVALS studentx
1) "cai"
2) "20"
3) "1"
4) "123456789"
5) "test@qq.com"
HDEL key field1 [field2..]: 刪除哈希表key中一個/多個field字段
127.0.0.1:6379> HDEL studentx name age
(integer) 2
127.0.0.1:6379> HGETALL studentx
1) "sex"
2) "1"
3) "tel"
4) "123456789"
5) "email"
6) "test@qq.com"
HINCRBY key field n: 為哈希表 key 中的指定字段的整數(shù)值加上增量n,并返回增量后結(jié)果 一樣只適用于整數(shù)型字段。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> HSET studentx age 11
(integer) 1
127.0.0.1:6379> HSET studentx name kevin
(integer) 1
127.0.0.1:6379> HINCRBY studentx age 1
(integer) 12
127.0.0.1:6379> HINCRBY studentx name 1
(error) ERR hash value is not an integer
HINCRBYFLOAT key field n: 為哈希表 key 中的指定字段的浮點數(shù)值加上增量 n。
127.0.0.1:6379> HSET studentx weight 50
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT studentx weight 0.6
"50.6"
HSCAN key cursor [MATCH pattern] [COUNT count]:迭代哈希表中的鍵值對。
Zset(有序集合)
不同的是每個元素都會關(guān)聯(lián)一個double類型的分數(shù)(score)。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。
score相同:按字典順序排序
有序集合的成員是唯一的,但分數(shù)(score)卻可以重復(fù)。
ZADD key score member1 [score2 member2]: 向有序集合添加一個或多個成員,或者更新已存在成員的分數(shù)
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
ZCARD key: 獲取有序集合的成員數(shù)
127.0.0.1:6379> ZCARD myzset
(integer) 3
ZCOUNT key min max:計算在有序集合中指定區(qū)間score的成員數(shù)
127.0.0.1:6379> ZCOUNT myzset 0 1 # 獲取score在 [0,1]區(qū)間的成員數(shù)量
(integer) 1
127.0.0.1:6379> ZCOUNT myzset 0 2 # 獲取score在 [0,2]區(qū)間的成員數(shù)量
(integer) 2
ZINCRBY key n member:有序集合中對指定成員的分數(shù)加上增量 n
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZINCRBY myzset 1 m1
"2"
ZSCORE key member: 返回有序集中,成員的分數(shù)值
127.0.0.1:6379> ZSCORE myzset m1
"2"
ZRANK key member: 返回有序集合中指定成員的索引
127.0.0.1:6379> ZRANK myzset m1
(integer) 0
127.0.0.1:6379> ZRANK myzset m2
(integer) 1
ZRANGE key start end: 通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員
127.0.0.1:6379> ZRANGE myzset 0 -1 # 獲取全部成員
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZRANGE myzset 0 1 # 獲取索引在 0~1的成員
1) "m1"
2) "m2"
ZRANGEBYLEX key min max:通過字典區(qū)間返回有序集合的成員
127.0.0.1:6379> ZRANGEBYLEX myzset - +
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZRANGEBYLEX myzset - + LIMIT 0 2
1) "m1"
2) "m2"
127.0.0.1:6379> ZRANGEBYLEX myzset - + LIMIT 1 2
1) "m2"
2) "m3"
ZRANGEBYSCORE key min max:通過分數(shù)返回有序集合指定區(qū)間內(nèi)的成員
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZRANGEBYSCORE myzset 1 3
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZRANGEBYSCORE myzset 1 4
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZRANGEBYSCORE myzset 2 4
1) "m2"
2) "m3"
127.0.0.1:6379> ZRANGEBYSCORE myzset -inf +inf
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZRANGEBYSCORE myzset -inf +inf WITHSCORES
1) "m1"
2) "1"
3) "m2"
4) "2"
5) "m3"
6) "3"
ZLEXCOUNT key min max: 在有序集合中計算指定字典區(qū)間內(nèi)成員數(shù)量
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT myzset [m2 [m3
(integer) 2
127.0.0.1:6379> ZLEXCOUNT myzset [m1 [m3
(integer) 3
127.0.0.1:6379> ZLEXCOUNT myzset (m1 [m3
(integer) 2
127.0.0.1:6379> ZLEXCOUNT myzset (m1 (m3
(integer) 1
ZREM key member1 [member2..]: 移除有序集合中一個/多個成員
127.0.0.1:6379> ZREM myzset m1 m2
(integer) 2
127.0.0.1:6379> ZCARD myzset
(integer) 1
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "m3"
ZREMRANGEBYLEX key min max: 移除有序集合中給定的字典區(qū)間的所有成員
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZREMRANGEBYLEX myzset [m1 [m2 # 移除字典區(qū)間[m1,m2]中的所有成員
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "m3"
ZREMRANGEBYRANK key start stop: 移除有序集合中給定的排名區(qū)間的所有成員
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZREMRANGEBYRANK myzset 0 1 # 移除排名0~1的所有成員
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "m3"
ZREMRANGEBYSCORE key min max: 移除有序集合中給定的分數(shù)區(qū)間的所有成員
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZREMRANGEBYSCORE myzset 0 2 # 移除score在 [0,2]的成員
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "m3"
ZREVRANGE key start end: 返回有序集中指定區(qū)間內(nèi)的成員,通過索引,分數(shù)從高到底
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD myzset 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZREVRANGE myzset 0 3 # 按score遞減排序,然后按索引,返回結(jié)果的 0~3
1) "m3"
2) "m2"
3) "m1"
127.0.0.1:6379> ZREVRANGE myzset 1 3 # 按score遞減排序,然后按索引,返回結(jié)果的 1~3
1) "m2"
2) "m1"
ZREVRANGEBYSCORRE key max min: 返回有序集中指定分數(shù)區(qū)間內(nèi)的成員,分數(shù)從高到低排序
127.0.0.1:6379> ZREVRANGEBYSCORE myzset 3 1
1) "m3"
2) "m2"
3) "m1"
127.0.0.1:6379> ZREVRANGEBYSCORE myzset 3 2
1) "m3"
2) "m2"
127.0.0.1:6379> ZREVRANGEBYSCORE myzset 3 2 WITHSCORES
1) "m3"
2) "3"
3) "m2"
4) "2"
ZREVRANGEBYLEX key max min: 返回有序集中指定字典區(qū)間內(nèi)的成員,按字典順序倒序
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "m1"
2) "m2"
3) "m3"
127.0.0.1:6379> ZREVRANGEBYLEX myzset [m2 (m1
1) "m2"
127.0.0.1:6379> ZREVRANGEBYLEX myzset [m2 [m1
1) "m2"
2) "m1"
ZREVRANK key member: 返回有序集合中指定成員的排名,有序集成員按分數(shù)值遞減(從大到小)排序
127.0.0.1:6379> ZREVRANK myzset m1
(integer) 2
127.0.0.1:6379> ZREVRANK myzset m3
(integer) 0
127.0.0.1:6379> ZREVRANK myzset m2
(integer) 1
ZINTERSTORE destination numkeys key1 [key2 ..]: 計算給定的一個或多個有序集的交集并將結(jié)果集存儲在新的有序集合 key 中,numkeys:表示參與運算的集合數(shù),將score相加作為結(jié)果的score
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD zset1 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZADD zset2 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZINTERSTORE newzset 2 zset1 zset2
(integer) 3
127.0.0.1:6379> ZRANGE newzset 0 -1 WITHSCORES
1) "m1"
2) "2"
3) "m2"
4) "4"
5) "m3"
6) "6"
ZUNIONSTORE destination numkeys key1 [key2..]: 計算給定的一個或多個有序集的交集并將結(jié)果集存儲在新的有序集合 key 中.
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD zset1 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZADD zset2 3 m1 4 m2 5 m3
(integer) 3
127.0.0.1:6379> ZUNIONSTORE newzset 2 zset1 zset2 AGGREGATE MIN
(integer) 3
127.0.0.1:6379> ZRANGE newzset 0 -1 WITHSCORES
1) "m1"
2) "1"
3) "m2"
4) "2"
5) "m3"
6) "3"
ZSCAN key cursor [MATCH pattern\] [COUNT count]: 迭代有序集合中的元素(包括元素成員和元素分值)
應(yīng)用案例:
set排序 存儲班級成績表 工資表排序! 普通消息,1.重要消息 2.帶權(quán)重進行判斷 排行榜應(yīng)用實現(xiàn),取Top N測試
總結(jié)
以上是生活随笔 為你收集整理的Redis 五大数据类型的基本命令使用 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。