目录
- 数据库架构的演化
- 单体架构
- 缓存(Memcached)+MySQL集群
- 缓存(Memcached可以)+MySQL集群+垂直拆分(主从复制,读写分离)
- 缓存(Redis)+MySQL集群+垂直拆分+分库分表
- NoSQL
- NoSQL产生的背景
- 性能需求
- MySQL的扩展性瓶颈方面
- 什么是NoSQL
- NoSQL的特点
- 主流的NoSQL数据库类型
- 阿里巴巴数据架构分析
- 商品的基本信息存入关系型数据库:
- 商品的描述、详情、评论(文字比较多):
- 热点商品:
- 商品的图片存储:
- 商品的搜索商品:
- Redis简介
- 什么是Redis
- Redis的优势(特性)
- Redis的缺点
- Redis的使用场景
- Redis的五大数据类型
- 三种特殊的数据类型
- Redis安装(Windows环境)
- 下载地址
- 解压缩
- redis设置
- 设置密码
- 后台启动
- 设置允许远程连接
- 启动redis服务端
- 通过双击redis-server.exe文件启动
- 通过cmd命令方式进行启动
- 启动redis客户端
- Redis的图形化管理工具
- Redis Desktop Manager:
- AnotherRedisDesktopManager
- RedisPlus
- Redis Insight
- Redis的基础知识
- Redis默认有16个数据库:
- Redis的默认端口是 6379
- Redis是单线程的()
- Redis 为什么单线程还这么快
数据库架构的演化
单体架构
- 单机MySQL的美好年代:在90年代,一个网站的浏览量一般都不大,用单个数据库完全可以轻松应付。
- 在那个时候,更多的都是静态网页,动态交互类型的网站不多
缓存(Memcached)+MySQL集群
- 后来,随着网站浏览量的增多,几乎大部分使用MySQL架构的网站在数据库方面都开始出现了性能问题,Web程序不再仅仅专注在功能业务,同时也在追求性能。
- 程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。在这个时候,Memcached就自然的成为一个非常时尚的技术产品
- 利用MySQL集群的力量提升数据库的性能
缓存(Memcached可以)+MySQL集群+垂直拆分(主从复制,读写分离)
- 主从复制,读写分离产生的背景:由于数据库的写入压力增加,Memcached 只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。
- MySQL的Master-Slave模式成为这个时候的网站标配了。
- 主从库之间通过同步机制把主库的数据同步到从库,对于需要查询最新写入数据的场景,可以在缓存中多写一份,通过缓存获得最新数据
缓存(Redis)+MySQL集群+垂直拆分+分库分表
- 在高速缓存,MySQL的主从复制, 读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。
- 同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题
NoSQL
NoSQL产生的背景
- 在Web应用发展的初期,关系型数据库受到了较为广泛的关注和应用,原因是因为那时候
Web站点基本上访问和并发不高、交互也较少。 - 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而瓶颈的源头一般是在磁盘的I/O上。而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
- NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储
性能需求
随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面
- 对数据库高并发读写的需求,低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
- 庞大运营成本的考量:在硬件成本、软件成本和人力成本能够有大幅度地降低
MySQL的扩展性瓶颈方面
- 2010–2020 十年之间,世界已经发生了翻天覆地的变化;(定位信息,音乐,视频,日志等,也是一种数据,用户生成的数据和用户操作日志等等爆发式增长)
- MySQL 等关系型数据库就不够用了!数据量很多,变化很快~!
- MySQL 如果存储一些比较大的文件,博客,图片!数据库表很大,效率就低了!如果有一种数据库来专门处理这种数据,MySQL压力就变得十分小,在海量数据的IO压力下,查询速度会非常缓慢
什么是NoSQL
- 为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和数据库管理人员的青睐。
- NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,泛指非关系型的数据库。
NoSQL的特点
- 可扩展性强(数据之间没有关系,很好扩展!)
- 大数据量,高性能(Redis 一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)
- 数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)
主流的NoSQL数据库类型
类型名称 | 产品 | 典型案例 | 适用场合 |
---|---|---|---|
键值数据库(Key-Value) | Berkeley DB Redis Memcached Tair | 新浪:Berkeley DB + Redis 美团:Redis + Tair 阿里:Memcached + Redis | 储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择 |
面向文档数据库(Document- Oriented) | MongoDB CouchDB | 京东商城、小红书、华为、中国平安、百度、360安全卫士 | 游戏场景:使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新 物流场景:使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。 社交场景:使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能 物联网场景:使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析 视频直播:使用 MongoDB 存储用户信息、礼物信息等 |
列存储数据库 | Cassandra HBase | 分布式文件系统 | 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势 |
图关系数据库 | Neo4j InfoGrid | 微软、IBM、沃尔玛、思科惠普、埃森哲 | 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。 它不是放图形的、放的是关系。比如:朋友圈社交网络、广告推荐系统、社交网络、推荐系统。专注于构建关系图谱 |
阿里巴巴数据架构分析
商品的基本信息存入关系型数据库:
- 商品的基本信息:名称、价格,出厂日期,生产厂商等
- 关系型数据库:MySQL
- 淘宝的去O化策略(也即拿掉Oracle),注意,淘宝内部用的Mysql是里面的大牛自己改造过的。
- 为什么去IOE(在IT建设过程中,去除IBM小型机、Oracle数据库及EMC存储设备)简而意之,可不用穿脚链跳舞。
商品的描述、详情、评论(文字比较多):
- 文档数据库MongDB。
热点商品:
- Redis缓存中
商品的图片存储:
分布式文件系统 FastDFS
- 淘宝自己的 TFS
- Google的 GFS
- Hadoop HDFS
- 阿里云的 OSS
商品的搜索商品:
- 搜索引擎 Solr或者Elasticsearch
结论:真正在公司中的实践:NoSQL + RDBMS 一起使用才是最强的
Redis简介
什么是Redis
- Redis是由C语言开发的,开源免费的非关系型数据库、Key-Value数据库、内存数据库,支持持久化、事务和备份,集群(支持16个库)等高可用功能。并且性能极高(每秒十几万次的读/写操作),易扩展,丰富的数据类型,所有操作都是单线程,具备原子性。
- 官网:https://redis.io/
- https://redis.io/docs/about/
Redis的优势(特性)
- 性能非常高,支持高并发读写:Redis读的速度是110000次/s,写的速度是81000次/s
- 高可用性:用于独立和集群部署的自动故障转移复制。支持集群、分布式、主从同步
- 可以存储丰富的数据类型:Redis支持String, List, Hash, Set ,Zset等数据类型操作。
- 持久化存储:作为一个内存数据库,最担心的就是万一机器死机或宕机,数据就会丢失。Redis使用RDB和AOF做数据的持久化存储。主从数据同时,生成rdb文件,并利用缓冲区添加新的数据更新操作做对应的同步。
- 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。
- 丰富的特性:Redis还支持 publish/subscribe, 通知key过期等等特性。
Redis的缺点
- 因为数据是保存在内存中的,所以会受到服务器内存大小的限制:虽然Redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据
- 无法利用多核服务器的CPU:Redis是单线程的,单台服务器无法充分利用多核服务器的CPU
- 提前预估缓存和数据库双写一致性问题:数据库和缓存双写,就必然会存在数据不一致的问题
- 提前预估缓存击穿和缓存雪崩问题:
- 缓存穿透:当用户请求一个不存在的数据,请求会直接穿过Redis,请求到rdb中,Redis起不到缓存的作用,当请求很多时,数据库压力会变大
- 缓存击穿:当Redis中key存在,但是已经过期,大量并发请求也会直接穿透内存,请求到rdb,并缓存到redis,并发量很大时,后端数据库,可能会被压垮
- 缓存雪崩:当redis中大量key在同一时间段失效,或者服务重启,也会给后端数据库,带来很大压力
Redis的使用场景
- 缓存热点数据:例如对象缓存、全页缓存、可以提升热点数据的访问速度
- 分布式下共享数据:例如共享Session
- 分布式锁:可以使用 Redis 自带的 SETNX 命令 实现分布式锁
- 全局ID:分布式场景下ID的唯一性
- 计算器/限速器:Redis中原子性的自增操作,可以统计类似用户点赞数、用户访问数等,限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力
- 简单消息队列:除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦。
- 购物车、抽奖、点赞、签到、打卡、好友关系、用户关注、推荐模型、排行榜
Redis的五大数据类型
数据类型 | 存储的值 | 适用场合 |
---|---|---|
string(字符串) | Redis的String类型是二进制安全的字符串,String可以包含任何数据,如字符串、整数、浮点数、图像、序列化对象。一个键最多能存储512MB | 1. string通常用于保存单个字符串或JSON字符串数据 2. 因为String是二进制安全的,所以可以把保密要求高的图片文件内容作为字符串来存储 3. 计数器:常规Key-Value缓存应用,如微博数、粉丝数 |
list(列表) | 类似Java的LinkedList集合,它是一个字符串链表 | 1.对数据大的集合数据删减: 列表显示、关注列表、粉丝列表、留言评价、分页、热点新闻等 2.任务队列: List通常用来实现一个消息队列,而且可以确保先后顺序 |
set(集合) | Set 是 String 类型的无序集合。集合是通过哈希表实现的 | 对两个集合间的数据进行交集、并集、差集运算 |
hash(哈希) | 包含键值对的无序散列类别 | hash特别适合用于存储对象 |
zset(有序集合) | Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序 | 常用于排行榜 |
三种特殊的数据类型
数据类型 | 存储的值 | 适用场合 |
---|---|---|
Geospatial | 地理位置 | 1.朋友的定位,附近的人,打车距离计算 2.Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的 信息,两地之间的距离,方圆几里的人 |
Hyperloglog | 是用来做基数统计的算法 | 浏览用户数量,一天内同一个用户多次访问只能算一次 |
Bitmap | bit位是二进制,所以只有两种状态,0和1。 | 用户签到次数、或者登录次数等 |
Redis安装(Windows环境)
下载地址
https://github.com/tporadowski/redis/releases
解压缩
解压路径中没有空格,没有中文
redis设置
设置密码
requirepass 123456
需要注意的是,redis默认情况下是不需要输入密码的,可以在redis.windows.conf中进行设置。
后台启动
daemonize yes
设置允许远程连接
## bind字段默认为: bind 127.0.0.1 这样只能本机访问redis
## 若允许远程主机访问,可注释掉bind行 或者 将bind 127.0.0.1改为: bind 0.0.0.0
启动redis服务端
通过双击redis-server.exe文件启动
这种方式启动,默认情况下加载默认配置文件redis.windows.conf进行启动
通过cmd命令方式进行启动
在当前目录打开cmd控制台窗口,redis-server.exe redis.windows.conf
。 这种方式启动可以自定义redis配置文件。
启动redis客户端
在当前目录打开cmd控制台窗口,redis-cli.exe
Redis的图形化管理工具
Redis Desktop Manager:
- 使用率最广的可视化工具了。跨平台支持。以前是免费的,现在为收费工具
- https://redisdesktop.com/
AnotherRedisDesktopManager
- 免费,一款比较稳定简洁的Redis UI工具
- https://github.com/qishibo/AnotherRedisDesktopManager
RedisPlus
- 一款开源的免费桌面客户端软件
- https://gitee.com/MaxBill/RedisPlus
Redis Insight
- Redis labs出的一款监控分析级别的可视化工具。这款软件是web版的
- https://redislabs.com/redisinsight/
Redis的基础知识
Redis默认有16个数据库:
- 序号从db0—db15,默认使用的是第0个
- 可以使用 select 进行切换数据库:select 3
Redis的默认端口是 6379
- 6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
Redis是单线程的()
- 误区1:高性能的服务器一定是多线程的?错错错
- 误区2:多线程(CPU上下文会切换!)一定比单线程效率高?错错错
Redis 为什么单线程还这么快
- Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是机器的内存和网络带宽,既然可以使 用单线程来实现,所有就使用了单线程了
- 对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下, 这个就是最佳的方案
- Redis使用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量