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