(一)Redis基础
1.Redis是什么✨
Redis是一个数据库,不过与传统关系性数据库(RDBM)不同,Redis属于NoSQL,也就是非关系型数据库,它的存储结构是Key-Value。Redis的数据直接存在内存中,读写速度非常快,因此 Redis被广泛应用于缓存,消息队列、分布式锁等场景。
Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。
2.Redis为什么这么快✨✨✨
- Redis 基于内存,内存的访问速度比磁盘快很多
- Redis 内置了多种优化过后的数据类型/结构实现,性能非常高
- 整个 Redis 就是一个全局哈希表,他的时间复杂度是 O(1),而且为了防止哈希冲突导致链表过长,Redis 会执行 rehash 操作,扩充 哈希桶数量,减少哈希冲突。并且防止一次性重新映射数据过大导致线程阻塞,采用渐进式 rehash。巧妙的将一次性拷贝分摊到多次请求过程后总,避免阻塞;
- 对数据存储进行了优化,如压缩表,listpack,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
- Redis对数据的操作是单线程的,不存在资源竞争问题,避免抢锁带来的性能消耗
- Redis使用多路复用技术,可以处理并发的连接。采用了epoll+Reactor。通过epoll,内核会一直监听多个 Socket 上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,假如说 Redis 拿到了可读写的描述符,就会执行对应的读写操作;如果 Redis 拿到了创建连接的文件描述符,就会完成连接的初始化,然后准备监听这个连接上的读写事件。这就实现了一个 Redis 线程处理多个 IO 流的效果。((四)Redis线程模型 - 一打木 (taitres.com))
- Redis使用resp协议,实现简单、解析快、人类可读
[!NOTE]
那既然都这么快了,为什么不直接用 Redis 当主数据库呢?主要是因为内存成本太高且 Redis 提供的数据持久化仍然有数据丢失的风险。
3.Redis 和 Memcached 的区别和共同点?✨✨
共同点:
- 都是基于内存的数据库,一般都用来当做缓存使用;
- 都有过期策略;
- 两者的性能都非常高。
区别:
- 数据类型:Redis 支持更丰富的数据类型(支持更复杂的应用场景)(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
- 数据持久化:Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
- 集群模式支持:Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
- 特性支持:Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持。并且,Redis 支持更多的编程语言;
- 过期数据删除:Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除。
4.为什么要用 Redis?(为什么用 Redis 作为 MySQL 的缓存?)✨
**为什么要用 Redis:**访问速度快,高并发,功能全面(Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等场景)
为什么用 Redis 作为 MySQL 的缓存:访问速度快,高并发(单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w)
5.什么是 Redis Module?有什么用?
通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库(so 文件)的形式被加载到 Redis 中
我们每个人都可以基于 Redis 去定制化开发自己的 Module,比如实现搜索引擎功能、自定义分布式锁和分布式限流。
如:
- RediSearchopen in new window:用于实现搜索引擎的模块
- RedisJSONopen in new window:用于处理 JSON 数据的模块
- RedisBloomopen in new window:用于实现布隆过滤器的模块