文档章节

Md5 算法在数据库表设计和查询服务过程的运用及优化

mengjunxiaoxiang
 mengjunxiaoxiang
发布于 01/20 16:18
字数 1342
阅读 32
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

最近遇到几个业务上的奇葩需求,几经思考,如何能简单设计开发,又能实现高调用量和响应时间的要求呢?

以下举具体的两个例子:

案例1:现在需要从外部系统接收订单信息,但订单上的省市区数据非国家的标准行政区,业务上需要将不对应的名称统一转换成国家标准的省市区,以及转换出国家标准的行政区编码。那么,如何在接单的过程中,将非标准地址转换成国家标准地址呢?

附性能指标要求:日均业务按2000W+,峰值按15000W单的要求,测试时间8小时,TPS将达到5000+。

         例:

转换前:外部的数据

天津

天津市

滨海新区

 

转换后:国家标准数据

省编码

省名称

市编码

市名称

区编码

区名称    

120000

天津

120100

市辖区

120116

滨海新区

         以上可以看出外部的订单数据上

         省:天津

         市:天津市

         区:滨海新区

需要将其转换成国家标准的行政区
         省编码:120000

省名称:天津

市编码:120100

市名称:市辖区

区编码:120116

区名称 :滨海新区

对比可以看出,差异1在于市的描述上,当然,也不排除省、和区名称的差异。差异2在于于外部给的数据无标准的编码。按照通常的做法是建表如下:(表名:测试转换表)

字段名

字段长度

是否可以空

示例数据

表主键

32

非空

 

订单-省描述

10

 

天津

订单-市描述

10

 

天津市

订单-区描述

10

 

滨海新区

国家标准-省编码

10

 

120000

国家标准-省名称

10

 

天津

国家标准-市编码

10

 

120100

国家标准-市名称

10

 

市辖区

国家标准-区编码

10

 

120116

国家标准-区名称

10

 

滨海新区

 

通常做的转换对应的查询SQL:

         SELCT * FROM测试转换表 WHERE订单-省描述=? AND订单-市描述=? AND订单-区描述=?

    优化步骤1:

另外,一个订单上的省市区分别可能存在为空的情况,那么对订单-省描述、订单-市描述、订单-区描述建个联合索引的业务,不一定合适,那么最优的方式应该怎么做呢?

    表主键=MD5(订单-省描述+订单-市描述+订单-区描述),这个md5值由应用做处理,存表或者更新、查询,都以表主键的条件进行。

    优化后

  1. 应用将 订单-省描述+订单-市描述+订单-区描述 生成一个md5值。为第二步备用;
  2. 查询SQL为:SELCT * FROM测试转换表 WHERE表主键=md5值。

这样就能通过多字段条件的查询转换成表主键的查询。

 

优化步骤2:

在步骤1的基础上,订单处理核心依赖的服务如何提高服务的性能呢?数据库单表的查询性能始终会有极限。所以根本的解决办法是添加缓存处理。步骤为:

  1. 查询缓存。缓存存在则直接返回;缓存不存在,则认为此数据第一次维护或缓存已过期。需要查询数据库;
  2. 查询数据库。若存在记录,则记录缓存,并返回。

通常缓存的选择,使用redis或Ehcache,那么,具体选用哪一种呢?

Ehcache:快速,简单,且成本低。直接在jvm虚拟机中存取,速度快,效率高。但不适用于共享。

Redis:有成熟的分布式解决方案,但访问通过socket通信完成,效率比Ehcache低。

考虑到表查询的访问成本以及单机版的Ehcache,缓存失效的时间控制,以及初次上线,并发访问数据库的量较大,组合redis和Ehcache共同使用。具体方式为操作新增和删除的同时,同步更新redis里的数据。那么,进一步优化的步骤为:

  1. 查询Ehcache,存在则直接返回;缓存不存在,则认为此数据第一次维护或Ehcache缓存已过期。需要进行第二步
  2. 查询redis缓存,若存在记录,则直接存入Ehcache,并返回。如果不存在,考虑未维护数据的情况,酌情考虑将空数据存入Ehcache,以减小高并发访问redis的风险。

以上通过将多字段查询条件转换成表主键的操作,并通过二级缓存Ehcache和一级缓存redis的配合使用,来提高查询服务的性能。优化后的压测结果以及线上的运行情况如下:

测试环境

调用量

响应时间

TPS99

TP999

 

 

 

 

 

生产环境

日调用量

调用耗时

平均响应时间

TPS99

TP999

2000W+

1ms

5ms

10ms

 

© 著作权归作者所有

mengjunxiaoxiang
粉丝 0
博文 4
码字总数 2800
作品 0
南京
程序员
私信 提问
SQL-SQL优化-索引

图文并茂详解 SQL JOIN Join 是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用 Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一...

掘金官方
2017/12/25
0
0
android求职

尹盼 基本信息 性别: 女 出生日期: 1989-10-30 目前所在地: 北京 大兴 电话: 15901440917 电子邮件: 953768578@qq.com QQ: 953768578 求职意向 工作性质: 全职 职位类别: 手机应用开...

蜡笔小溪2
2013/07/27
607
6
如何安全的存储用户的密码【摘】

大多数的web开发者都会遇到设计用户账号系统的需求。账号系统最重要的一个方面就是如何保护用户的密码。一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密...

城邑耕夫
2014/03/17
145
1
用户中心系统设计

背景 一般来说大型互联网公司会把授权和用户信息的逻辑放到一个应用中,而这个应用我们统一称为用户中心。 用户中心不关心具体的业务逻辑,只处理用户信息相关的管理及授权登录。当第三方应用...

6776jkjk
2017/12/17
0
0
一次SQL语句优化的反思:技术和业务的脱节如何解决?

作者介绍 今天本人不妨对一条不太复杂的SQL语句在技术上进行深入剖析,与大家共同分享其中的实施经验和实施方法,更对其中折射出的一些深层次问题发表些许感悟。 这是一条来自某行业数据仓库...

罗敏
2016/09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ForkJoinPool线程池

1. 拆分线程池的使用场景是什么? 答: 是对一组连续的数据进行耗时操作,例如 一个 大小为 10000 的集合 进行操作。 例子: 对1000万个数据进行排序,那么会将这个任务分割成两个500万的排序...

杨凯123
3分钟前
1
0
在多列上使用group by

我理解GROUP BY x的观点 但GROUP BY x, y如何运作的,它是什么意思? #1楼 Group By X表示将所有具有相同X值的组合放入一组中 。 Group By X, Y表示将所有具有相同值的值放在一个组中的X和Y...

技术盛宴
18分钟前
2
0
线程池ThreadPoolExecutor的内部类Worker的感想和思考

Worker依然是一个Runnable,封装了一个创建自己的原因对象,就是firstTask变量,和自己将要执行的所在线程thread变量。 thread成员变量可以直接被外部类ThreadPoolExecutor所获得,当调用add...

萧默
58分钟前
2
0
Git推送错误“ [[远程拒绝]主机->主机(分支当前已签出)”)

昨天,我发布了一个有关如何将Git存储库从我的一台计算机克隆到另一台计算机的问题 , 如何从另一台计算机“ git clone”? 。 现在,我可以成功地将Git存储库从源(192.168.1.2)克隆到目标...

javail
今天
4
0
Selenium 4.0 Alpha更新日志

早在2018年8月,整个测试自动化社区就发生了一件重大新闻:Selenium的创始成员Simon Stewart在班加罗尔Selenium会议上正式确认了Selenium 4的发布日期和一些重要更新。 Selenium 4.0 Alpha版...

八音弦
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部