02 Redis數據結構基礎
一.客戶端命令行參數
1.
-x
從標準輸入讀取一個參數,等價於set k v[root@localhost etc]# echo -en ‘v1‘|redis-cli -a foobared -x set k1 OK [root@localhost etc]# redis-cli -a foobared get k1 "v1"
2.
-r
重復執行一個命令指定次數[root@localhost etc]# redis-cli -a foobared -r 2 get k1 "v1" "v1"
3.
-i
命令執行間隔[root@localhost etc]# redis-cli -a foobared -r 2 -i 3 get k1 "v1" "v1"
4.
-rdb
獲取指定實例的rdb文件,保存到本地[root@localhost etc]# redis-cli -a foobared --rdb /tmp/6379.rdb SYNC sent to master, writing 263 bytes to ‘/tmp/6379.rdb‘ Transfer finished with success. [root@localhost etc]# ls -l /tmp/6379.rdb -rw-r--r--. 1 root root 263 Jun 14 13:34 /tmp/6379.rdb
5.
-scan
和-pattern
用scan命令掃描redis中的key,pattern是匹配模式,相比keys pattern
[root@localhost etc]# redis-cli -a foobared --scan --pattern ‘*1‘ k1 [root@localhost etc]# redis-cli -a foobared --scan --pattern ‘*1*‘ k10 k1 [root@localhost etc]# redis-cli -a foobared --scan --pattern ‘k*‘ k10 k2 k1
6.連接參數
redis-cli -a password -h hostname/IP -p port redis-cli -s socketfile
7.socket參數默認不開啟
unixsocket /tmp/redis.sock
,且同樣需要輸入密碼[root@localhost tmp]# redis-cli -s /tmp/redis.sock redis /tmp/redis.sock> redis /tmp/redis.sock> keys k1 (error) NOAUTH Authentication required. redis /tmp/redis.sock> auth foobared OK redis /tmp/redis.sock> keys * 1) "k10" 2) "bit" 3) "k1" 4) "k2"
8.
-stat
獲取redis診斷數據[root@localhost tmp]# redis-cli -a foobared --stat ------- data ------ --------------------- load -------------------- - child - keys mem clients blocked requests connections # 308087 28.90M 51 0 308649 (+0) 58 432618 37.45M 51 0 433641 (+124992) 58 552107 53.65M 51 0 553683 (+120042) 58 673106 57.96M 51 0 675476 (+121793) 58 797567 66.51M 51 0 800856 (+125380) 58 921655 75.03M 51 0 925951 (+125095) 58 995100 77.12M 1 0 1000101 (+74150) 58 995100 77.12M 1 0 1000102 (+1) 58 995100 77.12M 1 0 1000103 (+1) 58 995100 77.12M 1 0 1000104 (+1) 58 1004507 80.71M 51 0 1009652 (+9548) 108 1119911 104.64M 51 0 1126280 (+116628) 108 1227279 112.01M 51 0 1234913 (+108633) 108 #
redis-benchmark -a foobared -h 127.0.0.1 -p 6379 -t set -n 1000000 -r 100000000
9.
-bigkeys
對redis中的key進行采樣,尋找較大的keys,根據采樣得出大概的數據統計[root@localhost bin]# redis-cli -a foobared --bigkeys # # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed). # [00.00%] Biggest string found so far ‘key:000036007278‘ with 3 bytes [50.49%] Sampled 1000000 keys so far [51.97%] Biggest string found so far ‘bit‘ with 1261 bytes # -------- summary ------- # Sampled 1980449 keys in the keyspace! Total key length in bytes is 31687130 (avg len 16.00) # Biggest string found ‘bit‘ has 1261 bytes # 1980449 strings with 5942603 bytes (100.00% of keys, avg size 3.00) 0 lists with 0 items (00.00% of keys, avg size 0.00) 0 sets with 0 members (00.00% of keys, avg size 0.00) 0 hashs with 0 fields (00.00% of keys, avg size 0.00) 0 zsets with 0 members (00.00% of keys, avg size 0.00)
10.
-latency
獲取命令的請求響應延遲時間,單位是毫秒[root@localhost bin]# redis-cli -a foobared --latency min: 0, max: 16, avg: 1.31 (5697 samples)
二.數據結構類型
- key:只有string類型
values:string、set、list、hash、zset
結構類型 結構存儲的值 結構的讀寫能力 string 字符串、整數、浮點數、任何二進制格式的數據 對整字符串和部分進行操作,對整數和浮點數執行自增或者自建操作 list 一個鏈表,鏈表的每個字節都包含一個字符串 鏈表兩端推出或彈出元素;根據偏移量對鏈表進行修剪;讀取單個或者多個元素;根據值查找或者移除元素 set 包含字符串的無序收集器,每個字符串不重復 添加、獲取、移除單個元素;檢查一個元素是否存在;計算交、並、差集;從集合中隨機取元素 hash 包含鍵值對的無序散列表 添加、獲取、移除多個鍵值對;獲取所有鍵值對 zset 字符串成員member與浮點數分值score之間的有序映射,元素的排序有分值大小決定 獲取、添加、移除單個元素;根據分值範圍或者成員來獲取元素
1.string
1.1 SET key value [EX seconds] [PX milliseconds] [NX|XX]
- EX 代表設置超時時間,單位為秒
- PX 代表設置超時時間,單位為毫秒
- NX 代表只有key不存在才設置值
- XX 代表只有key存在才更新值
如果成功,返回ok,失敗則返回nil
127.0.0.1:6379> set kk1 vv1 EX 2 OK 127.0.0.1:6379> get kk1 "vv1" 127.0.0.1:6379> get kk1 (nil) 127.0.0.1:6379> set kk1 vv1 PX 2000 OK 127.0.0.1:6379> get kk1 "vv1" 127.0.0.1:6379> get kk1 (nil) 127.0.0.1:6379> set kk1 100 NX OK 127.0.0.1:6379> get kk1 "100" 127.0.0.1:6379> set kk2 100 XX (nil) 127.0.0.1:6379> set kk1 200 XX OK 127.0.0.1:6379> get kk1 "200" 127.0.0.1:6379> set kk1 300 NX (nil)
1.2 MGET KEY1 KEY2...
- 返回指定的key的值,如果key不存在則返回這個key的值為nil
返回指定key的值列表
127.0.0.1:6379> mget k1 kk1 1) "v1" 2) "200" 127.0.0.1:6379> mget k1 1) "v1" 127.0.0.1:6379> mget k1 kk1 kk2 1) "v1" 2) "200" 3) (nil)
1.3 MSET KEY1 VALUE1 KEY2 VALUE2 ...
- 設置多個k/v,如果某個key已經存在,則被覆蓋
- 原子性操作
- 不想覆蓋現有值,用msetnx
總是返回ok,此操作不會失敗
127.0.0.1:6379> mset k1 v1 k2 v2 OK 127.0.0.1:6379> mget k1 k2 1) "v1" 2) "v2" 127.0.0.1:6379> mset k1 v1 k2 v2 k3 (error) ERR wrong number of arguments for MSET
1.4 MSETNX k1 v1 k2 v2...
- 只要一個k存在,結果失敗
返回1表示成功,0表示失敗
127.0.0.1:6379> mset k2 v2 k3 v3 OK 127.0.0.1:6379> msetnx k3 v3 k4 v4 (integer) 0 127.0.0.1:6379> msetnx k4 v4 k5 v5 (integer) 1
1.5 append
- 如果k存在,並且是string類型,就把新值追加到末尾,相當於字符串拼接
- 如果k不存在,類似set功能
返回字符長度
127.0.0.1:6379> get k6 (nil) 127.0.0.1:6379> append k6 123 (integer) 3 127.0.0.1:6379> get k6 "123" 127.0.0.1:6379> append k6 abc (integer) 6 127.0.0.1:6379> get k6 "123abc"
1.6 incr key
- 對值進行+1操作,必須是integer類型
- 最大值為64位有符號值
返回值為加完的結果
127.0.0.1:6379> mset k1 v1 k2 2.2 k3 3 OK 127.0.0.1:6379> incr k1 (error) ERR value is not an integer or out of range 127.0.0.1:6379> incr k2 (error) ERR value is not an integer or out of range 127.0.0.1:6379> incr k3 (integer) 4
1.7 decr key
- 對值減一操作,必須是int類型
- 如果key不存在,會對key賦值為0,在做操作
- 上下限為64位有符號值
返回操作後的結果值
127.0.0.1:6379> mget k1 k2 k3 1) "v1" 2) "2.2" 3) "4" 127.0.0.1:6379> decr k1 (error) ERR value is not an integer or out of range 127.0.0.1:6379> decr k2 (error) ERR value is not an integer or out of range 127.0.0.1:6379> decr k3 (integer) 3 127.0.0.1:6379> mset k01 -1 OK 127.0.0.1:6379> decr k01 (integer) -2 127.0.0.1:6379> decr k100 (integer) -1 127.0.0.1:6379> get 100 (nil)
1.8 decrby key decrment、incrby key increment
- 對值進行加減操作,步長為decrement,必須是int
返回操作後的結果
127.0.0.1:6379> mset k1 10 k2 20 OK 127.0.0.1:6379> decrby k1 2 (integer) 8 127.0.0.1:6379> incrby k2 2 (integer) 22 127.0.0.1:6379> mget k1 k2 1) "8" 2) "22"
1.8 incrbyfloat key increment
- 浮點型加操作,可以是int
返回操作後的結果
127.0.0.1:6379> mset k1 1.1 k2 2.2 k3 3 OK 127.0.0.1:6379> incrbyfloat k1 2.2 "3.3" 127.0.0.1:6379> decrbyfloat k2 1.1 (error) ERR unknown command ‘decrbyfloat‘ 127.0.0.1:6379> incrbyfloat k3 1 "4"
1.9 strlen key
對字符串取長
127.0.0.1:6379> strlen k1 (integer) 3
1.10 getrange key start end
- 按索引取子串
索引為負表示末尾取
127.0.0.1:6379> set k1 abcdefg OK 127.0.0.1:6379> getrange k1 0 1 "ab" 127.0.0.1:6379> getrange k1 -2 -1 "fg"
1.11 get bit key offset
獲取一個字符串類型key指定位置的二進制位的值(0/1),索引從0開始
127.0.0.1:6379> get k1 "abcdefg" 127.0.0.1:6379> getbit k1 0 (integer) 0 127.0.0.1:6379> getbit k1 1 (integer) 1 127.0.0.1:6379> getbit k1 2 (integer) 1 127.0.0.1:6379> getbit k1 3 (integer) 0 127.0.0.1:6379> getbit k1 4 (integer) 0
1.12 setbit key offset value
設置字符串類型建指定位置的二進制位的值,返回該位置的舊值
127.0.0.1:6379> setbit k1 0 1 (integer) 0 127.0.0.1:6379> getbit k1 0 (integer) 1
1.13 bitcount
取字符串類型鍵中值時1的二進制位的個數
127.0.0.1:6379> bitcount k1 (integer) 27 127.0.0.1:6379> get k1 "\xe1bcdefg"
2.lists
2.1 lpush key value ...
- 把所有值從list的頭部插入,如果key不存在就創建一個空的隊列
- 如果key對應的value不是list類型,報錯
- 元素從左往右插入
返回list的長度
127.0.0.1:6379> get list1 (nil) 127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> get list1 (error) WRONGTYPE Operation against a key holding the wrong kind of value
2.2 lpush key value
- 從list頭部插入一個值,key不存在不產生插入動作
返回list的長度
127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> lpush list1 4 (integer) 4
存儲順序如4 3 2 1
2.3 lpop
- 彈出一個元素,最左邊先彈出
返回被彈出元素
127.0.0.1:6379> lpop list1 "4" 127.0.0.1:6379> lpop list1 "3" 127.0.0.1:6379> lpop list1 "2" 127.0.0.1:6379> lpop list1 "1" 127.0.0.1:6379> lpop list1 (nil)
2.4 rpop
右邊彈出,並返回被彈出元素
127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> rpop list1 "1" 127.0.0.1:6379> rpop list1 "2" 127.0.0.1:6379> rpop list1 "3" 127.0.0.1:6379> rpop list1 (nil)
2.5 blpop key [keyn] timeout / brpop
以阻塞方式從key中彈出並返回第一個值,只彈出和返回第一個非空的key
127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> blpop list1 2 1) "list1" 2) "3" 127.0.0.1:6379> blpop list1 list2 2 1) "list1" 2) "2"
- timeout 阻塞時長,單位是秒,0表示一直阻塞
- 只要list的長度為0或者或者key不存在就會則色
- 當多個key時,如blpop key1 key1,只要有一個key對應的list不是非空,則不會阻塞
- 返回值依次包含key彈出的值阻塞的時長
超時時,如果沒有值可返回,則返回nil
127.0.0.1:6379> blpop list1 2 (nil) (3.01s) 127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> blpop list1 2 1) "list1" 2) "3"
2.6 llen key
求列表長度,不存在或者為空,返回0
127.0.0.1:6379> llen list1 (integer) 0 127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> llen list1 (integer) 3
2.7 rpush key valuen 多值插入
- 右邊插入,插入順序即所得順序
返回list長度
127.0.0.1:6379> rpush list1 a b c (integer) 6 127.0.0.1:6379> rpop list1 "c"
2.8 rpush key value 單值插入
- 右邊插入,不存在則不產生動作
返回list長度
127.0.0.1:6379> rpushx list1 b (integer) 6 127.0.0.1:6379> rpushx list2 a (integer) 0
2.9 rpoplpush source destination
- 原子性操作
- 從souce尾部/右邊移除一個值,並加入到destination指定的頭部/左邊
- 如果source的list不存在,則返回nil,不做任何操作
- 如果soure和destination是一樣的,等價於右邊移動到左邊/尾部移動到頭部
返回被彈出和後插入的數據
127.0.0.1:6379> rpush list1 a b c (integer) 3 127.0.0.1:6379> rpush list2 1 2 3 (integer) 3 # 兩個列表,分別是 # list1 a b c # list2 1 2 3 127.0.0.1:6379> rpoplpush list1 list2 "c" # 第一個列表的尾部元素插入第二個列表頭部 # list1 a b # list2 c 1 2 3 127.0.0.1:6379> rpop list2 "3"
2.10 brpoplpush source destination timeout
- 當source為空時,將會進行阻塞,timeout為0一直阻塞
2.11 lindex key index
- 返回key指定的隊列中的位置index的值
0表示第一位,自後一位表示-1
127.0.0.1:6379> rpop list1 (nil) 127.0.0.1:6379> lpush list1 a b c (integer) 3 127.0.0.1:6379> lindex list1 0 "c" 127.0.0.1:6379> lindex list1 -1 "a"
2.12 linsert key before|after pivot value
- 插入value值在pivot值的前或者後
- 如果key不存在,不產生動作
- 如果pivot對應的值不存在則返回-1
否則返回插入後list的長度
127.0.0.1:6379> linsert list1 before b value1 (integer) 4 127.0.0.1:6379> lrange list1 0 3 1) "c" 2) "value1" 3) "b" 4) "a" 127.0.0.1:6379> linsert list1 before d value1 (integer) -1
2.13 lrange key start stop
- 返回list元素,從左到右
- 如果start大於stop,返回空
如果stop大於list長度,返回所有元素
127.0.0.1:6379> lrange list1 3 0 (empty list or set) 127.0.0.1:6379> lrange list1 0 100 1) "c" 2) "value1" 3) "b" 4) "a"
2.14 lrem key count value
- 刪除值等於value的count個元素
- 如果count大於0,則從頭到尾數
- 如果count小於0,則從尾到頭數
如果count等於0,則刪除所有值等於value的元素
127.0.0.1:6379> lpush list5 1 2 2 1 3 5 (integer) 6 127.0.0.1:6379> lrange list5 0 100 1) "5" 2) "3" 3) "1" 4) "2" 5) "2" 6) "1" 127.0.0.1:6379> lrem list5 0 5 (integer) 1 127.0.0.1:6379> lrange list5 0 100 1) "3" 2) "1" 3) "2" 4) "2" 5) "1" 127.0.0.1:6379> lrem list5 1 1 (integer) 1 127.0.0.1:6379> lrange list5 0 100 1) "3" 2) "2" 3) "2" 4) "1" 127.0.0.1:6379> lrem list5 -1 2 (integer) 1 127.0.0.1:6379> lrange list5 0 100 1) "3" 2) "2" 3) "1"
2.15 lset key index value
- 修改key對應的list中,位置為index的元素值為value
當index超過list的長度,將會出錯
127.0.0.1:6379> lrange list5 0 100 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> lset list5 0 33 OK 127.0.0.1:6379> lrange list5 0 100 1) "33" 2) "2" 3) "1" 127.0.0.1:6379> lset list5 3 33 (error) ERR index out of range
3.keys
3.1 del keyn
- 刪除指定key,如果key不存在,操作被忽略
返回被刪除的key個數
127.0.0.1:6379> del list5 list1 (integer) 2 127.0.0.1:6379> lrange list5 0 100 (empty list or set) 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> set k3 v3 OK 127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> del k2 k3 (integer) 2
3.2 dump key
- 按照rdb格式把指定key的值序列化返回給客戶端,此序列化裏面不包括ttl信息
- 序列化的值中包含校驗碼
- 不同版本的rdb可能存在差異
key不存在就返回nil
127.0.0.1:6379> set k1 abcd123 OK 127.0.0.1:6379> dump k1 "\x00\aabcd123\b\x00\x1b\xb1\xbc|\rG\xda\xeb" 127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> restore k1 10 "\x00\aabcd123\b\x00\x1b\xb1\xbc|\rG\xda\xeb" OK 127.0.0.1:6379> get k1 (nil) 127.0.0.1:6379> get k1 (nil) 127.0.0.1:6379> restore k1 0 "\x00\aabcd123\b\x00\x1b\xb1\xbc|\rG\xda\xeb" OK 127.0.0.1:6379> get k1 "abcd123"
3.3 restore key ttl serialized-value [REPLACE]
- 恢復被序列化的key值
- key已存在,不在replace覆蓋屬性,會報錯
成功返回ok
127.0.0.1:6379> restore k1 0 "\x00\aabcd123\b\x00\x1b\xb1\xbc|\rG\xda\xeb" (error) BUSYKEY Target key name already exists. 127.0.0.1:6379> restore k1 0 "\x00\aabcd123\b\x00\x1b\xb1\xbc|\rG\xda\xeb" replace OK
3.3 exists keyn
- 判斷key是否存在,存在則+1
如果key重復,返回值會重復判斷和+1
127.0.0.1:6379> get k1 "abcd123" 127.0.0.1:6379> get k2 (nil) 127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k1 k1 (integer) 2 127.0.0.1:6379> exists k2 (integer) 0
3.3 expire key seconds
- 設置超時時間,單位是秒,達到超時時間後,key被刪除
- 超時屬性只能被del、set、getset和*store命令修改或者改變,其他命令不會改變超時屬性
- persist持久化取消超時設置
- 當key被rename命令修改後,超時屬性依然存在
設置成功返回1,key不存在或者超時設置失敗返回0
127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> set k1 v1 10 (error) ERR syntax error 127.0.0.1:6379> expire k1 2 (integer) 1 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 (nil) 127.0.0.1:6379> set k1 v1 5 (error) ERR syntax error 127.0.0.1:6379> get k1 (nil) 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expire k1 5 (integer) 1 127.0.0.1:6379> set k1 v2 OK 127.0.0.1:6379> get k1 "v2" 127.0.0.1:6379> get k1 "v2" 127.0.0.1:6379> get k1 "v2" 127.0.0.1:6379> get k1 "v2" 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expire k1 10 (integer) 1 127.0.0.1:6379> persist k1 (integer) 1 127.0.0.1:6379> get k1 "v1"
3.4 persist key
- 持久化key,移除過期時間
1表示成功,0表示key不存在或者key沒有設置超時設置
127.0.0.1:6379> persist k100 (integer) 0 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> persist k1 (integer) 0
3.5 expireat key timestamp
- 設置過期時間為精確時間戳
1表示成功,0表示key不存在或者key沒有設置超時設置
127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expireat k1 1528965035 (integer) 1 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 "v1" # 1528965035 2018-06-14 16:30:35 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expireat k1 1528965035 (integer) 1 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> get k1 (nil)
3.6 keys pattern
- 返回符合匹配key的所有values
- 會造成阻塞影響性能,可以用scan護著sets代替查找
- *表示任意字符,?表示單個字符,[ae]代表a或者b
[^e]排除e,[a-d]代表a,b,c,d
127.0.0.1:6379> mset a 1 b 2 c 3 d 4 OK 127.0.0.1:6379> keys [a-c] 1) "a" 2) "c" 3) "b" (0.58s)
3.7 ttl key
- 返回生存時間
- key不存在,返回-2
key沒有超時設置,返回-1
127.0.0.1:6379> set k 1 ex 10 OK 127.0.0.1:6379> set k2 2 OK 127.0.0.1:6379> ttl k (integer) 1 127.0.0.1:6379> ttl k2 (integer) -1 127.0.0.1:6379> ttl k3 (integer) -2
3.8 pttl key
返回的是毫秒生存時間
127.0.0.1:6379> set k1 v1 EX 100 OK 127.0.0.1:6379> pttl k1 (integer) 97195
3.9 SCAN cursor [MATCH pattern] [COUNT count]
- 基於遊標方式範湖當前數據的key,因為每次返回的數據不多,也不會阻塞服務器,可以在生產中使用
- coursor表示遊標的位置,一般從0開始,返回數據中的第一行代表的就是下一次遊標的位置,當返回的下一行遊標是0時,代表本次叠代完成;此遊標不是一個連續標準值,比如5,10,15是連續標準
- MATCH pattern類似keys中的模式一樣,返回匹配模式的叠代遊標
- Count代表每次叠代返回的數據條數,默認是10,只是一個提示,實現時並沒有嚴格保證,實際返回的值可能會比這個值多一些,但是不糊多太多
- 與keys或者smembers命令,scan返回的結果是不穩定的,在執行叠代的過程中,如果key發生變化,不弱刪除或者新增,則返回的結果可能存在以下幾個問題
- 可能會返回重復的key,所有使用此命令時,業務系統需要判斷重復
如果叠代過程中,有key被刪除了,但是叠代完成前沒有被添加進來,則此key並不會出現在叠代中
127.0.0.1:6379> scan 0 1) "5505024" 2) 1) "key:000051260311" 2) "key:000036007278" 3) "key:000059694484" 4) "key:000006587804" 5) "key:000004199401" 6) "key:000094197164" 7) "key:000099600200" 8) "key:000051222239" 9) "key:000075613120" 10) "key:000058266859" 11) "key:000076128079" 127.0.0.1:6379> scan 10 1) "1835018" 2) 1) "key:000075289699" 2) "key:000078347835" 3) "key:000071808967" 4) "key:000066680858" 5) "key:000020401759" 6) "key:000087370174" 7) "key:000089373903" 8) "key:000094725692" 9) "key:000077304879" 10) "key:000019052151" 127.0.0.1:6379> scan 20 1) "7077908" 2) 1) "key:000005041067" 2) "key:000045121774" 3) "key:000095755193" 4) "key:000006008892" 5) "key:000041833711" 6) "key:000064230555" 7) "key:000074550342" 8) "key:000084491604" 9) "key:000096452813" 10) "key:000094200031" 127.0.0.1:6379> scan 0 count 20 1) "1179648" 2) 1) "key:000051260311" 2) "key:000036007278" 3) "key:000059694484" 4) "key:000006587804" 5) "key:000004199401" 6) "key:000094197164" 7) "key:000099600200" 8) "key:000051222239" 9) "key:000075613120" 10) "key:000058266859" 11) "key:000076128079" 12) "key:000051853542" 13) "key:000091156937" 14) "key:000072767835" 15) "key:000026187737" 16) "key:000083167013" 17) "key:000057492750" 18) "key:000027269441" 19) "key:000012211723" 20) "key:000058915500" 127.0.0.1:6379> scan 0 match key:00005126031* 1) "5505024" 2) 1) "key:000051260311" 127.0.0.1:6379> scan 0 match 1* 1) "5505024" 2) (empty list or set)
4.hashes
4.1 hset key filed value
- key代表的是一個hash表,field為hash的表的key,value為hash表中key對應的value
- 如果key不存在,則創建一個key及對應的hash表
- 如果field存在,則把value覆蓋原來的值
- 如果field是新加入的,並且設置成功,則返回1
如果field已經存在,成功更新舊值,返回0
127.0.0.1:6379> hset dict1 name yzw (integer) 1 127.0.0.1:6379> hset dict1 age 40 (integer) 1 127.0.0.1:6379> hset dict1 age 18 (integer) 0
4.2 HMSET key fieldn valuen
- 1次性設置多個值
成功返回OK
127.0.0.1:6379> HMSET map1 name yzw age 40 OK
4.3 HSETNX key field value
- key代表hash表
- field代表hash表的key,value代表hash表對應key的value
- 當field不存在時才設置
- 如果field不存在,則設置值,返回1
如果field存在,不做任何操作,返回0
127.0.0.1:6379> hkeys dict1 1) "name" 2) "age" 127.0.0.1:6379> hsetnx dict1 age 18 (integer) 0 127.0.0.1:6379> hsetnx dict1 addr gz (integer) 1 127.0.0.1:6379>
4.4 hkeys key
- 獲取key對應的map的所有key
返回key列表
127.0.0.1:6379> hkeys dict1 1) "name" 2) "age" 3) "addr"
4.5 hlen key
獲取key對應的map的filed數量,也就是字典長度或者元素個數
127.0.0.1:6379> hlen dict1 (integer) 3
4.6 hget key field
- 獲取某個field的值
如果key不存在或者field不存在,返回nil,否則返回值
127.0.0.1:6379> hget dict1 name "yzw" 127.0.0.1:6379> hget dict1 salary (nil) 127.0.0.1:6379> hget ddd name (nil)
4.7 hmget key fieldn
- 返回多個key對應的map值
不存在返回nil
127.0.0.1:6379> hmget dict1 name age addr salary 1) "yzw" 2) "18" 3) "gz" 4) (nil)
4.8 hstrlen key field
- 返回field對應值的長度
不存在返回0
127.0.0.1:6379> hstrlen dict1 name (integer) 3 127.0.0.1:6379> hstrlen dict1 salary (integer) 0
4.9 hdel key fieldn
- 刪除key對應的map的field,可以原子性刪除多個
返回刪除的值的個數
127.0.0.1:6379> hdel dict1 addr age (integer) 2 127.0.0.1:6379> hmget dict1 name age addr 1) "yzw" 2) (nil) 3) (nil)
4.10 hexists key field
- 判斷指定map中是否存在對應key
- 如果key不存在或者filed不存在返回0
否則返回1
127.0.0.1:6379> hexists dict1 name (integer) 1 127.0.0.1:6379> hexists dict1 age (integer) 0
4.11 hgetall key
返回key對應的map的所有k/v對
127.0.0.1:6379> hgetall dict1 1) "name" 2) "yzw"
4.12 hincrby key field increment
- 對指定field加上increment,必須是int類型,64位有符號數
返回增加後的結果,不存在則加入元素
127.0.0.1:6379> hgetall dict1 1) "name" 2) "yzw" 3) "age" 4) "18" 127.0.0.1:6379> hincrby dict1 age 2 (integer) 20 127.0.0.1:6379> hincrby dict1 salary 100 (integer) 100 127.0.0.1:6379> hgetall dict1 1) "name" 2) "yzw" 3) "age" 4) "20" 5) "salary" 6) "100"
4.13 hincrbyfloat key field increment
浮點
127.0.0.1:6379> hset dict1 salary 100.1 (integer) 0 127.0.0.1:6379> hgetall dict1 1) "name" 2) "yzw" 3) "age" 4) "20" 5) "salary" 6) "100.1" 127.0.0.1:6379> hincrbyfloat dict1 salary 1 "101.1" 127.0.0.1:6379> hincrbyfloat dict1 salary 0.1 "101.2"
4.14 hscan key cursor [MATCH pattern] [Count count]
叠代hash裏面的value值
127.0.0.1:6379> hscan dict1 10 1) "0" 2) 1) "name" 2) "yzw" 3) "age" 4) "20" 5) "salary" 6) "101.2" 127.0.0.1:6379> hscan dict1 10 MATCH n* 1) "0" 2) 1) "name" 2) "yzw" 127.0.0.1:6379> hscan dict1 10 MATCH *a* 1) "0" 2) 1) "name" 2) "yzw" 3) "age" 4) "20" 5) "salary" 6) "101.2" 127.0.0.1:6379> hscan dict1 10 MATCH *a* COUNT 1 1) "0" 2) 1) "name" 2) "yzw" 3) "age" 4) "20" 5) "salary" 6) "101.2"
二.舉例說明list和hash的應用場景,每個至少一個場景,比如:通過list實現秒殺的請求排隊
1.string
- 實現MC的功能
- 對字符串操作
- 緩存應用k/V,計算數量
2.list
- 關註列表、粉絲列表
- 消息隊列
- 最top內容
3.hash
- hash如json,存儲非結構化數據
- 如用戶信息
4.set
- 去重,分組
- 如分數 優秀、良好、合格、不合格
5.zset
- set內有序排序
02 Redis數據結構基礎