1.1 NoSQL
NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。
- 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis
- 文档数据库 : NoSQL 与关系型数据的结合,最像关系型数据库的 NoSQL 。 如MongoDB
1.2 Redis的用途
Redis 在生产中使用最多的场景就是做数据缓存。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了响应时间 RT,而且降低了 DBMS 的压力。
根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存。
实时同步缓存是指,DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清除,于是乎,若再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后再写入到 Redis。
阶段性同步缓存是指,Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的过期时间。
1.3 Redis特性
- 持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB(全量备份) 与 AOF。
- 高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
- 丰富的数据类型:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等,还有 BitMap、HyperLogLog、Geospatial 类型。
a. BitMap:一般用于大数据量的二值性统计。
b. HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。
c. Geospatial:地理空间,其主要用于地理位置相关的计算。 - 强大的功能:Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua脚本扩展功能。
- 客户端语言广泛:Redis 提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。所以,有很多的开源社区、大公司等开发出了很多语言的 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 版本开始支持了多线程模型。
1.4 Redis的IO模型
Redis服务器处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的。对于Redis 6之后的版本,采用多线程模型。
单线程的性能较高
- Redis6引入了多线程机制,但是不是说有多个worker线程同时并发读写, 而是它有 “一个
worker线程+多个IO子线程”,其实就是在 IO 就绪之后使用多线程提升读写解析数据的效率,而在 操作内存数据的时候还是用单线程,以在提高性能的同时避免读写安全问题。 - 同时,这种机制同样不会产生线程安全问题,因为Redis在针对数据的内存操作时,是在一个公共的worker队列中实现的,先进先出,所以不会有线程安全问题。
- 简单来说,就是 “请求是多线程的,但核心的内存读写操作(或者说读写计算)仍然是单线程的”。