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标准的双精度浮点数相同。

命令 用例和描述
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'))

3.2 列表

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秒之内阻塞并等待可弹出的元素出现

来看一些例子:


猜你喜欢

转载自blog.csdn.net/u014628771/article/details/80865098