Redis数据库 :《Redis实战》(Redis in Action)学习笔记 第三章 Redis命令

写在前面:

第三章将介绍一些在第一第二章里没有出现过的Redis命令,这些命令将有助于在已有示例的基础上构建更为复杂的程序,并学会如何更好的去解决自己遇到的问题。本章将使用客户端与Redis服务器进行简单的互动,并以此来介绍命令的用法。在本章中,我的代码环境均为Python 3.6,为了方便添加注释方便读者理解,我将原文使用控制台运行的代码都写在python文件中运行。

本章内容:

  • 字符串命令、列表命令和集合命令
  • 散列命令和有序集合命令
  • 发布命令与订阅命令
  • 其他命令
3.1 字符串

在之前的文章中说过,Redis的字符串就是一个由字节组成的序列,它们和很多语言里的字符串没有什么明显的不同。在Redis里,字符串可以存储以下3种类型的值:

  • 字节串(byte string)
  • 整数 - Redis的整数取值范围和系统的长整数范围一致,在32/64位系统上,整数就是32/64位有符号整数
  • 浮点数 - 取值范围和精度与IEEE754标准的双精度浮点数相同。

命令用例和描述
INCRINCR key-name ——将键存储的值加上1
DECRDECR key-name ——将键存储的值减去1
INCRBYINCRBY key-name amount ——将键存储的值加上整数amount
DECRBYDECRBY key-name amount ——将键存储的值减去整数amount
INCRBYFLOATINCRBYFLOAT 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还拥有对字节串的其中一部分内容进行读取或者写入的操作。

命令用例和描述
APPENDAPPEND key-name value ——将值value追加到给定键key-name当前存储的值的末尾
GETRANGEGETRANGE key-name start end ——获取一个由偏移量start至偏移量end范围内所有字符组成的字串,包括start和end在内
SETRANGESETRANGE key-name offset value ——将从偏移量start开始的子串设置为给定值
GETBITGETBIT key-name offset ——将字节串看作是二进制位串(bit string),并返回位串中偏移量为offset的二进制位的值
SETBITSETBIT key-name offset value ——将字节串看作是二进制位串(bit string),并将位串中偏移量为offset的二进制位的值设为value
BITCOUNTBITCOUNT key-name [start end] ——统计二进制位串里面值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计
BITOPBITOP 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'))
3.2 列表

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

命令用例和描述
RPUSHRPUSH key-name value [value ...] ——将一个或多个值推入列表的右端
LPUSHLPUSH key-name value [value ...] ——将一个或多个值推入列表的左端
RPOP RPOP key-name ——移除并返回列表最右端的元素
LPOPLPOP key-name ——移除并返回列表最左端的元素
LINDEXLINDEX key-name offset ——返回列表中偏移量为offset的元素
LRANGELRANGE key-name start end ——返回列表从start偏移量到end偏移量范围内的所有元素,包括start和end
LTRIMLTRIM 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)执行命令的客户端知道有其他客户端给列表添加元素为止:

命令用例和描述
BLPOPBLPOP key-name [key-name ...] timeout ——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
BRPOPBRPOP key-name [key-name ...] timeout ——从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
RPOPLPUSHRPOPLPUSH source-key dest-key ——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key的最左端,并向用户返回这个元素
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout ——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现

来看一些例子:

未完待续

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值