1.常见数据库
1.1.键值存储数据库
如 Map 一样的key-value 对,典型代表就是 Redis。
1.2.列存储数据库
关系型数据库是典型的行存储数据库,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。而按列存储则可实现分布式存储,适合海量存储。典型代表是 HBase。
1.3.文档型数据库
是 NoSQL 与关系型数据的结合,最像关系型数据库的 NoSQL。典型代表是 MongoDB。
1.4.图形(Graph)数据库
用于存放一个节点关系的数据库,例如描述不同人间的关系。典型代表是 Neo4J。
2.Redis 的用途
Redis 在生产中使用最多的场景就是做数据缓存。即客户端从数据库中查询出的数据首先写入到 Redis 中,然后客户端再需要访问该数据,直接读取 Redis 中的,不仅减小了响应时间,而且降低了数据库的压力。
缓存一般可划分为两类:实时同步缓存,阶段性同步缓存。实时:数据库中数据更新后,Redis 缓存中的存放的相关数据会被立即清除,再次访问数据库重新写入Redis。阶段:Redis 缓存中的数据允许在一段时间内与数据库中的数据不完全 一致。而这个时间段就是这个缓存数据的过期时间。
3.Redis 特性
性能极高:Redis 读的速度可以达到 11w 次/s,写的速度可以达到 8w 次/s。原因:1)Redis 的所有操作都是在内存中发生的;2) Redis 是用 C 语言开发的;3)Redis 源码精细。
简单稳定:Redis 源码很少。
持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。
高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
丰富的数据类型:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型) 等,还有 BitMap(一般用于大数据量的二值性统计)、HyperLogLog(用于对数据量超级庞大的日志做去重统计)、Geospatial(地理空间,其主要用于地理位置相关的计算)类型。
强大的功能:Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua 脚本扩展功能。
客户端语言广泛:Redis提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。
支持 ACL 权限控制:从 Redis6 开始引入了 ACL 模块,为不同用户定制不同的用户权限。ACL(Access Control List)访问控制列表,是一种细粒度的权限管理策略,可以针对任意用户与组进行权限控制。目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL 了。 Zookeeper 早已支持 ACL 了。 Unix 与 Linux 系统默认使用是 UGO(User、Group、Other)权限控制策略,其是一种粗粒度的权限管理策略。
支持多线程 IO 模型:Redis 以前采用的是单线程模型,6.0开始 版本支持了多线程模型。
4.Redis 的 IO 模型
Redis 处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。
4.1.单线程模型
Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户端的请求全部由一个线程处理。单线程模型采用了多路复用技术,多路选择算法常见的有三种:select 模型、poll 模型、epoll 模型。poll 模型的选择算法:采用的是轮询算法。该模型对客户端的就绪处理是有延迟的;epoll 模型的选择算法:采用的是回调方式。根据就绪事件发生后的处理方式的不同, 又可分为 LT 模型与 ET 模型。
执行流程:每个客户端若要向Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器 就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯 一的线程来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。
优点:可维护性高,性能高。不存在并发读写情况,不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁和解锁开销。
缺点:性能会受到影响,且由于单线程只能使用一个处理器,所以会形成处理器浪费。
4.2.混合线程模型
Redis 4.0 版本开始,加入了多线程元素。处理客户端请求的仍是单线程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。 例如,持久化、对 AOF 的 rewrite、对失效连接的清理等。
4.3.多线程模型
Redis 6.0 版本,客户端请求的处理采用的是多线程模型。
优点:其结合了多线程与单线程的优点,避开了它们的不足。
缺点:没有明显不足,处理任务线程仍是单线程,性能可能有影响。