学习视频链接,示以尊重:https://space.bilibili.com/95256449/video
大数据时代3V:海量、多样、实时
大数据时代3高:高并发、高可拓、高性能
用户的个人信息,社交网络,地理位置等用户自己产生的数据,用户日志等等爆发式增长。数据量大,变化快,MySQL等关系型数据库不再适用,这时就需要使用NoSQL。
NoSQL = Not Only SQL(不仅仅是 SQL),泛指非关系型数据库。
NoSQL 特点:
真正在公司中的实践:NoSQL + RDBMS 联合使用。
1、商品的基本信息:名称、价格、商家信息:
关系型数据库: MySQL / Oracle
2、商品的描述、评论(文字比较多):
文档型数据库:MongoDB
3、图片 :
- 分布式文件系统 FastDFS
- 淘宝自己的 TFS
- Gooale的 GFS
- Hadoop的HDFS
- 阿里云的 oss
4、商品的关键字 (搜索) :
- 搜索引擎:solr、elasticsearch
- ISerach
5、商品热门的波段信息 :
- 内存数据库
- Redis Tair、Memache…
6、商品的交易,外部的支付接口 :
第三方应用
大型互联网应用问题:
解决问题:统一数据服务平台(UDSL)
分类 | 主流产品 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDB | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL的重点是non-relational,有如下优势:
NoSQL同样有不适用的场景和不足之处:
不适用场景:
劣势:
分布式数据系统的CAP原理的三要素:
CAP原理:在分布式系统中,这三个要素最多只能同时实现两点,不可能三者兼顾:
对于分布式数据系统,分区容忍性是基本要求。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是必须需要实现的。所以只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
对于大多数web应用,牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。
三个“一致性”:
Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSI-C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis推荐在linux服务器上进行搭建。
Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
redis-server.exe:开启redis服务
redis-cli.exe:连接redis客户端,开启后可输入命令
127.0.0.1:6379> ping #测试连接
PONG
127.0.0.1:6379> set name xingyu #设置键值对
OK
127.0.0.1:6379> get name #获取键值对
"xingyu"
redis-check-aof.exe:检查持久化
redis-benchmark.exe:自带的压力检测工具
redis-benchmark是官方自带的性能测试工具。
格式:redis-benchmark 命令参数
# 测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
#set测试结果
====== SET ======
100000 requests completed in 2.03 seconds
100 parallel clients
3 bytes payload
keep alive: 1
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no
2.35% <= 1 milliseconds
98.46% <= 2 milliseconds
99.93% <= 3 milliseconds
99.99% <= 4 milliseconds
100.00% <= 4 milliseconds
49236.83 requests per second
1、下载安装包
2、解压Redis的安装包到 /opt 目录下
3、进入解压后的文件,可以看到redis的配置文件:redis.conf
4、基本的环境安装
yum install gcc-c++
make
make install
5、redis的默认安装路径 /usr/local/bin
6、将redis配置文件,复制到当前目录下,之后启动redis就用这个配置文件启动
#进入/usr/local/bin后
mkdir kconfig
cp /opt/redis-6.0.5/redis.conf kconfig
7、redis默认不是后台启动的,修改配置文件
vim redis.conf
#将daemonize no改为daemonize yes
8、启动Redis服务
#回到/usr/local/bin目录,通过指定的配置文件启动redis服务
redis-server kconfig/redis.conf
9、使用redis-cli 进行连接测试
redis-cli -p 6379
10、查看redis的进程是否开启
ps -ef|grep redis
11、如何关闭Redis服务呢?
shutdown
exit
12、再次查看进程是否存在
13、后面会使用单机多Redis启动集群测试
1、Redis默认有16个数据库,默认使用的是第0个,可以使用 select 进行切换数据库。
127.0.0.1:6379> select 3 # 切换数据库
OK
127.0.0.1:6379[3]> dbsize # 查看DB大小
(integer) 0
2、查看当前数据库所有的key:
127.0.0.1:6379[3]> keys * # 查看数据库所有的key
1) "name"
3、清除当前数据库:flushdb
4、清除全部数据库的内容:flushall
5、Redis 是单线程的
官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。
Redis 为什么单线程还这么快?
核心:Redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程 (CPU上下文会切换:耗时的操作),对于内存系统来说,没有上下文切换的情况下效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!