【redis 学习系列】API的理解与使用(一)

时间:2022-02-06 13:46:27

Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构

1、预备知识

1.1 全局命令

Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令。

(1)查看所有的键

 keys *

【redis 学习系列】API的理解与使用(一)

(2)键总数

 dbsize

【redis 学习系列】API的理解与使用(一)

dbsize会返回当前数据库中键的总和,例如当前数据库中有4个键即hello java python mylist,所以测试结果为4。注意,dbsize在计算键总数时不会遍历所有的键,而是直接获取

Redis内置的键总和的变量,所以此命令的时间复杂度为O(1)。然而命令keys *会遍历所有的键,所以它的时间复杂度为O(n)。当Redis保存了大量的键时,线上环境禁止使用命令keys * 。

(3)检查键是否存在

 exists key

如果键存在则返回1,不存在则返回0。

【redis 学习系列】API的理解与使用(一)

(4)删除键

 del key [key1 ...]

del是一个通用命令,无论键值是何种数据结构,del命令都可以将其删除,例如删除键值类型为字符串类型的java以及类型为列表类型的mylist。

【redis 学习系列】API的理解与使用(一)

返回结果为成功删除键的个数,假设删除一个不存在的键,就会返回0。同时del命令支持同时删除多个键。

【redis 学习系列】API的理解与使用(一)

(5)键过期

 expire key seconds

Redis支持对键添加过期时间,当超过过期时间后,将会自动删除键,例如为键hello设置了10秒的过期时间。

【redis 学习系列】API的理解与使用(一)

这里的ttl命令会返回键的剩余过期时间,它有3种返回值:

  • 大于或等于0的整数:键剩余的过期时间
  • -1:键没有设置过期时间
  • -2:键不存在

(6)键的数据类型

 type key

例如键hello是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list。如果键不存在,则返回none

【redis 学习系列】API的理解与使用(一)

1.2 数据结构及内部编码

【redis 学习系列】API的理解与使用(一)

在终端可以使用object encoding命令查询内部编码。

【redis 学习系列】API的理解与使用(一)

2、字符串

字符串类型是Redis最基础的数据结构,首先键都是字符串类型,而其他几种数据结构都是在字符串类型的基础上构建的,所以字符串类型能为其它4种数据结构的学习奠定基础。字符串的类型可以使字符串(简单字符串、复杂字符串(例如json以及XML))、数字(整型、浮点数)、二进制(图片、音视频)。但是占用的空间最大不能超过512M。

2.1 命令

2.1.1 常用命令

(1)设置值

 set key value [ex seconds] [px milliseconds] [nx|xx]

上述命令的常用选项:

  • ex seconds:为键设置秒级过期时间。
  • px milliseconds:为键设置毫秒级过期时间。
  • nx:键必须不存在,才能设置成功,用于添加。
  • xx:与nx相反,键必须存在,才能设置成功,用于更新。

除了set选项,Redis还提供了setex和setnx两个命令,他们的作用与ex和nx选项是一样的。

 setex key seconds value
setnx key value

【redis 学习系列】API的理解与使用(一)

setnx和setxx在实际的场景有何应用呢?以setnx命令为例,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性,只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案。

(2)获取值

 get key

如果要获取的值不存在,则返回nil(空)

【redis 学习系列】API的理解与使用(一)

(3)批量设置值

 mset key value [key value ...]

(4)批量获取值

 mget key [key ...]

如果有些键不存在,则它的值为nil(空),结果是按照传入键的顺序返回的:

【redis 学习系列】API的理解与使用(一)

关于使用n次get获取n条结果与使用1次mget获取n条结果的比较:

使用get命令:n次get时间 = n次网络时间+n次命令时间

使用mget命令:n次get时间 = 1次网络时间+n次命令时间

学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批量操作所发送的命令数不是无节制的,如果数量过多可能会造成Redis拥塞或者网络拥塞,此时可以用多次的批量操完成。

(5)计数

 incr key

incr命令用于对值做自增操作,返回的结果分为3种情况:

  • 值不是整数,返回错误
  • 值是整数,返回自增结果
  • 键不存在,按照值为0自增,返回结果为1

【redis 学习系列】API的理解与使用(一)

除了incr命令,Redis还提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数)。

2.1.1 不常用命令

(1)追加值

 append key value

append可以向字符串尾部追加值。

【redis 学习系列】API的理解与使用(一)

(2)字符串长度

 strlen key

需要注意的是中文占两个字节。命令返回的是当前value所占的字节数。

【redis 学习系列】API的理解与使用(一)

(3)设置并返回原值

 getset key value

getset和set一样会设置值,但是不同的是,它同时会返回原来的值。

【redis 学习系列】API的理解与使用(一)

(4)设置指定位置的字符

 setrange key offeset value

【redis 学习系列】API的理解与使用(一)

(5)获取部分字符串

getrange key start end

start和end分别是开始和结束的偏移量,偏移量是从0开始计算。例如下述操作获取了值bast的前两个字符。

【redis 学习系列】API的理解与使用(一)

下表是字符串类型命令的时间复杂度。

【redis 学习系列】API的理解与使用(一)

2.2 内部编码

字符串类型的内部编码有3种:

  • int:8个字节的长整型
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串

Redis会根据当前值的类型和长度来决定使用哪种内部编码实现。

2.3 典型使用场景

2.3.1 缓存功能

2.3.2 计数

2.3.3 共享Session

2.3.4 限速