一.客户端命令行参数

  • 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模式好处在于不会长时间阻塞redis而导致其他客户端命令请求被阻塞
[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数据结构基础的更多相关文章

  1. 通俗易懂的Redis数据结构基础教程

    Redis有5个基本数据结构,string.list.hash.set和zset.它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了. ...

  2. Redis 系列(02)数据结构

    目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...

  3. 探索Redis设计与实现1:Redis 的基础数据结构概览

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. Redis数据结构底层知识总结

    Redis数据结构底层总结 本篇文章是基于作者黄建宏写的书Redis设计与实现而做的笔记 数据结构与对象 Redis中数据结构的底层实现包括以下对象: 对象 解释 简单动态字符串 字符串的底层实现 链 ...

  5. Redis数据结构之intset

    本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST ...

  6. Redis 数据结构之dict(2)

    本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis 数据结构之dict>,我们对dict的结构有了大致的印象.此篇文章对dict是如何维护数据结构的做个详细的理解. 老规 ...

  7. Redis 数据结构之dict

    上篇文章<Redis数据结构概述>中,了解了常用数据结构.我们知道Redis以高效的方式实现了多种数据结构,因此把Redis看做为数据结构服务器也未尝不可.研究Redis的数据结构和正确. ...

  8. redis学习(二) redis数据结构介绍以及常用命令

    redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: ...

  9. Redis 宝典 | 基础、高级特性与性能调优

    转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长.     作者:kelgon ...

随机推荐

  1. python学习08排序算法举例

    '''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...

  2. Qt5 escape spaces in path

    There are two possible ways. You can either use escaped quotes (inserting the string between quotes) ...

  3. Spring Cloud sleuth with zipkin over RabbitMQ教程

    文章目录 Spring Cloud sleuth with zipkin over RabbitMQ demo zipkin server的搭建(基于mysql和rabbitMQ) 客户端环境的依赖 ...

  4. js 之 箭头函数 (未学完)

    js之箭头函数表达式 箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或 new.target.这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不 ...

  5. codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质

    E. Anniversary time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  6. 关于RMQ问题的四种解法

    什么是RMQ问题:     RMQ (Range Minimum/Maximum Query):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i, ...

  7. 题解 CF160B 【Unlucky Ticket】

    本文为UserUnknown原创 思路 这道题应该怎么做? 可以把输入的数字逐位拆分后存入数组,就像这样存进去: int a[N],b[N] tmp=n; k=1; while(--tmp){ a[k ...

  8. 似乎是最实用的hashtable知识总结

    哈希表:将对象转换为索引,然后存储在数组中. 定义注意点: 对象:就是面向对象中的对象,可以为任何东西.整数.浮点数.日期.字符串.类. 转换:通过hash函数来完成,hash函数是hash表的核心与 ...

  9. E. Yet Another Task with Queens(分类思想)

    \(\color{Red}{描述}\) \(在n*n的棋盘上有m个K皇后,每个皇后可能被来自8个方向的其他皇后攻击\) \(每个皇后只可能被(0-8)只皇后攻击,分别求出被(0-8)只皇后攻击的皇后数 ...

  10. POJ2376Cleaning Shifts(区间覆盖贪心)

    应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...