【基础篇】Redis深入理解与实践指南(一)之Redis的前世今生
基础篇
技术是一条很长的路,走到最后除了热爱还需要坚持!
一、Redis诞生背景
时代背景
基于冯诺依曼体系所述,计算机系统由运算器,控制器,存储器,输入设备,输出设备五个部分组成(考研真题)。但有的资料更细分为七大组成部分,添加了内存和总线。这里规范是五大组成部分,后面的应该是随着时代发展,在Cache出现之后的"新·冯诺依曼体系"。我们在冯诺依曼体系的基础上建立计算机信息时代,走过了光盘(DVD)时代与磁盘时代,再穿过内存时代,最后来到了大数据时代。时代经历了一系列的变迁,技术也随之发展。因为CPU处理器的速度远大于硬盘,因此冯诺依曼系统中设计的计算机存储结构是多级缓存的结构,越靠近计算机的模块,要求处理的速度越快。因此,在磁盘时代中,数据库技术的性能瓶颈就是磁盘的I/O瓶颈。
最初的解决方案是在中间加一层高速cache(一般自带在cpu模块中,为三级缓存),这样可以对cpu的处理速度进行一级降级,不至于让cpu资源闲置。
但是高速缓存cache还是太快了,并且不可能全部将数据都放在电路中,需要在外置层级也放置一部分;因此就出现了下一级缓存——内存,对于处理的资源再次来了一次速度的降级。但是每次切换任务时磁盘还是会阻塞并且内存的速度还是远大于硬盘,这样IO还是会经常处于阻塞的状态。
为了解决这个问题,解决方案是在内存与硬盘中设置一层速度降级的缓存区buffer。处理的单个数据先不提交给内存,而是放到buffer中后面一起提交。当填满标准 I/O 缓存后才进行实际 I/O 操作,称之为全缓冲,比如文件的读写;当在输入和输出中遇到换行符时,执行真正的 I/O 操作,称之为行缓冲,比如键盘的输入输出;不进行缓冲,标准出错情况 stderr 是典型代表,称之为无缓冲,这使得出错信息可以直接尽快地显示出来。
但是缓冲区(buffer)也是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据。buffer解决的是数据"写"的速度问题,cache解决的是“读”的问题;具体参考非阻塞IO与DMA相关知识。
磁盘也有cache,硬盘的cache作用就类似于CPU的cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取,可以通过硬盘cache解决常驻内存访问问题。同时,由于机器的内存大小有限(费用与机器配置的原因内存小,但内存具有较为重要的战略地位),出现了一种叫做虚拟内存的技术作为内存的互补,使用虚拟内存地址、页表、地址翻译与内存映射技术将某一部分硬盘做成内存的映射区,也就是逻辑内存。屏蔽了内存与硬盘之间的差异性,具体技术参考Linux的mmap() 函数实现。在Windows上是虚拟内存,在Linux上是Swap分区,VM=RM(Real Memory)+Swap。
上面的多级缓存结构屏蔽了计算机系统之间的处理速度之间大部分差异,但是对于主要负责存储功能的硬盘,存储空间还是大到读取数据缓慢,因此解决办法就是加索引。
我们将磁盘扇区分为4K的一个个小的分区,构成索引。有了这些索引值,我们能通过索引,进行更加便捷的查找。为了我们能够更快的查找,我们将索引使用B+树进行存储。
后面又有某公司发表了某论文,BigTable中首次提到了日志结构树的概念,一般简称为LSM树。后面,也就诞生了各种各种基于LSM引擎的非结构化分布式存储数据。然后,大数据时代就此揭开了序幕。
做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。当理解了一些底层原理之后,会发现现在很多热门技术、原理、常见的设计都是在底层基础上发展而来的。
作为大数据时代的前一个时代——NoSQL数据库时代,作为SQL到NoSQL时代的切换,Redis无疑是NoSQL时代的内存型NoSQL数据库中最为耀眼的存在了。它的实现借鉴了上面各个时代发展的多个先进技术,例如:Redis的VM机制原理(当然Redis的VM机制是自己实现的),实现了冷热数据隔离;利用Linux的epoll机制,实现的IO多路复用;利用Linux的Fork函数,实现COW(Copy On Write)等。
个人背景
Redis由出生于西西里岛的意大利人(antirez)发明的,据说当时antirez作者为了追求一个女星,把Redis的默认端口命名为她的名字merz(九格宫键盘)。
antirez早年是系统管理员,2004到2006年做嵌入式工作,之后接触web,2007年和朋友共同创建一个网站LLOOGG.com,并为了解决这个网站的负载问题,而在2009年开发了Redis数据库。
Redis概述
Redis是什么
1、Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2、官网:redis.io/
3、中文网:www.redis.cn
4、下载地址:通过官网下载即可
为什么要用Redis
1、单机Mysql年代(应用 => 数据访问层 => 数据库)
90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!
那个时候,更多的去使用静态网页Html~服务器根本没有太大的压力!
思考一下,这种情况下:整个网站的瓶颈是什么?
1.数据量如果太大,一个机器放不下了!
2.数据的索引(B+ Tree),一个机器内存也放不下
3.访问量(读写混合),一个服务器承受不了~
只要你开始出现以上的三种情况之一,那么你就必须要晋级!
2、Memcached(缓存)+Mysql+垂直拆分(Mycat中间件集群代理)
网站80%都是在读,每次都要去查询数据库额话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!
发展过程:优化数据结构索引-->文件缓存(IO)-->Memcached(当时最热门的技术!)
3、分库分表+水平拆分+MySQL集群
技术和业务在发展的同时,对人的要求也越来越高了!
本质:数据库(读和写)
早些年Mysql数据库引擎为MyISAM:表锁,十分影响效率。高并发下就会出现严重的锁问题
现在数据库引擎是InnoDB:行锁
慢慢地就开始使用分库分表来解决写的压力。Mysql在那个年代推出了表分区,但是并没有多少公司使用。
Mysql的集群,很好地解决了那个年代所有的需求!
4、最近的年代——技术爆炸
2010—2020十年之间,世界发生了翻天覆地的变化(定位数据,音乐,热榜)
Mysql等传统关系型数据库就不够用了!数据量大,变化很快~
Mysql有的人使用它来存储一些比较大的文件,比如博客的图片。数据库表大,查询速度慢,效率相对较低!
Mysql的压力就变得十分小(研究如何处理这些问题!)大数据的IO压力,表几乎无法扩张。
5、目前一个基本的互联网项目
为什么要用NoSQL
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户日志发生爆发式增长!
这时候我们就需要使用NoSQL数据库,NoSQL可以很好地处理以上的情况!
什么是NoSQL
NoSQL = Not Only SQL(不仅仅是SQL)
关系型数据库:表格,行,列(POI)
泛指非关系型数据库,随着web2.0互联网的诞生!传统的关系型数据库很难对付,尤其是超大规模的高并发的社区(站长),暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式!不需要多月的操作就可以横向扩展的!Map<String,Object>使用键值对来控制
NoSQL特点
1.方便扩展(数据之前没有,很好扩展)
2.大数据量、高性能(Redis官方测评:一秒写8万次,读取11万次。NoSQL缓存记录级,是一种细粒度的缓存,性能会比较高)
3.数据类型是多样型的(不需要事先设计数据库,随取随用,如果是数据量十分大的表,很多人就无法设计了)
4.传统RDBMS和NoSQL
传统的 RDBMS — 结构化数据 — SQL — 数据和关系都存在单独的表中 — 数据操作,数据定义语言 — 严格的一致性 — 基础的事务 — ......
NoSQL — 不仅仅是数据 — 没有固定的查询语言 — 键值对存储,列存储,文档存储,图形数据看(社交关系) — 最终一致性 — CAP定理和BASE理论(异地多活) — 高性能,高可用,高可扩展 — ......
了解:3V+3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据的3高:主要是对程序的要求
- 高并发(多个用户同时访问,即多个cpu同时访问同一个线程,考验的是cpu是否有在一时间段内处理多个任务的能力;并行是在同一时刻同时处理多个任务,一定是多线程)
- 高扩展(随时可水平拆分,比如增加和迁移服务器)
- 高性能(保证用户体验和性能)
真正在公司中的实践:NoSQL+RDBMS一起使用
技术没有高低之分,就看你怎么去使用!(提升内功,思维的提高!)
NoSQL的四大分类
KV键值对:
新浪 :Redis
美团:Redis + Tair(淘宝开源的Redis企业版)
阿里、百度:Redis + Memcached
应用场景:为内容缓存(第一次访问后的查询源),主要用于处理大数据的高访问负载,也用于一些日志系统等。
文档型数据库(bson和json一样) :
MongoDB(一般必须要掌握)
MongoDB是一个基于分布式文件存储的数据库,C++编写的,主要用来处理大量的文档!
MongDB是一个介于关系型数据库和非关系型数据库中间的产品,MongoDB是NoSQL中功能最丰富,最像关系型数据库的。
ConchDB
CouchDB是分布式的文档型NoSQL数据库,提供数据存储和索引,可在多台机器之间共享与同步数据。
列存储数据库
HBase
Cassandra
分布式文件系统
应用场景: 以列簇式存键,查找速度快,可扩展性强;用于分布式扩展,但功能相对局限。
图关系数据库
它不是存图形的,放的是关系,比如:朋友圈社交网络,广告推荐!
Neo4j,InfoGrid;
应用场景:社交网络,推荐系统等,专注于构建关系图谱。利用图论中相关算法,例如Prim、Dijkstra算法(普里姆算法、迪杰斯特拉算法,也叫最短路径算法与最小生成树算法,统称为广度优先算法)。广度优先算法(BFS,Breadth First Search)是基于队列实现的,深度优先算法DFS(Depth First Search),是基于栈实现的,可以与递归(算法的实现形式,一般只有一个解,得到解的过程中会判断条件是否成立,慢慢收敛状态(剪枝))联合在一起。经典DFS算法应用:N皇后问题、黑白N皇后问题、木棍拼三角形问题、引爆炸弹问题以及数独问题,经典BFS算法应用:A星算法等。图形数据库常用于图结构算法构建的数据存储,最短路径寻址、N度查找,一般需要对整个图做计算才能得出需要的信息,一般这种结构不太好做分布式集群方案。
【基础篇】Redis深入理解与实践指南(一)之Redis的前世今生相关推荐
- Tensorflow[基础篇]——LSTM的理解与实现
前言 本文参考了tensorflow github里面的实现的lstm的教程代码6_lstm.ipynb.因为这代码即实现了lstm,也实操了tf的内容,可以说是一箭双雕. 源码地址:https:// ...
- 16 | 基础篇:怎么理解内存中的Buffer和Cache?
上一节,我们梳理了 Linux 内存管理的基本原理,并学会了用 free 和 top 等工具,来查看系统和进程的内存使用情况. 在今天的内容开始之前,我们先来回顾一下系统的内存使用情况,比如下面这个 ...
- 09 | 基础篇:怎么理解Linux软中断?
上一期,我用一个不可中断进程的案例,带你学习了 iowait(也就是等待 I/O 的 CPU 使用率)升高时的分析方法.这里你要记住,进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被 ...
- Redis 混合存储最佳实践指南
Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...
- mqtt 变为乱码 接受16进制字节流_转战物联网#183;基础篇07-深入理解MQTT协议之控制报文(数据包)格式...
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable he ...
- Java基础篇:如何理解static
通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.在成员的声明前面加上关键字static(静态的)就能创建这样的成员. 如果一个成员被声明 ...
- 《Docker快速入门(基础篇)》Docker Hub实用指南
在<Windows下安装Docker>一文末尾,体验了一下Hello World,其过程只需两步:拉取镜像.创建并运行容器.其中,拉取的镜像hello-world,就来自Docker Hu ...
- 【FPGA——基础篇】如何理解时序电路
一.概述 时序逻辑示意图,如下图所示.数据从一个寄存器出来,经过组合逻辑到达下一个寄存器. 在学习数字电路的过程中,我们都知道时序逻辑,但是大家对时序逻辑真的了解吗? (1)纯组合逻辑电路的缺点在哪? ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
最新文章
- android camera 降低帧率_Android性能问题分析之bugreport
- 位序、字节序、类型序
- 从事了两年 AI 研究,我学到了什么?
- matlab方波假频现象分析,基于MATLAB 的信号时域采样及频率混叠现象分析
- win10 + mac双系统安装常用工具
- 不同网段互PING,对不?
- db2和mysql语句区别_db2和mysql语法的区别是什么
- JavaScript(笔记)
- 同样版本的jstl,都是jstl1.2版本,有个有问题,另一个没有问题
- unity连接mysql并读取所有数据库_Unity 3D 连接Mysql数据库
- bootstarp span标签文本居中_web前端入门到实战:文本图标对齐的几种解决方案
- 机器学习算法_机器学习算法之PCA算法
- python数据1-4
- 雷云驱动2从云服务器,Razer Synapse 2.0(雷蛇云驱动)
- reimage许可证密钥_2019年7月24日,绝对真实的许可证密钥
- 爬虫加密算法实践(淘宝直播+百度指数)
- 用vue实现打印页面的几种方法
- Vue计算属性、监视属性
- scrapy爬取王者荣耀皮肤
- 基于QtQuick2.0开发的诸多漂亮的界面例子(作为入门首选)