本篇将介绍一些Redis命令,学习这些命令有助于建立更复杂的程序。

3.1 字符串

Redis的字符串就是一个由字节组成的序列,在Redis里面,字符串可以存储一下3种类型的值。

  • 字符串(byte string)
  • 整数
  • 浮点数

对存储着整数或者浮点数的字符串执行自增(increment)或者自减(decrement)操作,有时,Redis还会将整数转换成浮点数。整数的取值范围和系统的长整数(long integer)的取值范围相同(在32系统上,整数就是32为有符号整数,在64位上,整数为64位有符号整数),而浮点数的取值范围和精度于IEEE 754标准的双精度(double)相同。

Redis字符串执行自增和自减操作的命令。

命令

用例和描述

INCR

INCR key-name——将键存储的值加1

DECR

DECR key-name——将键存储的值减1

INCRBY

INCRBY key-name amount——将键存储的值加上整数amount

DECRBY

DECRBY key-name amount——将键存储的值减去整数amount

INCRBYFLOAT

INCRBYFLOAT key-name amount——将键存储的值加上浮点数amount,这个命令在Redis 2.6或以上的版本可用

###代码清单1 展示了Redis的INCR操作和DECR操作

>>> conn = redis.Redis()
>>> conn.get('key') #尝试获取一个不存在的键将得到一个None值,终端不会显示这个值。
>>> conn.incr('key')
1
>>> conn.incr('key', 15)
16
>>> conn.decr('key', 5)
11
>>> conn.get('key')
'11'
>>> conn.set('key', '13')
True
>>> conn.incr('key')
14

除了自增操作和自减操作之外,Redis还拥有对字符串的其中一部分内容进行读取或者写入的操作(这些操作也可以用于整数或浮点数,但不常见)。

命令

用例和描述

APPEND

APPEND key-name value——将值value追加到给定键key-name当前存储定的值的末尾

GETRANGE

GETRANGE key-name start end——获取一个由偏移量start至偏移量end范围内所以字符组成的子串,包括start和end在内

SETRANGE

SETRANGE key-name offset value——将从start偏移量开始的子串设置为给定值

GETBIT

GETBIT key-name offset——将字节串看作是二进制位串(bit string),并返回位串中偏移量位offset的二进制位的值

SETBIT

SETBIT key-name offset——将字节串看作是二进制位串(bit string),并将位串中偏移量位offset的二进制位的值设置为value

BITCOUNT

BITCOUNT key-name [start end]——统计二进制位串里面值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计

BITOP

BITOP operation dest-key key-name [key-name ...]——对一个或多个二进制位串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)在内的任意一种按位运算操作(bitwise operation),并将计算得出的结果保存在dest-key键里面

GETRANGE和SUBSTR:Redis现在的GETRANGE名是由以前的SUBSTR命令改名而来的。所以Python客户端至今仍然可以使用substr()方法来获取子串。

###代码清单2 展示了Redis的子串操作和二进制位操作

>>> conn.append('new-string-key', 'hello ') #将字符串'hello '追加到目前不存在的'new-string-key'键里
6L #APPEND命令执行之后会返回字符串当前对长度
>>> conn.append('new-string-key', 'world!')
12L
>>> conn.sbustr('new-string-key', 3, 7) #Redis的索引从0为开始,在进行范围访问时,范围的终点(endpoint)默认也包含在这个范围之内
'lo wo'
>>> conn.setrange('new-string-key', 0, 'H') #对字符串执行范围设置操作
12 #SETRANGE命令会在执行之后同样会返回字符串的当前总长度
>>> conn.conn.setrange('new-string-key', 6, 'W')
12
>>> conn.get('new-string-key') #查看字符串当前的值
'Hello World!' #前面执行的两个SETRANGE命令成功地将字符h和w从小写改为了大写
>>> conn.setrange('new-string-key', 11, ', how are you?') #SETRANGE命令既可以用于替换字符串里已有的内容,又可以用于增长字符串
25
>>> conn.get('new-string-key')
'Hello World, how are you?' #前面执行的SETRANGE命令移除了字符串末尾的感叹号,并将更多字符追加到字符串的末尾。
>>> conn.setbit('another-key', 2, 1)  #对超出字符串长度的二进制位进行设置时,超出的部分会被填充为空字节
0 #SETBIT命令会返回二进制位被设置之前的值
>>> conn,setbit('another-key', 7, 1) 
0
>>> conn.get('another-key') #在对Redis存储对二进制位进行解释(interpret)时,请记住Redis存储对二进制位时按照偏移量从高到低排列对。
'!'

3.2 列表

列表允许用户从序列的两端推入或弹出元素,获取列表元素,以及各种常见的列表操作,除此之外,列表还可以用来存储任务信息、最近浏览过的文件或者常用联系人信息。

命令

用例和描述

RPUSH

RPUSH key-name value [value ...]——将一个或多个值推入列表的右端

LPUSH

LPUSH key-name value [value ...]——将一个或多个值推入列表的左端

RPOP

RPOP key-name——移除并返回列表最右端的元素

LPOP

LPOP key-name——移除并返回列表最左端的元素

LINDEX

LINDEX key-name offset——返回列表中偏移量为offset的元素

LRANGE

LRANGE key-name start end——返回列表从start偏移量到end偏移量范围内的所以元素,其中偏移量为start和偏移量为end的元素也会包含在被返回的元素之内

LTRIM

LTRIM key-name start end——对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会被保留

###代码清单3 Redis列表的推入操作和弹出操作

>>> conn.rpush('list-key', 'last')
1L #在想列表推入元素时,推入操作执行完毕之后会返回列表当前的长度
>>> conn.lpush('list-key', 'first')
2L
>>> conn.rpush('list-key', 'new last')
3L
>>> conn.lrange('list-key', 0, -1)
['first', 'last', 'new last']
>>> conn.lpop('list-key')
'first'
>>> conn.lpop('list-key')
'last'
>>> conn,lrange('list-key', 0, -1)
['new last']
>>> conn.rpush('list-key', 'a', 'b', 'c')
4L
>>> conn.lrange('list-key', 0, -1)
['new last', 'a', 'b', 'c']
>>> conn.ltrim('list-key', 2, -1)
True
>>> conn.lrange('list-key', 0, -1)
['b', 'c']

有几个列表命令将元素从一个列表移动到另一个列表,或者阻塞(block)执行命令的客户端直到有其他客户端给列表添加元素为止。

命令

用例和描述

BLPOP

BLPOP key-name [key-name ...] timeout——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现

BRPOP

BRPOP key-name [key-name ...] timeout——从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现

RPOPLPUSH

RPOPLPUSH source-key dest-key——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素

BRPOPLPUSH

BRPOPLPUSH source-key dest-key timeout——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现

###代码清单4 Redis列表的阻塞弹出命令以及元素移动命令

>>> conn.rpush('list', 'item1')
1
>>> conn.rpush('list', 'item2')
2
>>> conn.rpush('list2', 'item3')
1
>>> conn.brpoplpush('list2', 'list', 1)
'item3'
>>> conn.brpoplpush('list2', 'list', 1)
>>> conn.lrange('list', 0, -1)
['item3', 'item1', 'item2']
>>> conn.brpoplpush('list', 'list2', 1)
'item2'
>>> conn.blpop(['list', 'list2'], 1)
('list', 'item3')
>>> conn.blpop(['list', 'list2'], 1)
('list', 'item1')
>>> conn.blpop(['list', 'list2'], 1)
('list2', 'item2')
>>> conn.blpop(['list', 'list2'], 1)

3.3 集合

Redis的集合以无序的方式来存储多个各不相同的元素,用户可以快读地对集合执行添加元素操纵、移除元素操作以及检查一个元素是否存在于集合里面。

一些常用的集合命令

命令

用例和描述

SADD

SADD key-name item [item ...]——将一个或多个元素添加到集合里面,并返回被添加元素当中原本并不存在与集合里面的元素数量

SREM

SREM key-name item [item ...]——从集合里面移除一个或多个元素,并返回被移除元素的数量

SISMEMBER

SISMEMBER key-name item——检查元素item是否存在于集合key-name里

SCARD

SCARD key-name——返回集合包含的元素的数量

SMEMBERS

SMEMBERS key-name——返回集合包含的所有元素

SRANDMEMBER

SRANDMEMBER key-name [count]——从集合里面随机地返回一个或多个元素。当count为正数是,命令返回的随机元素不会重复;当count为负数时,命令返回的随机元素可能会出现重复

SPOP

SPOP key-name——随机地移除集合中的一个元素,并返回被移除的元素

SMOVE

SMOVE source-key dest-key item——如果集合source-key包含元素item,那么从集合suorce-key里面移除元素item,并将元素item添加到集合dest-key中;如果item被成功移除,那么命令返回1,否则返回0