什么是Redis?
Redis 是一个基于C语言开发的开源数据库,与传统数据库不同的是Redis的数据是存在内存中的,所以他又被叫做内存数据库,他的读写速度非常快,被广泛的应用于缓存方向。并且,Redis存储的是key,value键值对数据。
为了满足不同的业务场景,Redis内置了多种数据类型实现(比如String,Hash、SortedSet、Bitmap、HyperLog、GEO)。并且,Redis还支持事务、持久化、Lua脚本、多种开箱即用的集群方案(Redis Sentinel、Redis Cluster)。
Redis没有外部依赖,Linux和OSX是Redis开发和测试最多的两个操作系统,官方推荐生产环境使用Linux部署Redis。
Redis 为什么这么快?
Redis 内部做了非常多的性能优化,比较重要的有下面 3 点:
- Redis 基于内存,内存的访问速度是磁盘的上千倍;
- Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用;
- Redis 内置了多种优化过后的数据结构实现,性能非常高。
为什么要用 Redis/为什么要用缓存?
下面我们主要从“高性能”和“高并发”这两点来回答这个问题。
1、高性能
假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。但是,如果说,用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。
这样有什么好处呢?
那就是保证用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。
2、高并发
一般像 MySQL 这类的数据库的 QPS 大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(就单机 Redis 的情况,Redis 集群的话会更高)。(QPS(Query Per Second):服务器每秒可以执行的查询次数)
由此可见,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。
Redis 除了做缓存,还能做什么?
- 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。
- 限流:一般是通过 Redis + Lua 脚本的方式来实现限流。
- 消息队列:Redis 自带的 list 数据结构可以作为一个简单的队列使用。Redis 5.0 中增加的 stream 类型的数据结构更加适合用来做消息队列。它比较类似于 Kafka,有主题和消费组的概念,支持消息持久化以及 ACK 机制。(Redis可以做消息队列,但不建议使用 Redis 来做消息队列。和专业的消息队列相比,还是有很多欠缺的地方。)
- 延时队列:Redisson 内置了延时队列(基于 sorted set 实现的)。
- 分布式 Session :利用 string 或者 hash 保存 Session 数据,所有的服务器都可以访问。
- 复杂业务场景:通过 Redis 以及 Redis 扩展(比如 Redisson)提供的数据结构,我们可以很方便地完成很多复杂的业务场景比如通过 bitmap 统计活跃用户、通过 sorted set 维护排行榜。