Redis基础篇01 — Redis 基本概述
本文最后更新于 1009 天前,其中的信息可能已经有所发展或是发生改变。

关于 redis

redis 是一个开源的内存型数据库,采用的是 BSD License 开源许可证协议,它是 Remote Dictionary Server(远程字典服务器) 的缩写。软件采用 ANSI C 进行编写,最早由意大利人 Salvatore Sanfilippo(又名 Antirez)进行发起并开发,这是项目的 github 地址 —— https://github.com/redis/redis

Salvatore Sanfilippo 本人

问题
什么是字典服务器?
其实就是指 redis 的 key-value 存储系统,存储 value 的类型可以有:
strings(字符串)
hashes(哈希)
lists(列表)
sets (集合)
sorted set(有序集合)
...

诞生历史

在 2007 年,住在意大利西西里岛的 Salvatore Sanfilippo 和朋友创建了一个访客网站 —— lloogg.com。该网站主要是统计各个网站的各个信息,包括访客IP地址、操作系统、使用了什么浏览器、搜索的关键字是什么、访问的URL等。现在的一些站长工具,可以很简单地嵌入一段代码就可以实现上面的功能,登录到后台查看即可,常用的比如 CNZZ、百度统计、谷歌 GoogleAnalytics 等。

lloogg

其基本底层的运作逻辑:

lloogg底层运作逻辑

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 程序自动的填充缓存。

说明
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) - 该类通常使用图形节点进行表示。

NoSQL类型划分

redis 的用途

虽然 redis 是一个 KV 型的NoSQL,但在实际情况下,通常被用作数据缓存的中间件,一个典型的例子如下:

redis基本架构

cache(缓存):指把读取出来的数据保存在内存当中,当再次读取相同数据时,不用读取硬盘而直接从内存当中读取,加速数据的读取过程。
buffer(缓冲):指在写入数据时,先把分散的数据写入操作保存到内存当中,达到一定程度再集中写入到硬盘中,减少磁盘碎片和硬盘的反复寻道,加速数据的写入过程。

redis 内存当中的缓存数据与物理磁盘中的数据存在一定的差异性。在 MySQL 当中,为了解决各种并发问题(脏读、不可重复读、幻读)以及保持数据的一致性,于是使用了四个隔离级别,隔离级别的底层是各种锁机制。

隔离级别(从低到高) 名称 脏读 不可重复读 幻读
1 READ UNCOMMITTED 会出现 会出现 会出现
2 READ COMMITTED 不会出现 会出现 会出现
3
(全局默认级别)
REPEATABLE-READ 不会出现 不会出现 会出现
4 SERIALIZABLE 不会出现 不会出现 不会出现

问题
redis 是如何做到将内存当中的缓存数据与物理磁盘中的数据保持一致?
这里要说到 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(稳定版本):适合生产环境的稳定版本。

产品划分

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇