1.获得符合规则的键名列表
keys pattern
keys(redis命令都是)不区分大小写,pattern支持glob风格通配符格式(注意不是正则),具体规则如下表所示。
为了演示KEYS命令,首先我们得给Redis加点数据。使用SET命令(会在后面介绍)建立一个名为bar的键:
redis>SET bar 1 OK
然后使用KEYS *就能获得Redis中所有的键了。
redis> KEYS * 1) "bar"
注意
(1)KEYS命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境中使用。
(2)Redis命令不区分大小写。
(3)pattern本身是字符串,带不带””都一样,建议不带,除非value包含空格则一定要带。
2.判断一个键是否存在
EXISTS key
如果键存在则返回整数类型1,否则返回0(前面讲到过返回值有5种,状态回复,错误回复,整数回复,字符串回复,多行字符串回复)。如:
redis>EXISTS bar (integer) 1 redis>EXISTS noexists (integer)0
3.删除键
DEL key [key …]
可以删除一个或多个键,返回值是删除的键的个数。如:
redis>DEL bar (integer) 1 redis>DEL bar (integer) 0
技巧:
DEL 命令的参数 不支持通配符,但我们可以结合Linux 的 管道和xargs 命令自己实现删除所有符合规则的键。比如要删除所有以“user:”开头的键,就可以执行redis-cli KEYS "user:*" | xargs redis-cli DEL。另外由于DEL 命令支持多个键作为参数, 所以还可以执行redis-cli DEL 'redis-cli KEYS"user:*"'来达到同样的效果,但是性能更好。
4.获得键值的数据类型
TYPE key
TYPE命令用来获得键值的数据类型,返回值可能是 string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。例如:
redis>SET foo 1 OK redis>TYPE foo string redis>LPUSH bar 1 (integer) 1 redis>TYPE bar list
LPUSH命令的作用是向指定的列表类型键中增加一个元素,如果键不存在则创建它。
3.2 字符串类型
3.2.1 介绍
字符串类型是Redis中最基本的数据类型,它 能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB①。
注释:①在Redis 3.0版本中可能会放宽这一限制,但无论如何,考虑到Redis的数据是使用内存存储的,512MB的限制已经非常宽松了。
字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。
3.2.2 命令
1.1 赋值与取值
SET key value GET key
SET和GET是Redis中最简单的两个命令,它们实现的功能和编程语言中的读写变量相似,如welcome="hello"在Redis中是这样表示的:
redis>SET welcome hello OK
想要读取键值则更简单:
redis>GET welcome "hello"
当键不存在时会返回空结果(nil)。
1.2 同时获得/设置多个键值
MGET key [key …] MSET key value [key value …]
MGET/MSET与GET/SET相似,不过MGET/MSET可以同时获得/设置多个键的键值。例如:
redis>MSET key1 v1 key2 v2 key3 v3 OK redis>GET key2 "v2" redis>MGET key1 key3 1) "v1" 2) "v3"
2.递增数字
2.1 INCR key
前面说过字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,Redis提供了一个实用的命令INCR,其作用是让当前 键值递增,并返回递增后的值,用法为:
redis>INCR num (integer) 1 redis>INCR num (integer) 2
当要操作的键 不存在时会默认键值为0,所以第一次递增后的结果是1。当键值不是整数时Redis会提示错误:
redis>SET foo lorem OK redis>INCR foo (error) ERR value is not an integer or out of range
2.2 增加指定的整数
INCRBY key increment
INCRBY命令与INCR命令基本一样,只不过前者可以通过increment参数指定一次增加的数值,如:
redis>INCRBY bar 2 (integer) 2 redis>INCRBY bar 3 (integer) 5
3 减少指定的整数
DECR key DECRBY key decrement
DECR命令与INCR命令用法相同,只不过是让键值递减,例如:
redis>DECR bar (integer)4 DECRBY key 5 相当于INCRBY key -5。
4 增加指定浮点数
INCRBYFLOAT key increment
INCRBYFLOAT 命令类似INCRBY命令,差别是前者可以递增一个双精度浮点数,如:
redis>INCRBYFLOAT bar 2.7 "6.7" redis>INCRBYFLOAT bar 5E+4 "50006.69999999999999929"
包括INCR在内的所有Redis命令都是原子操作(atomic operation) ,无论多少个客户端同时连接,都不会出现线程问题。
5.向尾部追加值
APPEND key value
APPEND作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相
当于SET key value。 返回值是追加后字符串的总长度。例如:
redis>SET key hello OK redis>APPEND key " world!" (integer) 12
APPEND命令的第二个参数加了双引号,原因是该参数包含空格。
6. 获取字符串长度
STRLEN key
STRLEN命令返回键值的长度( 单位:字节),如果键不存在则返回0。例如:
redis>STRLEN key (integer)12 redis>SET key 你好 OK redis>STRLEN key (integer)6
提示:
Redis对于键的命名并没有强制的要求,但比较好的实践是用“对象类型:对象ID:对象属性”来命名一个键,如使用键user:1:friends来存储ID为1的用户的好友列表。对于多个单词则推荐使用“.”分隔,一方面是沿用以前的习惯(Redis以前版本的键名不能包含空格等特殊字符),另一方面是在redis-cli中容易输入,无需使用双引号包裹。
7.位操作
GETBIT key offset SETBIT key offset value BITCOUNT key [start] [end] BITOP operation destkey key [key …]
一个字节由8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。为了演示,我们首先将foo键赋值为bar:
redis>SET foo bar OK
bar的3个字母对应的ASCII码分别为98、97和114,转换成二进制后分别为1100010、1100001和1110010,所以foo键中的二进制位结构如下图所示。
7.1 getbit
GETBIT命令可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始:
redis>GETBIT foo 0 (integer) 0 redis>GETBIT foo 6 (integer) 1
如果需要获取的二进制位的索引超出了键值的二进制位的实际长度则默认位值是0:
redis>GETBIT foo 100000
(integer) 0
7.2 setbit
SETBIT 命令可以 设置字符串类型键指定位置的二进制位的值,返回值是该位置的 旧值。
如我们要将foo键值设置为aar,可以通过位操作将foo键的二进制位的索引第6位设为0,第7位设为1:
redis>SETBIT foo 6 0 (integer) 1 redis>SETBIT foo 7 1 (integer) 0 redis>GET foo "aar"
如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位设置为0,同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0:
redis>SETBIT nofoo 10 1 (integer) 0 redis>GETBIT nofoo 5 (integer) 0
7.3 bitcount
BITCOUNT命令可以获得字符串类型键中值是1的二进制位个数,例如:
redis>BITCOUNT foo (integer)10
可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节(即"aa"):
redis>BITCOUNT foo 0 1 (integer)6
7.4 bitop
BITOP命令可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键
中。BITOP命令支持的运算操作有AND、OR、XOR 和NOT。如我们可以对bar和aar进行OR运
算:
redis>SET foo1 bar OK redis>SET foo2 aar OK redis>BITOP OR res foo1 foo2 (integer) 3 redis>GET res "car"
利用位操作命令可以非常紧凑地存储布尔值。比如某网站的每个用户都有一个递增的整数ID,如果使用一个字符串类型键配合位操作来记录每个用户的性别(用户ID作为索引,二进制位值1和0表示男性和女性),那么记录100万个用户的性别只需占用100 KB多的空间,而且由于GETBIT和SETBIT的时间复杂度都是0(1),所以读取二进制位值性能很高。