当前位置: 首页 > news >正文

网站建设焦作深圳电子商务网站制作

网站建设焦作,深圳电子商务网站制作,logo设计在线生成免费平台只需4步,wordpress自定义固定连接阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子#xff08;闯关游戏#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) count(主键id) count(普通索引列) count(未加索引列)myisam 有专门字段记录… 阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子闯关游戏 sql中各种 count 结论 innodb count(*) ≈ count(1) count(主键id) count(普通索引列) count(未加索引列)myisam 有专门字段记录全表的行数直接读这个字段就好了innodb则需要一行行去算 如果确实需要获取行数且可以接受不那么精确的行数只需要判断大概的量级 的话那可以用explain里的rows这可以满足大部分的监控场景实现简单 如果要求行数准确 可以建个新表里面专门放表行数的信息 如果对实时性要求比较高 的话可以将更新行数的sql放入到对应事务里这样既能满足事务隔离性还能快速读取到行数信息 如果对实时性要求不高 接受一小时或者一天的更新频率那既可以自己写脚本遍历全表后更新行数信息。也可以将通过监听binlog将数据导入hive需要数据时直接通过hive计算得出 不同存储引擎计算方式 count()方法的目的是计算当前sql语句查询得到的非NULL的行数 虽然在server层都叫count()方法但在不同的存储引擎下它们的实现方式是有区别的 比如同样是读全表数据 select count(*) from table (where *** )当数据表小的时候这是没问题的但当数据量大的时候比如未发送的短信到了百万量级 的时候你就会发现上面的sql查询时间会变得很长最后timeout报错查不出结果了 。 使用 myisam引擎 的数据表里有个记录当前表里有几行数据的字段直接读这个字段返回就好了因此速度快得飞起 使用innodb引擎 的数据表则会选择体积最小的索引树 然后通过遍历叶子节点的个数挨个加起来这样也能得到全表数据 区别 为什么innodb不能像myisam那样实现count()方法 最大的区别在于myisam不支持事务而innodb支持事务 而事务有四层隔离级别其中默认隔离级别就是可重复读隔离级别RR innodb引擎通过MVCC实现了可重复隔离级别 事务开启后多次执行同样的select快照读 要能读到同样的数据。 对于两个事务A和B一开始表假设就2条 数据那事务A一开始确实是读到2条数据。事务B在这期间插入了1条数据按道理数据库其实有3条数据了但由于可重复读的隔离级别事务A依然还是只能读到2条数据。 因此由于事务隔离级别的存在不同的事务在同一时间下看到的表内数据行数是不一致的 因此innodb没办法也没必要像myisam那样单纯的加个count字段信息在数据表上。 count() 类型 count方法的大原则是server层会从innodb存储引擎里读来一行行数据并且只累计非null的值 。但这个过程根据count()方法括号内的传参有略有不同。 count* server层拿到innodb返回的行数据不对里面的行数据做任何解析和判断 默认取出的值肯定都不是null直接行数1count(1) server层拿到innodb返回的行数据每行放个1进去默认不可能为null直接行数1. InnoDB 引擎遍历整张表但不取值。server 层对于返回的每一行放一个数字“1”进去判断是不可能为空的按行累加 count(字段 count(字段)是不统计字段值为null的值 count(主键 id) 来说InnoDB 引擎会遍历整张表把每一行的 id 值都取出来返回给 server 层。server 层拿到 id 后判断是不可能为空的就按行累加 count(字段)server要字段就返回字段如果字段为空就不做统计字段的值过大都会造成效率低下 由于指明了要count某个字段innodb在取数据的时候会把这个字段解析出来 返回给server层所以会比count(1)和count(*)多了个解析字段出来的流程 文 责任链模式 责任链模式是一种行为设计模式 允许你将请求沿着处理者链进行发送。收到请求后 每个处理者均可对请求进行处理 或将其传递给链上的下个处理者。 常见场景 多条件的流程判断如导入文件校验条件较多且需逐层校验成功的或类似闯关游戏必须达到一定分数/条件才能开始下一关 导入功能可能【模板方法】更适合 模板方法可以提供大部分相同的【模板】根据不同的导入场景做小部分调整实现各自独立的业务大体上导入功能差不多 一次性实现一个算法的不变部分并将可变的行为留给子类来实现 各子类中公共的行为被提取出来并集中到一个公共父类中从而避免代码重复 ERP 系统流程审批总经理、人事经理、项目经理Java 过滤器的底层实现 Filter 例子闯关游戏 假设现在有一个闯关游戏进入下一关的条件是上一关的分数要高于 xx 游戏一共 3 个关卡 进入第二关需要第一关的游戏得分大于等于 80 进入第三关需要第二关的游戏得分大于等于 90 简易版多层 if 逐层判断是否满足条件 //第一关 public class FirstPassHandler {public int handler(){System.out.println(第一关--FirstPassHandler);return 80;} }//第二关 public class SecondPassHandler {public int handler(){System.out.println(第二关--SecondPassHandler);return 90;} }//第三关 public class ThirdPassHandler {public int handler(){System.out.println(第三关--ThirdPassHandler这是最后一关啦);return 95;} }//客户端 public class HandlerClient {public static void main(String[] args) {FirstPassHandler firstPassHandler new FirstPassHandler();//第一关SecondPassHandler secondPassHandler new SecondPassHandler();//第二关ThirdPassHandler thirdPassHandler new ThirdPassHandler();//第三关int firstScore firstPassHandler.handler();//第一关的分数大于等于80则进入第二关if(firstScore 80){int secondScore secondPassHandler.handler();//第二关的分数大于等于90则进入第二关if(secondScore 90){thirdPassHandler.handler();}}} }实际上的 handle() 根据业务来传参及计算分数缺点 当关数越多/条件越多时代码会变得很长无限月读if 嵌套 if(第1关通过){// 第2关 游戏if(第2关通过){// 第3关 游戏if(第3关通过){// 第4关 游戏if(第4关通过){// 第5关 游戏if(第5关通过){// 第6关 游戏if(第6关通过){//...}}} }} }升级责任链链表拼接每一关 可以通过链表将每一关连接起来形成责任链的方式第一关通过后是第二关第二关通过后是第三关… 减少客户端代码过多的 if 嵌套 public class FirstPassHandler {/*** 第一关的下一关是 第二关*/private SecondPassHandler secondPassHandler;public void setSecondPassHandler(SecondPassHandler secondPassHandler) {this.secondPassHandler secondPassHandler;}//本关卡游戏得分private int play(){return 80;}public int handler(){System.out.println(第一关--FirstPassHandler);if(play() 80){//分数80 并且存在下一关才进入下一关if(this.secondPassHandler ! null){return this.secondPassHandler.handler();}}return 80;} }public class SecondPassHandler {/*** 第二关的下一关是 第三关*/private ThirdPassHandler thirdPassHandler;public void setThirdPassHandler(ThirdPassHandler thirdPassHandler) {this.thirdPassHandler thirdPassHandler;}//本关卡游戏得分private int play(){return 90;}public int handler(){System.out.println(第二关--SecondPassHandler);if(play() 90){//分数90 并且存在下一关才进入下一关if(this.thirdPassHandler ! null){return this.thirdPassHandler.handler();}}return 90;} }public class ThirdPassHandler {//本关卡游戏得分private int play(){return 95;}/*** 这是最后一关因此没有下一关*/public int handler(){System.out.println(第三关--ThirdPassHandler这是最后一关啦);return play();} }public class HandlerClient {public static void main(String[] args) {FirstPassHandler firstPassHandler new FirstPassHandler();//第一关SecondPassHandler secondPassHandler new SecondPassHandler();//第二关ThirdPassHandler thirdPassHandler new ThirdPassHandler();//第三关firstPassHandler.setSecondPassHandler(secondPassHandler);//第一关的下一关是第二关secondPassHandler.setThirdPassHandler(thirdPassHandler);//第二关的下一关是第三关//说明因为第三关是最后一关因此没有下一关//开始调用第一关 每一个关卡是否进入下一关卡 在每个关卡中判断firstPassHandler.handler();} }缺点 从代码中可以看到每一关的处理逻辑中都有一个 set**PassHandler() 方法只是参数类型不一样但是作用其实是一样的只是用来判断是否有下一关 每个关卡中都有下一关的成员变量并且是不一样的形成链很不方便代码扩展性不行 进化责任链改造—抽象 每个关卡中都有下一关的成员变量并且是不一样的那么我们可以在关卡上抽象出一个父类或者接口然后每个具体的关卡去继承或者实现将参数合并成一个不再需要在各自的 set**PassHandler 中传递不同的参数责任链设计模式的基本组成 抽象处理者Handler角色 定义一个处理请求的接口包含抽象处理方法和一个后继连接 具体处理者Concrete Handler角色 实现抽象处理者的处理方法判断能否处理本次请求如果可以处理请求则处理否则将该请求转给它的后继者 客户类Client角色 创建处理链并向链头的具体处理者对象提交请求它不关心处理细节和请求的传递过程 public abstract class AbstractHandler {/*** 下一关用当前抽象类来接收*/protected AbstractHandler next;public void setNext(AbstractHandler next) {this.next next;}public abstract int handler(); }public class FirstPassHandler extends AbstractHandler{private int play(){return 80;}Overridepublic int handler(){System.out.println(第一关--FirstPassHandler);int score play();if(score 80){//分数80 并且存在下一关才进入下一关if(this.next ! null){return this.next.handler();}}return score;} }public class SecondPassHandler extends AbstractHandler{private int play(){return 90;}public int handler(){System.out.println(第二关--SecondPassHandler);int score play();if(score 90){//分数90 并且存在下一关才进入下一关if(this.next ! null){return this.next.handler();}}return score;} }public class ThirdPassHandler extends AbstractHandler{private int play(){return 95;}public int handler(){System.out.println(第三关--ThirdPassHandler);int score play();if(score 95){//分数95 并且存在下一关才进入下一关if(this.next ! null){return this.next.handler();}}return score;} }public class HandlerClient {public static void main(String[] args) {FirstPassHandler firstPassHandler new FirstPassHandler();//第一关SecondPassHandler secondPassHandler new SecondPassHandler();//第二关ThirdPassHandler thirdPassHandler new ThirdPassHandler();//第三关// 和上面没有更改的客户端代码相比只有这里的set方法发生变化其他都是一样的firstPassHandler.setNext(secondPassHandler);//第一关的下一关是第二关secondPassHandler.setNext(thirdPassHandler);//第二关的下一关是第三关//说明因为第三关是最后一关因此没有下一关//从第一个关卡开始firstPassHandler.handler();} }从代码中可以看到此次进化引入了一个 抽象处理者让每一关的具体处理者都继承该类后续在设置下一关对象的时候就不必各自编写各自的set**PassHandler() 方法而是直接使用相同的处理方法只需要编写各自的 handler() 得分方法进一步简化了代码 终极进化责任链工厂改造 public enum GatewayEnum {// handlerId, 拦截者名称全限定类名preHandlerIdnextHandlerIdAPI_HANDLER(new GatewayEntity(1, api接口限流, cn.dgut.design.chain_of_responsibility.GateWay.impl.ApiLimitGatewayHandler, null, 2)),BLACKLIST_HANDLER(new GatewayEntity(2, 黑名单拦截, cn.dgut.design.chain_of_responsibility.GateWay.impl.BlacklistGatewayHandler, 1, 3)),SESSION_HANDLER(new GatewayEntity(3, 用户会话拦截, cn.dgut.design.chain_of_responsibility.GateWay.impl.SessionGatewayHandler, 2, null)),;GatewayEntity gatewayEntity;public GatewayEntity getGatewayEntity() {return gatewayEntity;}GatewayEnum(GatewayEntity gatewayEntity) {this.gatewayEntity gatewayEntity;} }public class GatewayEntity {private String name;private String conference;private Integer handlerId;private Integer preHandlerId;private Integer nextHandlerId; }public interface GatewayDao {/*** 根据 handlerId 获取配置项* param handlerId* return*/GatewayEntity getGatewayEntity(Integer handlerId);/*** 获取第一个处理者* return*/GatewayEntity getFirstGatewayEntity(); }public class GatewayImpl implements GatewayDao {/*** 初始化将枚举中配置的handler初始化到map中方便获取*/private static MapInteger, GatewayEntity gatewayEntityMap new HashMap();static {GatewayEnum[] values GatewayEnum.values();for (GatewayEnum value : values) {GatewayEntity gatewayEntity value.getGatewayEntity();gatewayEntityMap.put(gatewayEntity.getHandlerId(), gatewayEntity);}}Overridepublic GatewayEntity getGatewayEntity(Integer handlerId) {return gatewayEntityMap.get(handlerId);}Overridepublic GatewayEntity getFirstGatewayEntity() {for (Map.EntryInteger, GatewayEntity entry : gatewayEntityMap.entrySet()) {GatewayEntity value entry.getValue();// 没有上一个handler的就是第一个if (value.getPreHandlerId() null) {return value;}}return null;} }public class GatewayHandlerEnumFactory {private static GatewayDao gatewayDao new GatewayImpl();// 提供静态方法获取第一个handlerpublic static GatewayHandler getFirstGatewayHandler() {GatewayEntity firstGatewayEntity gatewayDao.getFirstGatewayEntity();GatewayHandler firstGatewayHandler newGatewayHandler(firstGatewayEntity);if (firstGatewayHandler null) {return null;}GatewayEntity tempGatewayEntity firstGatewayEntity;Integer nextHandlerId null;GatewayHandler tempGatewayHandler firstGatewayHandler;// 迭代遍历所有handler以及将它们链接起来while ((nextHandlerId tempGatewayEntity.getNextHandlerId()) ! null) {GatewayEntity gatewayEntity gatewayDao.getGatewayEntity(nextHandlerId);GatewayHandler gatewayHandler newGatewayHandler(gatewayEntity);tempGatewayHandler.setNext(gatewayHandler);tempGatewayHandler gatewayHandler;tempGatewayEntity gatewayEntity;}// 返回第一个handlerreturn firstGatewayHandler;}/*** 反射实体化具体的处理者* param firstGatewayEntity* return*/private static GatewayHandler newGatewayHandler(GatewayEntity firstGatewayEntity) {// 获取全限定类名String className firstGatewayEntity.getConference(); try {// 根据全限定类名加载并初始化该类即会初始化该类的静态段Class? clazz Class.forName(className);return (GatewayHandler) clazz.newInstance();} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {e.printStackTrace();}return null;}}public class GetewayClient {public static void main(String[] args) {GetewayHandler firstGetewayHandler GetewayHandlerEnumFactory.getFirstGetewayHandler();firstGetewayHandler.service();} }待深究 文
http://www.pierceye.com/news/576065/

相关文章:

  • 网站如何适应屏幕做网站时无法上传图片
  • 网站的橱窗怎么做嘉兴住房和城乡建设厅网站
  • 吉林省城乡建设官方网站163企业邮箱登录入口官网
  • 做网站参考文献某企业网站建设方案2000字
  • 网站托管哪家好织梦购物网站整站源码
  • 怎么做网站的优化排名wordpress的目录结构(一)
  • 个人可以做公益网站吗美食杰网站的建设目的
  • 宿迁公司企业网站建设《网站基础建设-首保》
  • 做全屏式网站尺寸是多大国外虚拟主机 两个网站
  • 黑龙江建设网站招聘广西住房和城乡建设厅培训中心官方网站
  • 做网站客户最关心的是什么制作网页原型的目的
  • 电子商务网站建设工具河南安阳吧
  • 南通网站建设公司哪个好肯德基的网站建设
  • 高端大气网站源码wordpress做双语网站
  • 360网站推广东莞凤岗
  • 公司网站高端网站建设赣州做网站多少钱
  • dw做网站怎么发布建设银行官方网站登录入口
  • 怎样查看网站建设时间免费外贸自建网站
  • 网站备案注销原因网站建设入账
  • 番禺做网站哪家好wordpress 样式引用
  • 网站研发进度表下载网站建设亿码酷适合5
  • 对网站域名销户怎么做舆情监控都有哪些内容
  • 南宁做网站优化企业网站开发合同
  • 网站做京东联盟公司注册网上核名入口
  • jsp做的零食网站下载一分钟做网站
  • 营销网站竞品分析报告上海平面网站
  • 网站建设 邦机票网站制作
  • 网站开发从整体上用vps刷网站流量要怎么做
  • 搭建一个网站 优帮云网站无法访问的原因
  • 卖印花图案设计网站北京管庄网站建设公司