第三章将介绍一些在第一第二章里没有出现过的Redis命令,这些命令将有助于在已有示例的基础上构建更为复杂的程序,并学会如何更好的去解决自己遇到的问题。本章将使用客户端与Redis服务器进行简单的互动,并以此来介绍命令的用法。在本章中,我的代码环境均为Python 3.6,为了方便添加注释方便读者理解,我将原文使用控制台运行的代码都写在python文件中运行。
在之前的文章中说过,Redis的字符串就是一个由字节组成的序列,它们和很多语言里的字符串没有什么明显的不同。在Redis里,字符串可以存储以下3种类型的值:
命令 | 用例和描述 |
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或以上的版本可用 |
来看一些例子:
import redis
conn = redis.Redis()
# None, 因为之前没有定义过key
print(conn.get('key'))
# 1, 因为在对不存在的键或者保存了空串的键执行自增或者自减操作时,会默认将它作为0来处理, 0+1 = 1
print(conn.incr('key'))
# 16
print(conn.incr('key', 15))
# 11
print(conn.decr('key', 5))
# 11
print(conn.get('key'))
# True, 成功将'key'对应的字符串设置为字符串'13'
print(conn.set('key', '13'))
# 14, 自动将'13'视作整数13,之后执行自增
print(conn.incr('key'))
除此之外,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 value ——将字节串看作是二进制位串(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)在内的任意一种按位运算操作,并将计算出的结果保存在dest-key键里面 |
在使用SETRANGE或者SETBIT命令对字符串进行写入的时候,如果字符串当前的长度不能满足写入的要求,Redis会自动的使用空字节(null)来将字符串扩展至所需的长度,然后才执行写入或者更新操作。而在使用GETRANGE时,超出长度的数据会被视作空串,在使用GETBIT时,超出长度的二进制位会被视为0。
来看一些例子:
import redis
conn = redis.Redis()
# 6, APPEND命令执行后会返回字符串当前长度
print(conn.append('new-string-key', 'hello '))
# 12
print(conn.append('new-string-key', 'world!'))
# "lo wo",获取字符串的第三位到第七位
print(conn.getrange('new-string-key', 3, 7))
# 12, SETRANGE命令执行后会返回字符串当前长度
print(conn.setrange('new-string-key', 0, 'H'))
# 12
print(conn.setrange('new-string-key', 6, 'W'))
# Hello World!
print(conn.get('new-string-key'))
# 25
print(conn.setrange('new-string-key', 11, ', how are you?'))
# Hello World, how are you?,前面执行的SETRANGE命令移除了字符串末尾的感叹号,并且添加了更多的字符
print(conn.get('new-string-key'))
# 0, SETBIT命令会返回二进制位被设置之前的值,此时 'another-key' 的二进制值为01
print(conn.setbit('another-key', 2, 1))
# 0, SETBIT命令会返回二进制位被设置之前的值,此时 'another-key' 的二进制值为0100001
print(conn.setbit('another-key', 7, 1))
# !, 0100001转化为十进制是33,编码为33的字符是'!'
print(conn.get('new-string-key'))
Redis的列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。初次之外,列表还可以用来存储任务信息、最近浏览过的文章或者常用联系人信息。
命令 | 用例和描述 |
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的元素也会被保留 |
来看一些例子:
import redis
conn = redis.Redis()
# 1, 推入命令执行后会返回字符串当前长度
print(conn.rpush('list-key', 'last'))
# 2
print(conn.lpush('list-key', 'first'))
# 3
print(conn.rpush('list-key', 'new last'))
# ['first', 'last', 'new last'], 获取下标为0到最后一个的元素,也即获取全部元素
print(conn.lrange('list-key', 0, -1))
# 'first'
print(conn.lpop('list-key'))
# 'last'
print(conn.lpop('list-key'))
# ['new last']
print(conn.lrange('list-key', 0, -1))
# 4
print(conn.rpush('list-key', 'a', 'b', 'c'))
# ['new last', 'a', 'b', 'c']
print(conn.lrange('list-key', 0, -1))
# True, 返回的是命令执行成功与否
print(conn.ltrim('list-key', 2, -1))
# ['b', 'c']
print(conn.lrange('list-key', 0, -1))
有几个列表命令可以将元素从一个列表移动到另一个列表,或者阻塞(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秒之内阻塞并等待可弹出的元素出现 |
来看一些例子:
未完待续