第1章 Redis 概述
一、Redis 简介
Redis,Remote Dictionary Server,远程字典服务,由意大利人Salvatore Sanfilippo(又名Antirez)开发,是一个使用ANSI C 语言编写、支持网络、 可基于内存亦可持久化的日志型、NoSQL 开源内存数据库,其提供多种语言的API。从2010 年3 月15 日起,Redis 的开发工作由VMware 主持。从 2013 年5 月开始,Redis 的开发由Pivotal 赞助。
Redis 之所以称之为字典服务,是因为Redis 是一个key-value 存储系统。支持存储的value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和Hash(哈 希类型)等。
Redis 的国际知名用户有,Twitter、GitHub、Facebook 等,国内知名用户有,阿里巴巴、 腾讯、百度、搜狐、优酷、美团、小米等。熟练使用和运维Redis 已经成为开发运维人员的 一个必备技能。
1.NoSQL
(1)键值存储数据库
(2)列存储数据库
(3)文档型数据库
(4)图形(Graph)数据库
二、Redis 的用途
DBMS 是 Database Management System(数据库管理系统) 的缩写,是一种专门用于 创建、管理和维护数据库 的软件系统。它是数据持久层(如关系型数据库、非关系型数据库等)的核心组件
根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存。
实时同步缓存是指,DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清 除,以促使再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后 再写入到 Redis。
阶段性同步缓存是指,Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全 一致。而这个时间段就是这个缓存数据的过期时间。
实时同步缓存,与阶段性同步缓存——补充理解《补充》
三、Redis 特性
能够做缓存的技术、中间件很多,例如,MyBatis 自带的二级缓存、Memched 等。只所 以在生产中做缓存的产品几乎无一例外的会选择 Redis,是因为它有很多其它产品所不具备 的特性。
性能极高:Redis 读的速度可以达到 11w 次/s,写的速度可以达到 8w 次/s。只所以具有 这么高的性能,因为以下几点原因:
(1)Redis 的所有操作都是在内存中发生的。
(2) Redis 是用 C 语言开发的。
(3)Redis 源码非常精细(集性能与优雅于一身)。
简单稳定:Redis 源码很少。早期版本只有 2w 行左右。从 3.0 版本开始,增加了集群功 能,代码变为了 5w 行左右。
持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。
高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
丰富的数据类型:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型) 等,还有 BitMap、HyperLogLog、Geospatial 类型。
BitMap:一般用于大数据量的二值性统计。
HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。 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 版本开始支持了多线 程模型。
四、Redis 的 IO 模型
Redis 客户端提交的各种请求是如何最终被 Redis 处理的?
Redis 处理客户端请求所采用 的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的
1.单线程模型
对于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户 端的请求全部由一个线程处理。
每个客户端若要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分 发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器 就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯 一的线程来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。
之所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理 器去处理。
2.混合线程模型
从 Redis 4.0 版本开始,Redis 中就开始加入了多线程元素。处理客户端请求的仍是单线 程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。 例如,持久化、对 AOF 的 rewrite、对失效连接的清理等。
3.多线程模型
多线程 IO 模型中的“多线程”仅用于接受、解析客户端的请求,然后将解析出的请求 写入到任务队列。而对具体任务(命令)的处理,仍是由主线程处理。这样做使得用户无需 考虑线程安全问题,无需考虑事务控制,无需考虑像 LPUSH/LPOP 等命令的执行顺序问题。
4.优缺点总结
⑴.单线程模型
优点:可维护性高,性能高。不存在并发读写情况,所以也就不存在执行顺序的不确定 性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁 开销。
缺点:性能会受到影响,且由于单线程只能使用一个处理器,所以会形成处理器浪费。
⑵.多线程模型
优点:其结合了多线程与单线程的优点,避开了它们的所有不足
缺点:该模型没有显示不足。如果非要找其不足的话就是,其并非是一个真正意义上的 “多线程”,因为真正处理“任务”的线程仍是单线程。所以,其对性能也是有些影响的。