第三章
Redis命令
字符串
可以存储三种类型的值
字节串
整数
浮点数
用户可以通过给定一个任意的数值 对存储着整数或者浮点数的字符串执行自增(increment) 或者自减(decrement)
如下图所示 自增自减命令
如果用户对一个不存在的键或者一个保存了空串的键执行自增或者自减操作 那么Redis在执行操作时会将这个键的值当做0来处理
如果用户尝试对一个值无法被解释为整数或者浮点数的字符串键执行自增或者自减的操作时 那么Redis将向用户返回一个错误
1 | import redis |
Redis 对于处理子串和二进制位的命令
在使用SERRANGE 或者 SETBIT命令对字符串进行写入的时候 如果字符串当前的长度不能满足写入的要求
那么Redis会自动地使用空字节(null) 来将字符串扩展至所需的长度 然后才执行写入或者更新操作
在使用GETRANGE读取字符串的时候 超出字符串末尾的数据会被视为空串
而在使用GETBIT读取二进制位串的时候 超出字符串末尾的二进制会被视为0
1 | conn = redis.Redis() |
对超过字符串长度的二进制位进行设置时 超过的部分会别填充为空字节
redis 存储的二进制位是按照偏移量从高到低排列的
setbit key-name offset value是将字符串看作是二进制串 并将位串偏移的二进制位设置为value
1 | 'another-key', 2,1) conn.setbit( |
先将第二个二进制位以及第七个二进制的值设置为1 那么这个值会是 ‘!’ 是编码为33的字符
因为默认的会用0填充 然后通过设置指定位的值为1 来实现
列表
列表还可以用来存储任务信息、最近浏览过的文章 或者常用联系人信息
1 | 'list-key', 'last') conn.rpush( |
他可以在 timeout秒之内阻塞并等待可弹出的元素出现
1 | 'list', 'item1') conn.rpush( |
blpop 可以传入多个 每次将第一个非空的元素弹出
1 | 'list', 'list2', 1) conn.brpoplpush( |
对于阻塞弹出命令和弹出并推入命令 最常见的用例就是 消息传递 和任务队列
列表的一个优点在于他可以包含多个字符串值 这使得用户可以将元素集中在同一个地方
集合
竟然还有 SPOP 随机取出集合里的一个元素
并集交集等操作
1 | 'sky1', 'a', 'b', 'c', 'd') conn.sadd( |
散列
1 | # 可以一次插入多个 插入的是字典的形式 |
散列一些高级命令
如果存储的量特别大 可以先用 HKEYS 取出散列包含的所有键 然后再使用HGET 一个接一个的取出
有序集合
可以根据分值大小有序的获取 (fetch) 或者扫描(scan) 成员和分值的命令
第一章都写过了这里就不写了
交集的分数和
1 | 'zset-1', {'a': 1, 'b': 2, 'c': 3}) conn.zadd( |
取两个集合交集最小的与其他的元素的排序
1 | 'zset-u', ['zset-1', 'zset-2'], aggregate='min') conn.zunionstore( |
发布与订阅
1 | SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道 |
发布订阅实例
1 | #!/usr/bin/python |
在开始订阅一个频道的时候 客户端会收到一个订阅反馈的消息
退订的时候也会收到一个反馈消息
然后就是其他的发送的消息了
有消息积压而消耗过多内存问题 可靠的消息传递问题
这样的有可能会丢失一小部分数据的风险
需要更多的解决办法
其他命令
排序 SORT
1 | conn.rpush('sort-input', 23, 15, 110, 7) |
事务
Redis 有5个命令可以让用户在不被打断的情况下对多个键执行操作
WATCH MULTI EXEC UNWATCH DISCARD
被以上命令包围的所有命令会一个接一个的执行
要在Redis里执行命令 需要先执行 MULTI 命令 然后输入要执行的命令 最后执行 EXEC命令
Redis事务在 python客户端上面是由流水线(pipline) 实现的 对连接对象调用 pipline()
方法将创建一个事务
没有事务
1 | def notrans(): |
使用事务
1 | def trans(): |
键的过期时间
使用过期时间自动删除
1 | >> conn.set('key', 'value') |