# Redis 简介
Redis 是目前使用最广泛的缓存中间件,相比 Memcached,Redis 支持更多的数据结构和更丰富的数据操作,而且 Redis 还有着丰富而成熟的集群方案和使用场景。
Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 5 种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。
为了满足高性能,Redis 采用内存(in-memory)数据集,根据使用场景,可以采用两种不同方式来实现数据持久化:
- 每隔一段时间转存储数据集到磁盘。
- 追加每条命令到日志中。
持久化也可以被禁用,如果你只是需要一个功能丰富的内存缓存。
# 1. 数据模型
Redis 数据模型不仅仅与关系数据库管理系统(RDBMS)不同,也不同于任何简单的 NoSQL 键-值数据存储系统。
Redis 数据类型类似于编程语言的基础数据类型,因此开发人员感觉很自然,每个数据类型都支持适『用于其类型的操作』,以最大限度发挥每种数据类型的特性。
受支持的数据类型包括:
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
# 2. 关键优势
Redis 的优势包括它的速度、对富数据类型的支持、操作的原子性,以及通用性:
性能极高,它每秒可执行约 10,000 个 SET 以及约 100,000 个 GET 操作;
丰富的数据类型,Redis 对大多数开发人员已知的多数数据类型提供了原生支持,这使得各种问题得以轻松解决;
原子性,因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器器,获取相同的更新值;
丰富的特性,Redis 是一个多效用工具,有非常多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据据(比如 Web 会话)等。
# 3. Redis 的『快』的原因:
是对内存的较为简单的数据进行读写操作。
Redis 是 C 语言实现的,它的底层实现原理是基于 IO 多路复用技术。这个实现方案本身就是先进/高级/高效的。
Redis 的工作是基于单线程的,从而节省了多线程形式下线程切换的开销。
一次只运行一条命令,每条命令天生就是一个独立的事务。
拒绝使用长/慢命令,Redis 对外提供的每条命令都很高效快速。
其实并不是单线程。有些操作使用独立线程,其它的线程是去干其它的事情,和执行命令的工作线程无关
最后的事实也证明了 Redis 的作者的最初分析思路的正确性:Redis 的单机性能的瓶颈是网络速度和网卡性能,而非 CPU 。
# 4. Redis 的通用命令简介
Redis 的常用的基础命令有:
命令 | 说明 |
---|---|
ping | PING 命令来测试客户端与 Redis 的连接是否正常。 连接正常时会收到回复 PONG |
set / get | 使用 set 和 get 可以向 redis 设置数据、获取数据。 |
del | 删除指定 key 的内容。 |
Keys * | 查看当前库中所有的 key 值 |
一个 Redis 实例可以包括多个数据库。不过,一个 redis 实例最多可提供 16 个数据库,而且固定了以下标从 0 到 15 作为数据库名。客户端默认连接第 0 号数据库。
可以通过 select 命令来当前数据库:
select N
如果选择一个不存在数据库则会报错。
# 5. Redis 单机多实例(了解)
如果需要启动两个 Redis 实例,你可以这么干:
在 Redis 解压目录下创建两个文件夹,例如:6379 和 16379 。以各自所占端口号命名。
将 redis.windows.conf 文件复制进这两个文件夹,并将 16379 中的配置文件中的
port 6379
改为port 16379
。在这两个文件夹中,分别启动两个命令行,执行
../redis-server.exe redis.windows.conf
命令。未来,在使用
redis-cli.exe
连接 Redis 服务端的时候,就需要明确指定连接端口号。
# 6. 持久化(了解、自学)
Redis 的高性能是由于其将所有数据都存储在了内存中,为了使 Redis 在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
Redis支持两种方式的持久化,一种是 RDB 方式,一种是 AOF 方式。
# RDB 方式
RDB 方式是 Redis 的默认持久化方式。
它是通过快照(snapshotting)完成的,当符合一定条件时 Redis 会自动将内存中的数据进行快照并持久化到硬盘。简单来说,就是直接将内存中的数据直接保存到硬盘上。
在 redis.windows.conf 配置文件中默认有此下配置:
save 900 1
save 300 10
save 60 10000
save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是『或』的关系,save 900 1
表示 900 秒钟(15 分钟)内至少 1 个键被更改则进行快照,save 300 10
表示 300 秒(5 分钟)内至少 10 个键被更改则进行快照。
Redis 启动后会读取 RDB 快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为 1GB 的快照文件载入到内存中需要花费 20~30 秒钟。
但是 RDB 方式实现持久化有个问题啊:一旦 Redis 异常(突然)退出,就会丢失最后一次快照以后更改的所有数据。因此在使用 RDB 方式时,需要根据实际情况,调整配置中的参数,以便将数据的遗失控制在可接受范围内。
# AOF 方式
默认情况下 Redis 没有开启 AOF(append only file)方式的持久化,可以通过配置文件中的 appendonly 参数开启:
appendonly yes
开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof,可以通过 appendfilename 参数修改:appendfilename appendonly.aof
← Redis 解压版 Redis 常用命令 →