一. Redis 简介
1.1 数据库发展
1.1.1 单机时代
在90年代,一个网站的浏览量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多。
上述架构下,我们来看看数据存储的瓶颈是什么?
- 数据量的总大小一个机器放不下时
- 数据的索引(B+ Tree)一个机器的内存放不下时
- 浏览量(读写混合)一个实例不能承受
1.1.2 缓存年代
后来,随着网站浏览量的增多,几乎大部分使用MySQL
架构的网站在数据库方面都开始出现了性能问题,Web
程序不再仅仅专注在功能业务,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当浏览量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached
就自然的成为一个非常时尚的技术产品。
1.1.3 读写分离
由于数据库的写入压力增加,Memcached
只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。MySQL
的Master-Slave
模式成为这个时候的网站标配了。
1.1.4 集群时代
分库分表 + 水平拆分
在Memcached
的高速缓存,MySQL
的主从复制,读写分离的基础之上,这时MySQL
主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM
使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL
应用开始使用InnoDB
引擎代替MyISAM
。
同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL
推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL
推出了MySQL Cluster
集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。
MySQL的扩展性瓶颈
MySQL
数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000
万4KB
大小的文本就接近40GB
的大小, 如果能把这些数据从MySQL
省去,MySQL
将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL
的扩展性差(需要复杂的技术来实现),大数据下IO
压力大,表结构更改困难,正是当前使用MySOL
的开发人员面临的问题。
1.2 NoSQL 概述
为什么使用NoSQL?今天我们可以通过第三方平台( 如: Google,Facebook等) 可以很容易获取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那
SQL
数据库已经不适合这些应用了,NoSQL
数据库的发展也却能很好的处理这些大的数据。
1.2.1 NoSQL 是什么
NoSQL(=Not Only SQL)
,意即“不仅仅是SQL
”,泛指非关系型的数据库。随着互联网Web2.0
网站的兴起,传统的关系数据库在应付Web2.0
网站,特别是超大规模和高并发的SNS
类型的Web2.0
纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL
数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
1.2.2 为什么要使用NoSQL
NoSQL
数据库非常适合许多现代应用程序,例如移动、Web
和游戏等应用程序,它们需要灵活、可扩展、高性能和功能强大的数据库以提供卓越的用户体验。
- 灵活性:
NoSQL
数据库通常提供灵活的架构,以实现更快速、更多的迭代开发。灵活的数据模型使NoSQL
数据库成为半结构化和非结构化数据的理想之选。简单来说可以方便的扩展字段。 - 可扩展性:
NoSQL
数据库通常被设计为通过使用分布式硬件集群来横向扩展,而不是通过添加昂贵和强大的服务器来纵向扩展。一些云提供商在后台将这些操作处理为完全托管服务。 - 高性能:
NoSQL
数据库针对特定的数据模型和访问模式进行了优化,这与尝试使用关系数据库完成类似功能相比可实现更高的性能。 - 强大的功能:
NoSQL
数据库提供功能强大的API
和数据类型,专门针对其各自的数据模型而构建。
1.2.3 SQL与NoSQL
数十年来,用于应用程序开发的主要数据模型是由关系数据库(如 Oracle、DB2、SQL Server、MySQL 和 PostgreSQL)使用的关系数据模型。直到 21 世纪中后期,才开始大规模采用和使用其他数据模型。为了对这些新类别的数据库和数据模型进行区分和分类,创造了术语NoSQL
。通常术语NoSQL
与非关系可互换使用。
虽然许多类型的NoSQL
数据库具有各种不同的功能,但下表显示了 SQL
和NoSQL
数据库之间的一些差异。
关系数据库 | NoSQL 数据库 | |
---|---|---|
最佳工作负载 | 关系数据库专为事务性和高度一致的联机事务处理 (OLTP) 应用程序而设计,并且适用于联机分析处理 (OLAP)。 | NoSQL 数据库适用于包括低延迟应用程序在内的多种数据访问模式。NoSQL 搜索数据库设计用于对半结构化数据进行分析。 |
数据模型 | 关系模型可将数据标准化为由行和列组成的表。采用一种架构来严格定义表、行、列、索引、各个表之间的关系及其他数据库元素。数据库在表之间的关系中强制实施引用完整性。 | NoSQL 数据库提供了各种数据模型,如键值、文档和图形,这些模型针对性能和规模进行了优化。 |
ACID 属性 | 关系数据库提供原子性、一致性、隔离性和持久性 (ACID) 属性:原子性要求事务完全执行或根本不执行。 一致性要求事务提交之后,数据必须符合数据库架构。 隔离性要求并发事务彼此分开执行。 持久性要求能够从意外系统故障或断电情况中恢复到上一个已知状态。 | NoSQL 数据库通常通过放宽关系数据库的一些 ACID 属性来进行权衡,以获得可以水平扩展的更灵活的数据模型。这将使 NoSQL 数据库成为高吞吐量、低延迟使用案例的绝佳选择,这些使用案例需要水平扩展超出单个实例的限制。 |
性能 | 性能通常取决于磁盘子系统。要获得最佳性能,通常需要优化查询、索引和表结构。 | 性能通常由底层硬件集群大小、网络延迟以及调用应用程序来决定。 |
扩展 | 关系数据库通常通过增加硬件的计算能力进行纵向扩展或通过为只读工作负载添加副本进行横向扩展。 | NoSQL 数据库通常是可分区的,因为访问模式可以通过使用分布式体系结构进行横向扩展来提高吞吐量,从而以接近无限的规模提供一致的性能。 |
API | 存储和检索数据的请求通过使用符合结构化查询语言 (SQL) 的查询来传达。这些查询由关系数据库解析和执行。 | 借助基于对象的 API,应用开发人员可以轻松存储和检索数据结构。通过分区键,应用程序可以查找键值对、列集或包含序列化应用程序对象和属性的半结构化文档。 |
1.2.4 SQL 与NoSQL 术语
SQL | MongoDB | Cassandra | Couchbase | HBase | ElasticSearch | DynamoDB |
---|---|---|---|---|---|---|
表 | 集合 | 表 | 数据存储桶 | 表 | 索引/Type | 表 |
行 | 文档 | 行 | 文档 | 行 | 文档 | 项目 |
列 | 字段 | 列 | 字段 | 列族 | 字段 | 属性 |
主键 | 对象ID | 主键 | 文档ID | RowKey | 文档ID | 主键 |
索引 | 索引 | 二级索引 | 索引 | / | / | 索引 |
1.2.5 常见的 NoSQL 数据库
-
键值型
DynamoDB,Redi,Memcached
-
列式存储
ClickHouse,Parquet,HBase,Cassandra
-
文档存储
MongoDB,ElasticSearch
-
图形存储
Giraph,Spark GraphX,
1.3 Redis 概述
Redis
是一个开源(BSD
许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。使用C
语言编写,它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs
等数据类型。内置复制、Lua
脚本、LRU
收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel
提供高可用,通过Redis Cluster
提供自动分区。
1.3.1 特点
- 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis
不仅仅支持简单的key-value
类型的数据,同时还提供list
,set
,zset
,hash
等数据结构的存储。Redis
支持数据的备份,即master-slave
模式的数据备份。- 支持事务
1.3.2 优势
- 性能极高
Redis
能读的速度是110000
次/s,写的速度是81000
次/s 。 - 丰富的数据类型
Redis
支持二进制案例的Strings
,Lists
,Hashes
,Sets
及Ordered Sets
数据类型操作。 - 原子
Redis
的所有操作都是原子性的,同时Redis
还支持对几个操作合并后的原子性执行。(事务) - 丰富的特性
Redis
还支持publish/subscribe
, 通知,key
过期等等特性
1.3.3 应用场景
- 显示最新的项目列表 在Web应用中,“列出最新的回复”之类的查询非常普遍,这通常会带来可扩展性问题。这令人沮丧,因为项目本来就是按这个顺序被创建的,但要输出这个顺序却不得不进行排序操作。在
Redis
中我们可以将最新ID使用常驻缓存,这是一直更新的,而且只保留指定的长度,那么就会只有在超出的时候才会查询数据库。 - 删除与过滤 我们可以使用LREM来删除评论。如果删除操作非常少,另一个选择是直接跳过评论条目的入口,报告说该评论已经不存在。 有些时候你想要给不同的列表附加上不同的过滤器。如果过滤器的数量受到限制,你可以简单的为每个不同的过滤器使用不同的Redis列表。毕竟每个列表只有5000条项目,但Redis却能够使用非常少的内存来处理几百万条项目。
- 排行榜相关 另一个很普遍的需求是各种数据库的数据并非存储在内存中,因此在按得分排序以及实时更新这些几乎每秒钟都需要更新的功能上数据库的性能不够理想。 典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:
- 列出前100名高分选手
- 列出某用户当前的全球排名
- 计数 Redis是一个很好的计数器
- 队列
- 缓存
二.Redis安装
##1. 下载
[root@admin apps]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
##2. 解压
[root@admin apps]# tar -zxvf redis-6.0.9.tar.gz
##3. 安装
[root@admin redis-6.0.9]# yum -y install binutils
[root@admin redis-6.0.9]# yum -y install centos-release-scl
[root@admin redis-6.0.9]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@admin redis-6.0.9]# scl enable devtoolset-9 bash
[root@admin redis-6.0.9]# make & make install
[root@admin redis-6