Bootstrap

第二部分:Redis数据结构

一、Redis 基本数据结构

Redis 提供了一些数据结构供我们往 Redis 中存取数据,最常用的的有 5 种, 字符串(String)、哈希(Hash)、列表(list)、集合(set)、有序集合(ZSET)。

(一)字符串(String)

字符串类型是 Redis 最基础的数据结构。首先键都是字符串类型,而且其他 几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数 据结构的学习奠定基础。字符串类型的值实际可以是字符串(简单的字符串、复 杂的字符串(例如 JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、 视频),但是值最大不能超过 512MB。

1、操作命令

(1)set 设置值

set key value [ex seconds] [px milliseconds] [nxlxx]

例如: set hello redis

 设置键为 hello,值为 redis 的键值对,返回结果为 OK 代表设置成功。

set 命令有几个选项:

ex seconds:为键设置秒级过期时间。

px milliseconds:为键设置毫秒级过期时间。

nx:键必须不存在,才可以设置成功,用于添加。

xx:与 nx 相反,键必须存在,才可以设置成功,用于更新。

 从执行效果上看,ex 参数和 expire 命令基本一样。还有一个需要特别注意的 地方是如果一个字符串已经设置了过期时间,然后你调用了 set 方法修改了它,它 的过期时间会消失。

而 nx 和 xx 执行效果如下

除了 set 选项,Redis 还提供了 setex 和 setnx 两个命令:

setex key seconds value

setnx key value

setex 和 setnx 的作用和 ex 和 nx 选项是一样的。也就是,setex 为键设置秒 级过期时间,setnx 设置时键必须不存在,才可以设置成功。

setex 示例 

 setnx 示例

因为键 foo-ex 已存在,所以 setnx 失败,返回结果为 0,键 foo-ex2 不存在,所 以 setnx 成功,返回结果为 1。

有什么应用场景吗?以 setnx 命令为例子,由于 Redis 的单线程命令处理机制, 如果有多个客户端同时执行 setnx key value,根据 setnx 的特性只有一个客户端 能设置成功,setnx 可以作为分布式锁的一种实现方案。当然分布式锁没有不是 只有一个命令就 OK 了,其中还有很多的东西要注意。

(2)get 获取值

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

 

(3)mset 批量设置值

通过 mset 命令一次性设置 4 个键值

 (4)mget 批量获取值

 批量获取了键 a、b、c、d 的值

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

批量操作命令可以有效提高效率,假如没有 mget 这样的命令,要执行 n 次 get 命令具体耗时如下:

n 次 get 时间=n 次网络时间+n 次命令时间

使用 mget 命令后,要执行 n 次 get 命令操作具体耗时如下:

n 次 get 时间=1 次网络时间+n 次命令时间

Redis 可以支撑每秒数万的读写操作,但是这指的是 Redis 服务端的处理能 力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为 1 毫秒,命令时间为 0.1 毫秒(按照每秒处理 1 万条命令算),那么执行 1000 次 get 命令需要 1.1 秒(1000*1+1000*0.1=1100ms),1 次 mget 命令的需要 0.101 秒 (1*1+1000*0.1=101ms)

(5)Incr 数字运算

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

值不是整数,返回错误。

值是整数,返回自增后的结果。

键不存在,按照值为 0 自增,返回结果为 1

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

(6)strlen 字符串长度

返回字符串长度

 注意:每个中文占 3 个字节

(7)getset 设置并返回原值

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

(8)setrange 设置指定位置的字符

下标从 0开始

(9)getrange 截取字符串 

getrange 截取字符串中的一部分,形成一个子串,需要指明开始和结束的 偏移量,截取的范围是个闭区间

2、命令的时间复杂度

字符串这些命令中,除了 del 、mset、 mget 支持多个键的批量操作,时间 复杂度和键的个数相关,为 O(n),getrange 和字符串长度相关,也是 O(n),其余 的命令基本上都是 O(1)的时间复杂度,在速度上还是非常快的。

3、使用场景 

缓存功能

Redis 作为缓存层,MySQL 作为存储层,绝大部分请求的数据都是从 Redis 中获取。由于 Redis 具有支撑高并

;