关于 redis
redis 是一个开源的内存型数据库,采用的是 BSD License 开源许可证协议,它是 Remote Dictionary Server(远程字典服务器) 的缩写。软件采用 ANSI C 进行编写,最早由意大利人 Salvatore Sanfilippo(又名 Antirez)进行发起并开发,这是项目的 github 地址 —— https://github.com/redis/redis
其实就是指 redis 的 key-value 存储系统,存储 value 的类型可以有:
strings(字符串)
hashes(哈希)
lists(列表)
sets (集合)
sorted set(有序集合)
…
诞生历史
在 2007 年,住在意大利西西里岛的 Salvatore Sanfilippo 和朋友创建了一个访客网站 —— lloogg.com。该网站主要是统计各个网站的各个信息,包括访客IP地址、操作系统、使用了什么浏览器、搜索的关键字是什么、访问的URL等。现在的一些站长工具,可以很简单地嵌入一段代码就可以实现上面的功能,登录到后台查看即可,常用的比如 CNZZ、百度统计、谷歌 GoogleAnalytics 等。
其基本底层的运作逻辑:
LLOOGG 网站会为每个被追踪的网站创建一个列表,依据用户的设置,记录5~1000的浏览记录,在当时,使用 MySQL 做为自己的存储系统,而使用 MySQL 的问题就在于其读写数据的机制——随着越来越多人开始使用 LLOOGG,要维护的列表也是越来越多,在记录的速度上也是越来越慢,这种慢主要体现在硬盘的 I/O 上,因为关系型数据库是反复在内存与硬盘之间打交道,如何在不改变硬件的情况下让记录的效率提高,成为了一个问题。众所周知,内存读写数据的速度远比硬盘的速度快,后面也就诞生了 redis。
学过 MySQL 、SQL Server、Oracle 的同学知道,这类数据库我们统称为 关系型数据库管理系统(RDBMS,relational database management system)。
以 MysSQL 的 Innodb 存储引擎为例,它是将数据预先放入到内存当中(buffer bool、change buffer、log buffer),在读取数据的时候,会把数据加载到缓冲池中,下一次再读取相同的数据页时,如果在缓冲池中,称该页被缓冲池命中,直接读取;修改也是一样,直接修改内存中的数据(前提是 buffer pool 中已经存在你要修改的数据),然后以一定频率刷新到磁盘上。为了保证内存当中的数据页写入到磁盘,MySQL 还有一个保险机制——双写缓冲区。
当您的 MySQL 服务器刚刚开始启动时,有一个使用 LRU 算法(Least Recently Used,最近最少使用)的预热(warm up)功能,即提前将一些热的数据页放入到缓冲池中,就相当于 MySQL 程序自动的填充缓存。
NoSQL 概念
NoSQL(Not Only SQL),通常泛指非关系型数据库,是相对于传统 SQL 数据库管理系统的一个概念。
关系型数据库管理系统通常记录结构化数据。
结构化数据:数据遵守格式、长度等标准规范,且能用二维的表格进行呈现与表示。关系型数据库管理系统就是一个典型例子。
非结构化数据:数据结构不完整或不规范,不方便使用二维表格进行呈现与表示。比如邮件、日志、图片、音频、视频等。
半结构化数据:前两者的结合,比如 xml、html 等。
由于云计算、大数据的兴起,多种类型数据以及数据的量发生了很大变化,使用关系型数据库显得力不从心,而 NoSQL 处理起来则游刃有余。
人们根据使用场景的不同,又将 NoSQL 做了四大类的划分:
- KV 型 NoSQL(Key-Value Store)– KV 即 key-value,以存储键值对的形式的非关系型数据库。redis 就是其中的代表之一。这一类数据库的数据基于内存,读写数据、查询数据非常地快。
- 列式型 NoSQL(Wide-Column Store) – 在大数据领域中使用较多,以 Hbase 为典型代表之一。关系型数据库管理系统的数据是以一行一行的形式进行存储,可理解为行式存储,其在物理磁盘上即占用连续的扇区,当拥有海量的数据时,这是一个致命伤。而采用列式存储进行查询时,只有指定的列的数据才会被读取,而不是整列。这一类数据库的特点是:查找速度快、可扩展性强、更容易实现分布式扩展。
- 文档型 NoSQL(Document Store) – 所有的数据都存储在文档中,格式为 JSON 或 xml。前面学习的 ES(Elastic search)就是典型的代表之一,它存储数据的格式为 json,利用倒排索引数据结构实现全文检索;MongoDB 也是典型的代表之一。通常而言,文档型 NoSQL 在许多方面借鉴了关系型数据库管理系统,换言之,如果你对关系型数据库管理系统非常了解,上手文档型 NoSQL 也是非常容易的。
- 图式型 NoSQL(Graph Store) – 该类通常使用图形节点进行表示。
redis 的用途
虽然 redis 是一个 KV 型的NoSQL,但在实际情况下,通常被用作数据缓存的中间件,一个典型的例子如下:
cache(缓存):指把读取出来的数据保存在内存当中,当再次读取相同数据时,不用读取硬盘而直接从内存当中读取,加速数据的读取过程。
buffer(缓冲):指在写入数据时,先把分散的数据写入操作保存到内存当中,达到一定程度再集中写入到硬盘中,减少磁盘碎片和硬盘的反复寻道,加速数据的写入过程。
redis 内存当中的缓存数据与物理磁盘中的数据存在一定的差异性。在 MySQL 当中,为了解决各种并发问题(脏读、不可重复读、幻读)以及保持数据的一致性,于是使用了四个隔离级别,隔离级别的底层是各种锁机制。
隔离级别(从低到高) | 名称 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
1 | READ UNCOMMITTED | 会出现 | 会出现 | 会出现 |
2 | READ COMMITTED | 不会出现 | 会出现 | 会出现 |
3 (全局默认级别) |
REPEATABLE-READ | 不会出现 | 不会出现 | 会出现 |
4 | SERIALIZABLE | 不会出现 | 不会出现 | 不会出现 |
这里要说到 redis 对数据一致性所采用的策略:
先更新缓存中的数据,再更新磁盘中的数据。
先更新磁盘中的数据,再更新缓存中的数据。
先删除缓存,再更新磁盘中的数据
先更新磁盘中的数据,再删除缓存
延迟双删
事务
乐观锁
这里先初步了解,后面会专门说明。
redis 基本特性与功能
- 性能极高(C 语言开发)
- 部署简单,使用广泛
- 持久化(可将内存中的数据持久化到磁盘当中,中途断电也不用担心)
- 支持分布式存储,支持集群化部署
- 丰富的数据类型支持
- 功能强大
- 多线程 IO 模型(IO模型:redis 处理客户端请求所采用的处理架构或方式)
- ACI (Access Control List)权限控制。你知道的, GNU/Linux 除了基本的用户管理权限(User、Group、Other的相关权限)外,也支持对用户使用 ACL 特殊权限
- 支持异步复制
- 多路复用技术
异步复制:先将数据的修改或更新写入到 主 中,完成后将数据复制到另外 一个/多个 副本上。
同步复制:在 主 中对数据进行修改/变更的同时,数据被复制到另外 一个/多个 副本上,实时的完成数据复制,有点类似于磁盘阵列中的 raid 1。
异步复制和同步复制的区别:
同步复制 | 异步复制 | |
---|---|---|
距离 | 当距离较近时,效果更好。更加适合在 LAN 网络中 | 可在较长的距离上工作,只要数据中心之间的网络连接可用。 |
RPO (Recovery Point Object) | 零 | 15分钟到几个小时 |
RTO (Recovery Time Object) | 短 | 短 |
成本 | 更贵,需要更多的带宽占用或专用硬件 | 相对更加经济 |
带宽占用 | 需要更多的带宽并受延迟影响,可受 WAN 网络中断影响(因为实时传输,所以数据的传输不能推迟到以后) | 需要较少带宽且不受延迟影响,不受 WAN 网络中断影响(因为数据可以保存在本地,等待 WAN 网络恢复后进行复制) |
数据丢失 | 零 | 可能会丢失最新的数据更新 |
性能 | 低 | 高 |
使用场景 | 需要实时的恢复且绝对不允许数据丢失 | 不太敏感的数据且允许丢失部分数据 |
版本历史以及版本号说明
大版本号的发布时间如下:
- redis 1.0:于2009年3月发布
- redis 2.0:于2010年4月发布
- redis 3.0:于2015年4月发布
- redis 4.0:于2017年9月发布
- redis 5.0:于2018年10月发布
- redis 6.0:于2020年4月发布
- redis 7.0:于2022年6月发布
其中在 redis 3.x 以及之前的版本采用单线程 IO 模型,在 redis 4.x ~ redis 5.x 采用混合 IO 模型,在 redis 6.0 开始使用多线程 IO 模型。
时间阶段:
- 初期版本阶段(2009~2011)
- 高可用阶段(2012~2015)
- 高速发展阶段(2015~2018)
- 数据分析阶段(2018~至今)
在您下载 redis 时,通常有两个版本类型供您选择:
- Unstable(不稳定版本):提供给开发者或者测试新功能的人的实验版本。
- Stable(稳定版本):适合生产环境的稳定版本。
产品划分
- Redis:Redis 的开源版本。
- Redis Stack:一个用于开发者构建程序的软件套件,也是开源的。
- Redis Cloud:由云计算厂商托管并给企业用户使用的产品。
- Redis Enterprise:Redis 的企业版,相比开源版本的 Redis ,多了更多的企业级功能。官方有比较的链接— https://redis.com/wp-content/uploads/2022/06/comparison-redis-open-source-vs-redis-enterprise.pdf