Mysql、Redis、Memcached、MongoDB、Elasticsearch
Redis的优点:
支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
支持持久化操作,可以进行aof(将Reids的操作日志以追加的方式写入文件)及rdb(Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
支持简单的事务需求,但业界使用场景很少,并不成熟。
Redis的局限性:
Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
Mc和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难。
Memcached
Memcached的优点:
Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。
支持直接配置为session handle。
Memcached的局限性:
1 只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
2 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
3 无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
4 Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。
redis的使用
redis的概念
redis是非关系型数据库中的一个缓存数据库,定位是缓存数据库,是以key_value的形式存储,有5中数据结构.
redis的优点和缺点
优点:由于redis操作的是内存,读写速度非常快,读的速度每秒达到11万次,写的速度每秒达到8万次,可以缓解数据库访问和存储的压力,提高访问速度,适合对数据高并发读写,对大量数据的高效率存储和访问,同时redis还支持对数据的可扩展性,和高可用性,即一台redis不满足时,可以进行扩展,集群,高可用体现在主从复制,当一台redis的主服务器出问题时,并不影响redis数据的正常使用,数据会自动同步到其他从服务器上.redis在redis6版本以前是单线程的,每个操作是否是原子操作,没有并发相关问题
可扩展性:当数据量大了,一台redis服务器无法满足要求时,需要考虑对其进行扩展,有水平扩展(增加主的服务器或从的服务器),垂直扩展(在主的服务器中增加内存或加磁盘),一般选用水平扩展
高可用性:当redis服务器做主从分离时,一台主服务器,多台从服务器,如果一台主服务器挂了,意味我们无法给引用提供服务了.高可用就是我们会有多台主服务器,如果一台主服务器挂了,它下面的从服务器会自动挂载到新的主服务器中.
高可靠性:在服务器断电之后重新启动,数据还可以恢复,这就涉及到redis的持久化技术:RDB和AOF
缺点:redis作为缓存,数据相对来说不安全,有可能丢失,虽然说redis有持久化技术,但是还是不能保证百分之一百数据不会丢失;另外就是redis不支持事务,一些敏感数据不适合放在redis中存储.还就是redis的存储结构比较简单,就是key-value的形式,无法做太复杂的关系型数据库模型,redis事务处理简单
redis的使用场景-数据统计 -接口安全控制
list类型:消息队列(lpush+brpop), 文章列表,朋友圈点赞,回帖
set类型:去重,抽奖,好友推荐
zset类型:排行榜(需要排序)
剩下来就用string,hash一般不用
redis的操作流程
redis的key的设计:要保证唯一性和可读性,灵活性
redis的数据初始化,(预热)
考虑需要将哪些数据进行初始化-----vo
在哪个项目中执行初始化逻辑------放在后台服务中mgrsite
在哪一些组件中实现初始化逻辑-----listener中,项目启动 执行初始化
redis缓存数据业务操作
redis数据的持久化操作
考虑将哪些数据持久化到数据库中
在哪一个项目中执行持久化逻辑---->目前没有调度项目,只能放在后台项目中mgrsite在哪一些组件中执行持久化逻辑----->使用springboot的定时器,如何使用定时器
1.新建一个类,新建一个方法
2.在类上贴上注解@component
3.在方法上贴上注解@Scheduled(cron = "0/5 * * * * ? ")并在括号里写上定时的时间
4.然后在需要执行定时计划的启动类上贴上注解@EnableScheduling
mongodb的使用
mongodb的概念
mongodb是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。mongodb是一个非关系型数据库,也可以理解为介入非关系型数据库和关系型数据库之间的数据库
mongodb是一个以json为数据模型的文档非关系型数据库,mongodb最大的特点是他支持的查询语言非常强大,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
mongodb的优点和缺点
mongodb的优点:简单直观(采用的是bson结构存储数据),结构灵活(同一个集合中,可以包含不同字段(类型)的文档对象,快速开发,高可用性和易扩展性. 同时mongodb支持大数据存储,灵活性高 适合存储大量数据,高性能,支持高并发下的查询,易部署,易扩展
1:JSON结构和对象模型接近,开发代码量少
2:JSON动态模型意味着更容易响应新的业务需求
3:复制集提供了 99.999%高可用
4:分片架构支持海量数据无缝扩容
mongoDB和mysql最基本的区别就是mongodb面向集合存储,适合存储对象及json形式的数据
支持分片,复制,mysql5.7以后也是支持json数据格式的,mongodb4.0以后也支持事务功能
mongodb的缺点:在4.0以前是不支持事务的.不适用传统的商业智能应用,复杂的跨文档(表)级联查询
mongodb的原理:
大概就是存储数据时,先存入到虚拟内存中,60s之后再存入到数据库中...
mongodb的使用场景:
游戏,物流,社交,物联网,视频直播
elasticsearch的使用
es的概念
es-----数据模型是json 底层lucene--开源,支持分布式,restful搜索引擎,是一个实时的全文搜索引擎(不过是近实时,有1s的延迟,第二次搜索就快了),是一个专注于搜索的非关系型数据库(内存),类似于mongodb,专注于搜索,添加,更新,删除,比较慢,(需要建立索引),查是非常快了,也可以做crud,mongdb是比较全面的,es只是在查询方面比较擅长.
es的优点和缺点
es的优点用于搜索非常快.具有高可用性和可扩展性,其缺点就是增删改比较麻烦,需要进行同步操作
es的使用场景
多条件搜索:用户站内搜索引擎,大量数据的分析引擎,也可以做到近实时的搜索
es和msql进行对比
es中的索引相当于mysql中的数据库
es中类型相当于mysql中的表
es中的文档相当于mysql中的行
es中的mapping映射相当于mysql中的表的结构
es中的倒排索引如何理解
中文分词器
es自带的分词器: 如果是中文的话,会将每个字符都分词,如果是英文的话,会一个一个单词分词的,但是这个默认的分词器对中文支持不友好,不选择使用这个,无法对中文正常分词
IK分词器:"analyzer":"ik_smart",支持中文正常分词,会按语义正常分词.
细粒度分词:拆的比较细 "ik_max_word"
粗粒度分词:拆的比较粗 "ik_smart"
拓展词库:为了避免出现品牌的词被拆分,需要在词库中加上自己需要的词,这样才不会被分词
倒排索引
1.文档添加到es中,先执行添加操作,将数据添加到类型中
2.根据事先设定好的分词器,将文档中需要全文搜索的字段进行分词,并形成倒排索引表
3.搜索时,页面传入需要搜索词语(也可能是一条语句),es会将这个语句进行分词
4.拆词之后,es会根据这些词语去倒排索引表中去匹配分词,一旦匹配,获取对应的分词后面挂载文档的id连表
5. 通过id列表去数据表中查询对应的id数据(中间还会进行关联度评分)
es在项目中如何使用
1.首先es数据要执行初始化操作,使用的方法是将需要查询的列(需要搜索的列)存在es中,而不是将所有的数据都存入es中,避免内存消耗过大,通过发送请求的方式执行初始化操作,
2.初始化操作结束以后,通过打开es的可视化界面可以看到数据初始化是否成功
3.成功以后,通过页面发起的请求可以看到,需要传两个参数,一个是type,一个是keyword(关键词),需要后台接收这两个参数,并且对这两个参数进行判断
4.使用qo封装这两个参数.同时对type做常量处理(可读性),,然后后台对type进行判断(switch),根据type的数值判断当前执行的是全部,或攻略,或游记,或用户搜索操作,然后调用不同的方法
5.目的地的操作由于是精确匹配的方式,不需要全文检索,因此直接去数据库查即可,将目的地页面的攻略,游记都通过mongodb的方式去查出来
6.攻略.游记,用户需要全文检索的方式去查询,而且还要将查询出来的关键词进行高亮显示,因此需要使用es查询的方式,分为几个步骤:
1>拼接结构,将查询条件拼接在一起,还有高亮显示字段
2>对查询条件进行解析,将没有高亮显示的字段解析成高亮显示的字段(替换)
3>使用template.queryForPage()方法返回page结果集
7.全部查询,只是将用户,攻略.游记,目的地的全文检索放在了一起,最终封装成立一个result对象返回给页面
redis.mongodb.mysql.memcache.elasticsearch的区别
首先说说redis和mongodb的区别
MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
MongoDB的特点(1)面向文档(2)高性能(3)高可用(4)易扩展(5)丰富的查询语言
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
TPS(transaction per second)是单位时间内处理事务的数量,QPS(query per second)是单位时间内请求的数量。TPS代表一个事务的处理,可以包含了多次请求。很多公司用QPS作为接口吞吐量的指标,也有很多公司使用TPS作为标准,两者都能表现出系统的吞吐量的大小,TPS的一次事务代表一次用户操作到服务器返回结果,QPS的一次请求代表一个接口的一次请求到服务器返回结果。当一次用户操作只包含一个请求接口时,TPS和QPS没有区别。当用户的一次操作包含了多个服务请求时,这个时候TPS作为这次用户操作的性能指标就更具有代表性了。
1.性能:都比较高,总体来讲,redis的TPS要大于mongodb
2.操作的便利性:redis丰富一些,数据操作方便redis更好一些,较少的网络io次数,mongodb支持丰富的数据表达,索引,支持的查询语言非常丰富
3.内存大小和数据量的大小
redis作为缓存,操作的是内存,有内存大小的数据,存储的数据量跟内存有关,redis在2.0版本后增加了自己的VM(虚拟机)特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)
mongodb的数据存储在磁盘,适合存储大数据量的数据,依赖操作系统做vm做内存管理,吃内存也比较厉害,服务不要和别的服务在一起
4.可靠性(持久化):对数据持久化和数据恢复:redis支持快照RDB和AOF:依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响, MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性
5.数据一致性(事务支持)
redis支持事务比较弱,只能保证事务中的每个操作连续执行
mongodb不支持事务
6.应用场景:
redis用在数据量较小的高性能操作和运算上
mongodb主要解决海量数据的访问效率上
redis和memcache的区别
1.redis和memcache都是将数据存储在内存中,redis一般都是存储字符串类型,或者集合类型,memcache还可以存储图片或者视频等资源
2.redis的数据结构比memcache更加丰富,拥有5大数据结构,String hash list set zset
3.数据持久化性,memcache服务一旦挂掉,数据就没有了,redis服务挂了以后,会通过RDB或AOF还可以将数据找回来.
redis.mongodb.memcache.mysql和elasticsearch的区别
4.redis和memcache都是一种操作内存的缓存数据库,定位的只是缓存,用来处理高并发下的数据读写操作,减轻数据库的访问的存储的压力,提高用户的访问效率.
mysql和mongodb都是一种专门存储或者持久化的数据库,不同的是,mysql是关系型数据库,mongodb是非关系型数据库,mongodb拥有丰富的查询语言,适合海量数据的存储,当访问mysql的数据量较大的时候容易导致mysql挂掉.mongodb不支持事务处理,mysql支持事务,当涉及到事务的操作时,需要使用功mysql;mongodb的处理数据的效率比较高,原因是mongodb底层会将数据先存到一个缓存中,读取还是写都比mysql较快.用户访问效率高.
elasticsearch也是一个数据库,只不过是一个作为搜索的数据库,检索数据非常快,适合做搜索的相关功能,但是由于其本身的限制,做增删改就比较慢,功能相对redis或是memcache单一,只能存储一些用来做搜索的数据,不然会导致内存过大.相对mysql或者monogdb,存储空间比较小,数据安全性低.