26,数据存储 Mysql, redis, ES,InfluxDB 业务选型

1, Redis vs MySQL
redis 查询快, 效率比mysql(索引)快 Redis薄弱的地方是,不擅长做Key的搜索。对MySQL,我们可以使用LIKE操作前匹配走B+树索引实现快速搜索;但对Redis,我们使用Keys命令对Key的搜索,其实相当于在MySQL里做全表扫描
@GetMapping("redis2")
public void redis2() {
Assert.assertTrue(stringRedisTemplate.keys("item71*").size() == 1111);
} 

@GetMapping("mysql2")
public void mysql2() {
Assert.assertTrue(jdbcTemplate.queryForList("SELECT name FROM `r` WHERE name LIKE 'item71%'", String.class).size() == 1111);
}

在QPS方面,MySQL的QPS达到了Redis的157倍;在延迟方面,MySQL的延迟只有Redis的十分之一

Redis慢的原因有两个:

  1. Redis的Keys命令是O(n)时间复杂度。如果数据库中Key的数量很多,就会非常慢。
  2. Redis是单线程的,对于慢的命令如果有并发,串行执行就会非常耗时

一般而言,我们使用Redis都是针对某一个Key来使用,而不能在业务代码中使用Keys命令从Redis中“搜索数据”,因为这不是Redis的擅长。
对于Key的搜索,我们可以先通过关系型数据库进行,然后再从Redis存取数据(如果实在需要搜索Key可以使用SCAN命令)。在生产环境中,我们一般也会配置Redis禁用类似Keys这种比较危险的命令

1, InfluxDB vs MySQL
InfluxDB批量插入1000万条数据仅用了54秒,相当于每秒插入18万条数据,速度相当快;MySQL的批量插入,速度也挺快达到了每秒4.8 万。 对这1000万数据进行一个统计,查询最近60天的数据,按照1小时的时间粒度聚合,统计value列的最大值、最小值和平均值,并将统计结果 绘制成曲线图:MySQL查询一次耗时29秒左右,而influxDB耗时980ms:
  1. InfluxDB不支持数据更新操作,毕竟时间数据只能随着时间产生新数据,肯定无法对过去的数据做修改;
  2. 从数据结构上说,时间序列数据数据没有单一的主键标识,必须包含时间戳,数据只能和时间戳进行关联,不适合普通业务数据
1, Elasticsearch vs MySQL
分布式搜索和分析数据库,独特的倒排索引结构尤其适合进行全文搜索

简单来讲, 倒排索引可以认为是一个Map,其Key是分词之后的关键字,Value是文档ID/片段ID的列表。我们只要输入需要搜索的单词,就可以直接在这个Map中得到所有包含这个单词的文档ID/片段ID列表,然后再根据其中的文档ID/片段ID查询出实际的文档内容.

ES是一个分布式的全文搜索数据库,所以与MySQL相比的优势在于文本搜索,而且因为其分布式的特性,可以使用一个大ES集群处理大规模数据的内容搜索。但,由于ES的索引是文档维度的,所以不适用于频繁更新的OLTP业务。
一般而言,我们会把ES和MySQL结合使用,MySQL直接承担业务系统的增删改操作,而ES作为辅助数据库,直接扁平化保存一份业务数据,用于复杂查询、全文搜索和统计
ES:频繁更新就是一个大问题。
MySQL可以做到仅更新某行数据的某个字段,但ES里每次数据字段更新都相当于整个文档索引重建。即便ES提供了文档部分更新的功能,但
本质上只是节省了提交文档的网络流量,以及减少了更新冲突,其内部实现还是文档删除后重新构建索引。因此,如果要在ES中保存一个类似计数器的值,要实现不断更新,其执行效率会非常低。

ES不适合在各索引之间做连接(Join)操作,适合保存扁平化的数据。比如,我们可以把订单下的用户、商户、商品列表等信息,作为内嵌对象嵌入整个订单JSON,然后把整个扁平化的JSON直接存入ES。

总结
  1. . 需要根据主键查询单条数据,可以从MySQL Sharding集群或Redis查询,如果对实时性要求不高也可以从ES查询。
  2. 按照多个条件搜索订单的场景,可以从MySQL索引表查询出主键列表,然后再根据主键从MySQL
    Sharding集群或Redis获取数据详情。
  3. 各种后台系统需要使用比较复杂的搜索条件,甚至全文搜索来查询订单数据,或是定时分析任务需要一次查询大量数据,这些场景对数据实时性要求都不高,可以到ES进行搜索。此外,MySQL中的数据可以归档,我们可以在ES中保留更久的数据,而且查询历史数据一般并发不会很大,可以统一路由到ES查询。
  4. 监控系统或后台报表系统需要呈现业务监控图表或表格,可以把请求路由到
  5. Redis对单条数据的读取性能远远高于MySQL,但不适合进行范围搜索。
  6. InfluxDB对于时间序列数据的聚合效率远远高于MySQL,但因为没有主键,所以不是一个通用数据库。
  7. ES对关键字的全文搜索能力远远高于MySQL,但是字段的更新效率较低,不适合保存频繁更新的数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值