Redis
1 缓存概念
缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此CPU缓存、内存、Raid 卡缓存以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高CPU的工作效率。
1.1系统缓存
1.1.1buffer与cache:
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存再写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
1.2 缓存保存位置及分层结构
互联网应用领域,提到缓存为王
- 用户层: 浏览器DNS缓存,应用程序DNS缓存,操作系统DNS缓存客户端
- 代理层: CDN,反向代理缓存
- Web层: Web服务器缓存
- 应用层: 页面静态化
- 数据层: 分布式缓存,数据库
- 系统层: 操作系统cache
- 物理层: 磁盘cache, Raid Cache
1.2.1 DNS缓存
浏览器的DNS缓存默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析
1.2.2 应用层缓存
Nginx、PHP等web服务可以设置应用缓存以加速响应用户请求,另外有些解释性语言,比如:
PHP/Python/Java不能直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能执
行,因此字节码也是一种缓存,有时候还会出现程序代码上线后字节码没有更新的现象。所以一般上线
新版前,需要先将应用缓存清理,再上线新版。
另外可以利用动态页面静态化技术,加速访问,比如:将访问数据库的数据的动态页面,提前用程序生成静态
页面文件html 电商网站的商品介绍,评论信息非实时数据等皆可利用此技术实现。
1.2.3数据层缓存
- 分布式缓存服务
Redis
Memcached
- 数据库
MySQL 查询缓存
innodb缓存、MYISAM缓存
1.2.4 硬件缓存
- CPU缓存(L1的数据缓存和L1的指令缓存)、二级缓存、三级缓存
- 磁盘缓存:Disk Cache
- 磁盘阵列缓存: Raid Cache,可使用电池防止断电丢失数据
2 redis基础:
2.1.1 关系型数据库和 NoSQL 数据库
数据库主要分为两大类:关系型数据库与 NoSQL 数据库。
关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库
中的数据。主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适
用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键
值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用场景及优点。
Oracle,mysql 等传统的关系数据库非常成熟并且已大规模商用,为什么还要用 NoSQL 数据库呢?
主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺
陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足
日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优
势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高。
(一)、关系型数据库
关系型数据库是一个结构化的数据库,创建在关系模型 (二维表格模型) 基础上,一般面向于记录。
SQL语句 (标准数据查询语言) 就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
(二)、非关系型数据库
NoSQL (NoSQL=NotOnlySQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。
除了主流的关系型数据库外的数据库,都认为是非关系型。
主流的 NoSQL 数据库有Redis、 MongBD、 Hbase、 Memcached 等。
(三)、关系型数据库和非关系型数据库区别
(1)、数据存储方式不同
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此.关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
① 关系型:依赖于关系模型E-R图,同时以表格式的方式存储数据
② 非关系型:除了以表格形式存储之外,通常会以大块的形式组合在一起进行存储数据
(2)、扩展方式不同
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器 (节点) 来分担负载。
① 关系:纵向(天然表格式)
② 非关:横向(天然分布式)
(3)、对事务性的支持不同
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。
① 关系型:特别适合高事务性要求和需要控制执行计划的任务
② 非关系:此处会稍显弱势,其价值点在于高扩展性和大数据量处理方面
(四)、非关系型数据库产生背景
可用于应对Web2.0纯动态网站类型的三高问题。
(1) High performance-------对数据库高并发读写需求
(2) HugeStorage--------------对海量数据高效存储与访问需求
(3) High Scalability && High Availability------- 对数据库高可扩展性与高可用性需求
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,非关系型数据库关注在存储上。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。
Mysql 高热数据——》redis
web ——》redis ——》mysql
CPU——》内存/缓存 ——》磁盘
总结:
关系型数据库:
实例–>数据库–>表(table)–>记录行(row)、数据字段(column)——》存储数据
非关系型数据库:
实例–>数据库–>集合(collection) -->键值对(key-value)
workdir=/usr/local/mysql
非关系型数据库不需要手动建数据库和集合(表)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aWtrJ8lB-1639386679245)(C:\Users\think\AppData\Roaming\Typora\typora-user-images\image-20211206220718697.png)]
2.1.2 redis 简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQZbKvVm-1639386679246)(C:\Users\think\AppData\Roaming\Typora\typora-user-images\image-20211206220754750.png)]
Redis (Remote Dictionary Server)在2009年发布,开发者Salvatore Sanfilippo是意大利开发者,他本
想为自己的公司开发一个用于替换MySQL的产品Redis,但是没有想到他把Redis开源后大受欢迎,短短
几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎
网,GitHub,Twitter 等。
Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value
database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的
还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。
2.1.3redis特性
- 速度快: 10W QPS,基于内存,C语言实现
- 单线程
- 持久化
- 支持多种数据结构
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
- 主从复制
- 支持高可用和分布式
2.1.4 单线程
Redis 6.0版本前一直是单线程方式处理用户的请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXPVK0AQ-1639386679247)(C:\Users\think\AppData\Roaming\Typora\typora-user-images\image-20211206221010831.png)]
单线程为何如此快?
- 纯内存
- 非阻塞
- 避免线程切换和竞态消耗
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhrlNWdt-1639386679247)(C:\Users\think\AppData\Roaming\Typora\typora-user-images\image-20211206221114246.png)]
2.1.5redis 对比 memcached
- 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数据到内存继续使用
- 支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zset(有序集合)
- 支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF
- 支持更大的value数据:memcache单个key value最大只支持1MB,而redis最大支持512MB(生产不建议超过2M,性能受影响)
- 在Redis6版本前,Redis 是单线程,而memcached是多线程,所以单机情况下没有memcached 并发高,性能更好,但redis 支持分布式集群以实现更高的并发,单Redis实例可以实现数万并发
- 支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性
- 都是基于 C 语言开发
m |
---|