CrazyCodes

CrazyCodes 查看完整档案

北京编辑北京邮电大学  |  计算机信息技术 编辑学两招  |  PHP开发工程师 编辑 blog.fastrun.cn 编辑
编辑

https://github.com/CrazyCodes... 我的博客
_
| |__ __ _
| '_ | | | |/ _` |
| |_) | |_| | (_| |
|_.__/ \__,_|\__, |

         |___/   感谢生命可以让我成为一名程序员

                         CrazyCodes To Author

个人动态

CrazyCodes 赞了文章 · 今天 09:54

漫画 | 遇上个傻屌领导是什么体验??

今天这篇漫画的灵感来源于知乎的万赞回答,也有一部分原因是因为最近工作状态的真实写照吧, 它讲述的是程序员工作中的bug是如何产生的,以及作为一名优秀的程序员,如何把握好你跑路的时间呢?

一起来看看发生了什么吧……

情节纯属虚构,如有雷同,纯属巧合..

1
2
3456789101112

编后

俗话说:千里之堤,溃于蚁穴,作为一名程序员,或多或少都有类似的经历吧,一个小小的bug,即能把整个系统搞挂。

而bug的产生,大多源于遇上不懂技术的领导或老板,到处跟业务部门、客户等吹牛逼,保证项目开发能有多快、多好、多稳,但当真正需求出来后,经过开发人员评估,时间远远超出他吹牛皮的范围,然后就开启了压迫模式,逼程序员加班加点,缩短项目周期来补全他的面子,导致项目基础构架不到位,测试用例范围不够广,就像漫画中的情节一样,地基不牢,摇摇晃晃勉强上线了,后期无法维护,改一个地方有十个地方会受到影响,用户的行为超出测试用例范围外,系统立刻崩溃~,然后老板知道后,颜面尽失,反过来又指责程序员.

到最后程序员无法忍受,只好跳槽跑路,新来的接盘侠对项目完全不了解,在迷宫一样的系统里垂死挣扎,改好一个bug引发了另外100个问题,如此反复循环……,而老板/领导完全自我良好,认识不到自己的问题…

程序员真的是太难了…

参考资料

  • Bug是如何产生的
  • www.zhihu.com/question/365343579/answer/967299388

文中部分素材来源网络,如有侵权,请联系删除

话说王大拿跑路之后,
去了哪里?
发生了什么意想不到的事呢?
敬请期待下一篇哦~...

本文系 “ 前端布道师 ” 原创
转载请先微信联系苏南 (su-south)授权,并标明出处!

撰稿:苏南、哒柏
插画 / 排版:苏南

往期回顾

image
image
小公司卧薪尝胆三年,意外拿到美团offer
人到中年,一地鸡毛
前端发展史的江湖恩怨情仇
揭密微信是如何诞生的?

前端布道师-苏南著作

更多精彩,欢迎关注我们

本文首发于公众号:前端布道师

链接:https://mp.weixin.qq.com/s/um1mYo3k0i8OAtdnTr_a7w

转载请联系微信:su-south 授权

用漫画解读前端技术,执笔演绎程序人生,愿吾手中笔,能博君(卿)一笑
Github地址:更多有趣漫画https://github.com/meibin08/comics-program-life欢迎 Star、watch

查看原文

赞 8 收藏 2 评论 5

CrazyCodes 关注了用户 · 1月13日

沈唁 @sy_records

GitHub:@sy-records

新浪微博:@你飞

公众号:沈唁志

Welcome to follow me

关注 70

CrazyCodes 发布了文章 · 1月1日

2021 PHP程序员修炼秘籍

image

前言

嗨喽,大家好,我是CrazyCodes,祝思否的小伙伴新年快乐,依照惯例,在2021年的第一天,为大家献上2021年PHP程序员修炼秘籍

2020

回顾2020年,新冠病毒肆虐全球,不易的一年,就这样一晃而过,还记得2020年的春节,全国洋溢着春节的气息,当疫情爆发的那一刻,举国上下齐心协力,抵御疫情,致敬奋战在一线的白衣天使、抗疫工作者!

WechatIMG61.png

语言

在编程语言社区 TIOBE 发布的 12 月份的编程语言排行榜。根据表中显示,12 月 C 语言排名第一,Java 降至第二位,Python 排列第三,与去年同期相同。C++、C# 分别位列第四、第五
image.png
我们PHP开发语言在第八位,我说这些想表达什么呢?是想要告诉广大的PHP开发工程师,不要被社会焦虑所控制,这一年来在知乎、简书、CSDN等等各渠道看到的很多文章,标题大概是这样的《PHP还能活多久》《PHP为什么会成为冷门》等等一系列的描述,前两年文章中我会列出一些数据来说明PHP还在不断发展或者说明PHP的市场占有率,这次不在做相关的阐述,以下说几点

  • 语言只是工具,当你做一个WEB应用你会选择PHP或JAVA,如果你需要处理大量数据,我会推荐你使用Python
  • 存在即合理,每门语言都有它的历史发展,为推动社会所作出的卓越贡献。
  • 不同语言所涉及的领域不同,如果你边用PHP搬砖,边看着人家开发桌面应用,恐怕你只有看着的份。
  • 根据不同需求选择不同语言,不必再纠结哪个会活哪个会死
  • 社区的不断发展壮大是开发语言发展的助推器

如果你真的喜欢PHP这门开发语言,那就去PHP相关社区多做贡献,以体现你真的热爱它。

基础

我是一名北邮计算机专业的自考生,在自考的过程中,深有体会计算机基础对一名程序员的重要性,我见过很多程序员吐槽很多公司面试要出一些算法题,数据结构题,要是面大厂,就说大厂苛刻,面中厂小厂,就说人家学大厂。其实我以前也是这么想的,但自从开启了基础知识学习的那一刻,我开始蔑视自己以往的想法。

可以这么说吧,如果你没有看过C,没有学习过数据结构,操作系统,你不会写出好的代码,更别提成为一个牛X的程序员。这个为什么不能,一言两语说不清楚,如果你感觉我在吹牛皮,不妨去学习下,并且带着你的认知来反驳我

奉上我的自考科目,自考科目与统招学习的科目不同,难度会降低不少,你可以先从这里开始

  • 《数据结构导论》
  • 《操作系统概论》
  • 《软件开发工具》
  • 《数据库系统原理》
  • 《C++程序设计》
  • 《计算机网络原理》
  • 《高级语言程序设计(一)》

无论你是做什么语言开发,在什么行业,C语言是你必须精通的一门语言,可能你会说“什么?要精通?”,在你跟我抬杠前,先至少熟悉了在来。

这这里我再分享下,今年我在极客时间购买的课程 (排名不分先后)

  • 陈旸老师的 《SQL必知必会》
  • 刘超老师的 《趣谈网络协议》
  • 张磊老师的 《深入剖析Kubernetes》
  • 陶辉老师的 《Nginx核心知识100讲》
  • 丁奇老师的 《MySQL实战45讲》
  • 陈皓老师的 《左耳听风》

如果你对我的路线感兴趣,非要让我推荐一个课先来学习的话,我推荐你购买陈皓老师的《左耳听风》,如果非让我给一个理由,那么我的理由是“先静心”

框架

image.png

2020年Laravel框架热度不减,生态圈也在不断壮大,我也是Laravel框架的重度使用者。但今年我不会强烈推荐你去学习它。

这要看你所处的环境与你需要做的应用,如果你身处一家小公司,其要求是快速迭代,那么Laravel框架会是你的首选,当然如果不是一家创业公司,其已经有了稳定的用户及一定量级的数据,那你也没得选,公司用什么你用什么。

不同场景,不同量级,选择不同的框架,这是一名理智的程序员可以做出的选择。

我强烈推荐你去学习使用 Swoole 与 Hyperf , 就算你不知道协程是个啥。

框架是语言更上层的东西,这里就不做过多阐述了。

如果你是一名新人,在研究到底选择怎样的一个框架去开启你的程序之路,那么我的建议是随便选一个就好。

PHP 8

image.png
PHP8带我们进入了一个全新的世界,是PHP历史发展过程中重要的里程碑。

你在实际工作中可能无法使用它,但我强烈强烈强烈建议你在本地安装并尝试使用它。

PHP官方关于PHP8的介绍,PHP官方还从来没有因为新版本单独拿出一个页面展示,可见官方对齐的重视

我之前有写过一篇相关文章,放到了下方。

社区

技术社区与技术讨论群在这里我一并讲下,学习的方式分两种,一种是主动学习,一种的被动学习,主动学习不多说,就是你主动去学习了解一些事物,被动学习这里指的是浏览技术社区和技术讨论群,保持持续学习的热情是必须的,但也要允许自己堕落一会,大脑长时间保持高速运转,人是受不了的。当你堕落的时候,不知道学点什么的时候,不妨溜溜技术社区,找些感兴趣的文章读一读,就当是课外读物了。

技术的深度和广度是同时存在的,深度代表你对某个领域的专业程度,广度则是对整个行业的宏观理解与认识。做一个有深度,有广度,有态度的程序员吧。

技术社区我经常逛这些,不要贪多,有几个就行

  • Segmentfault
  • Csdn
  • 掘金

关于技术讨论群,找一些话题讨论有深度的加入,这里的深度并不仅仅指的技术层。

如果在你的群列表内,经常出现有人问这段代码为什么报错,这个基础东西该怎么搞,或者天天有人让你砍一刀,建议你趁早退出,俗话说得好,物以类聚人以群分

English

英语,众所周知,是一门沟通语言,在计算机发展长河里,英语占有重要地位,看不懂英文,在技术这个行业里,就像你在中国不识字是一样的。

当然学习英语是一个保持持续热情的事情,如果你坚持不下来,但在日常开发中还躲不掉,这里我教你一个退而求其次的招数,你是不是经常打开github或者某个英文网站,英文文档,右键翻译该网站?我建议你在翻译前,先把要翻译的这段英文copy出来,对比着翻译后的结果,你可以大体知道哪个英文对应的中文是什么,久而久之,你看得懂的英文就会不断增加。

当然,这是一个最最差劲的办法,如果你还是想系统的学习,我这里还有个狠招,“消费你的人民币”,人都是有惰性的,这是人的天性,如果不用上班就可以有无穷无尽的财富,我想上班的人不会太多,报一个英语学习班,我指的是现场授课的那种。并不是某个英语学习APP,花个99元就想通读各大英文书籍文章。

当你花了钱,并且坐在教室里,会有一种莫名的驱动力驱动你这样去做。不妨试试?

创业

image.png

当你工作很多年后,肯定会多多少少有一些创业的想法,作为一名失败者,我劝你三思而后行,但也鼓励你激进做事。

拉卡拉董事长孙陶然先生对于创业者有这样一句忠告 “创业就是,做一个有人用的产品,并且把这个产品卖出去”

这是作为一名创业者首先要做的事情,而非所谓为了梦想。这也是一个很现实的事情,不是每个人都能做到像滴滴、抖音这些明星企业一样。

创业成功本身就是一件小概率事件,当你迈上这条路,首先你的技术就不是你的核心竞争力了。

每每写到创业,我都想多描述些,但碍于我也是一名失败者,作为一名失败者去教你如何创业,恐怕你失败的概率比我还高,就跟那些天天演讲成功学的“专家”,如果他成功了,恐怕不会去演讲这个东西。一个失败人去讲成功学,会把成功学讲的更失败。

如果你希望了解我的创业故事,可以私信我。

我很乐意把我的经历描述跟你听。

最后致敬所有的创业者,这个时代的逆行者。

致谢

如果你没细看我上面啰嗦的那些,那你可以看看这里的总结

  • 不要被贩卖焦虑
  • 保持持续的学习热情
  • 允许自己一时的堕落
  • 拥有扎实的基础
  • 要熟练使用C语言
  • 英语不能忽视
  • 创业要做足准备

感谢你看到这里,2021 我会在思否发布自己电商设计的录播课,也是我首个录播课。

希望本篇文章可以帮助到你,谢谢。

查看原文

赞 18 收藏 8 评论 6

CrazyCodes 赞了文章 · 1月1日

思否年度有奖征文丨你的 2020 留下了哪些印记?

image.png

2020年已经结束,这一年过的太快,让人产生了一种虚幻而错乱的穿越感,仿佛上一秒还在年初,下一秒就临近年尾。

但实际上这一年我们经历了太多,其中有恐慌、焦虑、辛酸和艰难,当然也有收获、快乐与感动。

回顾 2020 年,你最大的感受是什么?

作为一名开发者,你在 2020 又留下了哪些印记?

年底了,让我们一起回顾 2020,展望 2021,参加 SegmentFault 思否的年度有奖征文活动,来对自己的 2020年 做个总结吧~

如何参与?

一、活动规则

在思否社区写下你的「2020总结文章」,添加「2020总结」标签,并在文章注明超链接:

本文参与了 SegmentFault 思否征文「2020 总结」,欢迎正在阅读的你也加入。
二、文章内容

写下属于你的 2020 年 故事:标题不限,文体不限,语言不限,字数不限,自由发挥。

三、活动时间

自本篇文章发布始到 2021 年 1 月 31 日

有什么奖励 ?

image

实物奖品大合影

感谢融云RongCloud、青云QingCloud、京东智联云开发者社区、AWS、ARM中国 等对本次活动的赞助

编程课程8折劵(会在现有的折扣价上再打 8 折):

视频课程
图文课程

如何获奖?

当然,这些丰富礼品,要拿下以下这四个大奖才能得到~

  • 2020 人气顶流奖

    评选规则:社区文章互动数最多的(基于点赞、评论等)
    评选人数:【3人】
    💗奖励: 融云鼠标垫 + ARM 蓝牙音箱 + 京东玩偶 + 编程课程 8 折劵 各一份

  • 2020 凡尔赛文学奖

    评选规则:文笔超赞/分享硬核干货内容最多的
    评选人数:【3人】
    💗奖励: 青云定制包 + AWS 玩偶 + 技术书籍 + 编程课程 8 折劵 各一份

  • 2020 搞笑担当奖

    评选规则:内容最有趣的
    评选人数:【3人】
    💗奖励: 京东鼠标垫 + AWS 玩偶 + ARM 蓝牙音箱 + 编程课程 8 折劵 各一份

  • 2020 人间真爱奖

    评选规则:前【50人】(自本篇文章发布至1月31日)参与活动且文章符合要求被收录的征文作者即可获得奖励
    💗 奖励:1-20 可获得 SegmentFault 思否定制马克杯+ 编程课程 8 折劵, 21-50 可获得重启世界限量版手办 + 编程课程 8 折劵


2020 已经结束,2021 欣然赴约;凛冬过后,春天还会远吗?我们努力把 2021 过成梦想的样子...

温馨提示:

发布后在此帖下面留言,小姐姐会更快发现你的文章,获奖机会更大。
② 思否小姐姐会把优质文章汇总收录并发出,参与征文活动的优质文章内容会被推荐到社区首页技术交流群,分享给更多的开发者。
③ 除了以上的「四大奖」以外,还有神秘礼品,大家要积极参与哦~


扫码下方二维码,添加 SF 思否小姐姐 了解更多活动信息

思否小姐姐微信号

最终解释权归 SegmentFault 思否所有

参选文章汇总

  1. 欧雷属于我的三年·第一年
  2. Kevinwan一个20年技术老兵的 2020 年度技术总结
  3. 小傅哥2020总结 | 作为技术号主的一年!
  4. pingan87872020 总结 | 21 张图总结我的 2020 年
  5. 民工哥我的 2020 年是这样的。。你的呢?
  6. 沈唁今天,告别 2020 年。
  7. masonli“措手不及”的2020 | 2020总结
  8. 敲键盘的猫我的2020,在非常时期的非常努力
  9. 皮小蛋2020 年终总结
  10. Why技术2020,我这一年。
  11. xuexiangjys年终总结 | 在开源、博客和搬砖的路上砥砺前行「2020」
  12. codecraft2020年终总结
  13. 公丕昊再见,2020
  14. robin2020,再见
  15. 死月死月的二零二零总结
  16. linong2020总结😊我想混个奖品
  17. YourbatmanYourBatman 2020年感悟关键词:科比、裁员、管理层、活着
  18. 边城边城客栈的 2020
  19. Fw恶龙2020 年终盘点
  20. crazycode2021 PHP程序员修炼秘籍
  21. 波波Nadia我的 2020 个人成长回顾:花足够长的时间,有智慧地做“无用功”
  22. 折腾不止的追梦人我的2020,啪啪打脸
  23. Kense2020 年终总结
  24. 一个优秀的废人来年,做个俗人!
  25. formulahendry我的 2020:出书、办签售会、发展 VS Code 中文社区、成为开源先锋、全网 10 万粉丝、10 场演讲、内推 21 人
  26. 程序员哆啦A梦2020回顾-个人web分享JavaScript面试题附加回答
  27. Shenfq:普普通通打工人的2020
  28. HLQ_Struggle静心,未来可期 | 告别 2020
  29. 蒋鹏飞工作都是公司的,技术才是自己的!| 底层技术人的2020年度总结
  30. Raymond懒人的2020
  31. xindooXINDOO的2020总结
  32. tina6662020 疫情下湖北人的生活(只谈生活)
  33. 张喜硕度光阴的人
  34. JerryWang_汪子熙一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
  35. 夜尽天明前端工程师的 2020 年终总结 - 成长不及预期的 3 年之痒
  36. 张晋涛2020 小回顾 | 新晋程序员奶爸的云原生之路
  37. JamesGoodbye 2020 wassup 2021 | 2020 总结
  38. howie梦想开始的地方
  39. 运维汪回顾2020,展望202,确定三个关键字:自我成长、打地基、过男人关
  40. zangecizangeci的2020年度报告
  41. Meathill2020 年知识分享与学习总结
  42. 寒雁2021,一个长期主义者的年度计划
  43. 程序员cxuan:坚持并活下去!cxuan 在思否的 2020 年终总结。
  44. 芋头芒果小龙虾再见2020,再见口罩,再见所有的不愉快
  45. thinkwei全面建设小康社会的2020年
  46. Java中文社群大龄程序员10年编程生涯的转型之旅,2020年新的开始
  47. kumfo写在2020年结尾——2020总结
  48. qqxx6661阔别2020 | 我的年度总结
  49. 沉默王二2020总结文章|乘风破浪的一年
  50. joking_zhang2020 总结 | 张兜兜 - 神奇的一年
  51. Chor Chor 的 2020 年度总结 | 2020,再见;2021,你好
  52. 0xBoo二零二零年终总结
  53. 风中有php做的云洪光光的2020年
  54. 陆陆通通「2020总结」一个老程序员的 2020 年总结回顾,2021 年如何变的更牛逼
  55. By无邪2020年度总结
  56. 三掌柜2020年年度关于前端学习与工作的心得体会
  57. TianSong2020感谢每一天的陪伴
  58. Gopal:Gopal 的 2020 年度总结
  59. Mondo平凡的 2020 年
  60. 我是开发者FTD2020,再见;2021,我来了!
  61. 敖丙一年40W粉,小小程序员的2020年终总结
  62. 木易杨:我的 2020 总结,我在蚂蚁成长的这一年
  63. 蔚蓝2020 一个少年大厂梦的陨落与wlui的诞生

划重点

不要忘记在你的文章下添加「2020总结」标签,并在文章末尾处注明超链接 ——

本文参与了 SegmentFault 思否征文「2020 总结」,欢迎正在阅读的你也加入。
查看原文

赞 24 收藏 3 评论 49

CrazyCodes 发布了文章 · 2020-12-19

API调试工具大汇总

image.png

前言

大家好,我是CrazyCodes,今天总结下业界常见的API调试工具,众所周知,API调试工具即简单化的完成API调试流程,将Header、Cookie等其他频繁使用的参数进行复用,对不计其数的接口进行分类,方便查询管理。

Postman

image.png

Postman是一款强大网页调试工具的客户端,你能想到的,Postman几乎都提供了。Postman兼容几乎所有的操作系统,并且提供了WEB版本,可以让你随时随地加班,不错吧。言归正传,先看下postman的控制面板
image.png
面板分为三部分

顶部

image.png

  • 创建面板
  • 批量导入接口,我们可以将同事的接口进行批量导入
  • 接口批量测试
  • 切换工作空间,与git概念相似,不同的工作区(分支),进行不同的工作
  • 同步、登录等等其他操作,postman有自己的云存储,注册账号可以将本机的调试接口同步到云上,这样就可以随时随地加班喽,不过免费用户是有存储上限的,具体请查看官网

左侧

image.png

  • 历史请求,会记录所有的请求调试
  • 接口集合目录,将接口合理分类,是提升工作效率的最佳实践

右侧

image.png

调试内容区,我们可以在这里进行任何方式的接口调试,请求方式支持rest风格,put,get,patch,post等等,并且可以设置认证方式,设置自定义的header头,设置前置脚本,后置脚本,并且设定了环境变量的功能,我们可以根据自己的开发、测试、生产地址,配置不同的链接,实现地址复用

postman应该是开发人员众所周知的最佳api调试工具了,postman不仅仅是一个调试工作,也配备了项目管理,协作办公等功能,不过好像是收费的,具体可以在官网查询,官网地址我贴在下面了

https://www.postman.com/

Swagger

image.png

Swagger是一款强大的api文档工具,其生成的文档具备调试功能,它可以通过读取注释的方式,自动生成对应的api文档,并且支持将文档导出成其他格式,简直不要太好,官网还特意开发了一项展示文档的ui页面,开源课随意修改的,其细节比较多,是基于编码层次的,就不细细讲解了。感兴趣的小伙伴可以点击下方链接

具体的玩法请见github https://github.com/swagger-api

PhpStorm Http Client

image.png

我是一名php程序员,所以就以phpstorm为例来讲解下,当然jetbrains内所有的产品都具备此项功能,PhpStorm 为接口调试提供了专属的工具,我们在菜单Tools->Http Client 可以找到它, jetbrains 提供的此项接口调试功能是专门为程序员准备的,没有任何界面,接口调试什么的全靠码,不过我们可以以git最简单的方式去维护接口文档。

httpclient 通过创建demo.http文件来进行调试的,http是文件后缀
image.png
上图是官方给到的demo,可以通过点击Run All Requests In File 对接口进行访问,也可以点击每个接口地址前方的箭头进行单个接口调试,整体来说还是比较方便的,接口的解释与正常代码注释一样

http client还支持将curl请求直接导入到http文件中
image.png

当然依旧支持环境变量,支持方式是由一个单独的json配置文件控制
image.png
点击后会自动在根目录创建配置文件

{
 "dev": {
 "url": "http://dev.baidu.com"
 },
 "pro": {
 "url": "http://pro.baidu.com"
 }
}

我们可以在http文件内通过{{url}}调用该变量,dev和pro分别代表不同的环境,我们可以在此处选择不同的环境
image.png

总体来说,简单简约,可扩展性强,感兴趣的小伙伴可以试试

ApiPost

image.png

apipost是国人开发的一款api调试工具,功能与postman类型,但是全部中文,其使用文档也非常详细
https://doc.apipost.cn/

冲着这句话,也得支持下,强烈推荐!
image.png
如果你英文不太好,使用apipost你会get到很多postman的丰富功能
image.png
其没有web版本,但有linux,mac,windows客户端,做纯工具的公司不多了,让我们守住他们。

Apizza

image.png

功能与apipost、postman相似,同一类产品,但只有web端,感兴趣的小伙伴可以点击下方链接进入

https://www.apizza.net/

看云文档

看云是thinkphp官网的文档管理工具,该文档内可以创建api调试
image.png

感兴趣的可以点击下方链接了解
https://www.kancloud.cn/

Teambition

一款协作项目管理工具,阿里巴巴搞的,该工作内文档功能可以创建api文档,可进行请求调试,感兴趣的可以点击下方链接

http://teambition.com/

致谢

工具永远只是工具,排序无好坏之分,我们按需使用。

感谢你看到这里,谢谢。

查看原文

赞 12 收藏 6 评论 2

CrazyCodes 回答了问题 · 2020-12-08

昆 明 办 假 护 照/签 证

耗子尾汁........

关注 4 回答 3

CrazyCodes 赞了文章 · 2020-11-18

一次MySQL两千万数据大表的优化过程,三种解决方案!

问题概述

使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。

问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视。原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!!

我尝试解决该问题,so,有个这个日志。

方案概述

方案一:优化现有mysql数据库。优点:不影响现有业务,源程序不需要修改代码,成本最低。缺点:有优化瓶颈,数据量过亿就玩完了。

方案二:升级数据库类型,换一种100%兼容mysql的数据库。优点:不影响现有业务,源程序不需要修改代码,你几乎不需要做任何操作就能提升数据库性能,缺点:多花钱

方案三:一步到位,大数据解决方案,更换newsql/nosql数据库。优点:扩展性强,成本低,没有数据容量瓶颈,缺点:需要修改源程序代码

以上三种方案,按顺序使用即可,数据量在亿级别一下的没必要换nosql,开发成本太高。三种方案我都试了一遍,而且都形成了落地解决方案。该过程心中慰问跑路的那几个开发者一万遍 :)

方案一详细说明:优化现有mysql数据库

跟阿里云数据库大佬电话沟通 and Google解决方案 and 问群里大佬,总结如下(都是精华):

  • 1.数据库设计和表创建时就要考虑性能
  • 2.sql的编写需要注意优化
  • 3.分区
  • 4.分表
  • 5.分库

1.数据库设计和表创建时就要考虑性能

mysql数据库本身高度灵活,造成性能不足,严重依赖开发人员能力。也就是说开发人员能力高,则mysql性能高。这也是很多关系型数据库的通病,所以公司的dba通常工资巨高。

设计表时要注意:

  • 1.表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。
  • 2.尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。
  • 3.使用枚举或整数代替字符串类型
  • 4.尽量使用TIMESTAMP而非DATETIME
  • 5.单表不要有太多字段,建议在20以内
  • 6.用整型来存IP

索引

  • 1.索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
  • 2.应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描
  • 3.值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段
  • 4.字符字段只建前缀索引
  • 5.字符字段最好不要做主键
  • 6.不用外键,由程序保证约束
  • 7.尽量不用UNIQUE,由程序保证约束
  • 8.使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引

简言之就是使用合适的数据类型,选择合适的索引

选择合适的数据类型
(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
(2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
(3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽可能使用not null定义字段
(5)尽量少用text,非用不可最好分表 # 选择合适的索引列
(1)查询频繁的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:

原开发人员已经跑路,该表早已建立,我无法修改,故:该措辞无法执行,放弃!

2.sql的编写需要注意优化

1.使用limit对查询结果的记录进行限定

2.避免select *,将需要查找的字段列出来

3.使用连接(join)来代替子查询

4.拆分大的delete或insert语句

5.可通过开启慢查询日志来找出较慢的SQL

6.不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边

7.sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库

8.OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内

9.不用函数和触发器,在应用程序实现

10.避免%xxx式查询

11.少用JOIN

12.使用同类型进行比较,比如用'123'和'123'比,123和123比

13.尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

14.对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5

15.列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大

原开发人员已经跑路,程序已经完成上线,我无法修改sql,故:该措辞无法执行,放弃!

引擎

目前广泛使用的是MyISAM和InnoDB两种引擎:

MyISAM

MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:

1.不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁

2.不支持事务

3.不支持外键

4.不支持崩溃后的安全恢复

5.在表有读取查询的同时,支持往表中插入新纪录

6.支持BLOB和TEXT的前500个字符索引,支持全文索引

7.支持延迟更新索引,极大提升写入性能

8.对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

InnoDB

InnoDB在MySQL 5.5后成为默认索引,它的特点是:

1.支持行锁,采用MVCC来支持高并发

2.支持事务

3.支持外键

4.支持崩溃后的安全恢复

5.不支持全文索引

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表

MyISAM速度可能超快,占用存储空间也小,但是程序要求事务支持,故InnoDB是必须的,故该方案无法执行,放弃!

3.分区

MySQL在5.1版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引

用户的SQL语句是需要针对分区表做优化,SQL条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,可以通过EXPLAIN PARTITIONS来查看某条SQL语句会落在那些分区上,从而进行SQL优化,我测试,查询时不带分区条件的列,也会提高速度,故该措施值得一试。

分区的好处是:

1.可以让单表存储更多的数据

2.分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作

3.部分查询能够从查询条件确定只落在少数分区上,速度会很快

4.分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备

5.可以使用分区表赖避免某些特殊瓶颈,例如InnoDB单个索引的互斥访问、ext3文件系统的inode锁竞争

6.可以备份和恢复单个分区

分区的限制和缺点:

1.一个表最多只能有1024个分区

2.如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来

3.分区表无法使用外键约束

4.NULL值会使分区过滤无效

5.所有分区必须使用相同的存储引擎

分区的类型:

1.RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区

2.LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择

3.HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式

4.KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值

5.具体关于mysql分区的概念请自行google或查询官方文档,我这里只是抛砖引玉了。

我首先根据月份把上网记录表RANGE分区了12份,查询效率提高6倍左右,效果不明显,故:换id为HASH分区,分了64个分区,查询速度提升显著。问题解决!

结果如下:PARTITION BY HASH (id)PARTITIONS 64

select count() from readroom_website; --11901336行记录

/ 受影响行数: 0 已找到记录: 1 警告: 0 持续时间 1 查询: 5.734 sec. /

select * from readroom_website where month(accesstime) =11 limit 10;

/ 受影响行数: 0 已找到记录: 10 警告: 0 持续时间 1 查询: 0.719 sec. */

4.分表

分表就是把一张大表,按照如上过程都优化了,还是查询卡死,那就把这个表分成多张表,把一次查询分成多次查询,然后把结果组合返回给用户。

分表分为垂直拆分和水平拆分,通常以某个字段做拆分项。比如以id字段拆分为100张表: 表名为 tableName_id%100

但:分表需要修改源程序代码,会给开发带来大量工作,极大的增加了开发成本,故:只适合在开发初期就考虑到了大量数据存在,做好了分表处理,不适合应用上线了再做修改,成本太高!!!而且选择这个方案,都不如选择我提供的第二第三个方案的成本低!故不建议采用。

5.分库

把一个数据库分成多个,建议做个读写分离就行了,真正的做分库也会带来大量的开发成本,得不偿失!不推荐使用。

方案二详细说明:升级数据库,换一个100%兼容mysql的数据库

mysql性能不行,那就换个。为保证源程序代码不修改,保证现有业务平稳迁移,故需要换一个100%兼容mysql的数据库。

开源选择

1.tiDB https://github.com/pingcap/tidb

2.Cubrid https://www.cubrid.org/

3.开源数据库会带来大量的运维成本且其工业品质和MySQL尚有差距,有很多坑要踩,如果你公司要求必须自建数据库,那么选择该类型产品。

云数据选择

1.阿里云POLARDB

2.https://www.aliyun.com/produc...

官方介绍语:POLARDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高可达 100T,性能最高提升至 MySQL 的 6 倍。POLARDB 既融合了商业数据库稳定、可靠、高性能的特征,又具有开源数据库简单、可扩展、持续迭代的优势,而成本只需商用数据库的 1/10。

我开通测试了一下,支持免费mysql的数据迁移,无操作成本,性能提升在10倍左右,价格跟rds相差不多,是个很好的备选解决方案!

1.阿里云OcenanBase

2.淘宝使用的,扛得住双十一,性能卓著,但是在公测中,我无法尝试,但值得期待

3.阿里云HybridDB for MySQL (原PetaData)

4.https://www.aliyun.com/produc...

官方介绍:云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical Processing)关系型数据库。

我也测试了一下,是一个olap和oltp兼容的解决方案,但是价格太高,每小时高达10块钱,用来做存储太浪费了,适合存储和分析一起用的业务。

1.腾讯云DCDB

2.https://cloud.tencent.com/pro...

官方介绍:DCDB又名TDSQL,一种兼容MySQL协议和语法,支持自动水平拆分的高性能分布式数据库——即业务显示为完整的逻辑表,数据却均匀的拆分到多个分片中;每个分片默认采用主备架构,提供灾备、恢复、监控、不停机扩容等全套解决方案,适用于TB或PB级的海量数据场景。

腾讯的我不喜欢用,不多说。原因是出了问题找不到人,线上问题无法解决头疼!但是他价格便宜,适合超小公司,玩玩。

方案三详细说明:去掉mysql,换大数据引擎处理数据

数据量过亿了,没得选了,只能上大数据了。

开源解决方案

hadoop家族。hbase/hive怼上就是了。但是有很高的运维成本,一般公司是玩不起的,没十万投入是不会有很好的产出的!

云解决方案

这个就比较多了,也是一种未来趋势,大数据由专业的公司提供专业的服务,小公司或个人购买服务,大数据就像水/电等公共设施一样,存在于社会的方方面面。

国内做的最好的当属阿里云。

我选择了阿里云的MaxCompute配合DataWorks,使用超级舒服,按量付费,成本极低。

MaxCompute可以理解为开源的Hive,提供sql/mapreduce/ai算法/python脚本/shell脚本等方式操作数据,数据以表格的形式展现,以分布式方式存储,采用定时任务和批处理的方式处理数据。DataWorks提供了一种工作流的方式管理你的数据处理任务和调度监控。

当然你也可以选择阿里云hbase等其他产品,我这里主要是离线处理,故选择MaxCompute,基本都是图形界面操作,大概写了300行sql,费用不超过100块钱就解决了数据处理问题。

作者:王帅
来源地址:https://yq.aliyun.com/article...

image

查看原文

赞 23 收藏 19 评论 1

CrazyCodes 关注了用户 · 2020-11-10

我的内心毫无波动 @wodeneixinhaowubodong

关注 0

CrazyCodes 赞了文章 · 2020-10-23

1024 思否有奖征文活动丨我和我的“格子衫”

image

提到程序员大家总会第一时间联想到“格子衫”,价格亲民、休闲百搭、面料舒适的格子衬衫正是 1024 前后秋季程序员的最爱。

但除了格子衫,其实程序员还有很多私藏好物,手感超好的机械键盘、996 都不怕的工学椅、大促时的云主机、all in one 超好用的项目管理工具防脱洗发水甚至程序员内裤……

欢迎参与 SegmentFault 思否 #1024 特别征文活动#,分享一件或几件你钟爱的好物。双十一的前奏,让我们供拟 “ 不踩坑剁手清单 ”,我们也将联合广大合作伙伴,为分享好物的开发者们送上一拨儿真正的“程序员好物”~

1024 思否征文活动丨我和我的”格子衫”

征文主题:#我和我的“格子衫”# 参选时间:2020年10月23日 - 11月11日

活动规则:请以在社区发布文章的形式参与本次征文活动,和大家进行程序员好物分享~

奖项设置:本次奖项分为「人气好物奖」、「效率大师奖」、「生活玩家奖」,「从头开始奖」此外可能还有各种惊喜附加的奖项等着大家,只要作品好,奖品少不了!具体奖品及评选标准如下:

  • 从头开始奖 x 15 名:率先提交作品,并满足征文质量要求的 15 名社区用户,将获得由 Menxlab 时光里赞助的臻享生发套装一份助你“聪明不绝顶”(市场价:358 元/套盒)
  • 人气好物奖 x 5 名:本奖项主要综合考量参选文章的阅读量、互动量等相关数据,奖品为 AWS 赞助的人气公仔 1 个;
  • 效率大师奖 x 5 名:本奖项主要根据推荐的好物为工作、生活所带来的实际效果为参考维度进行评选,奖品为京东智联云赞助的超大鼠标垫 1 个;
  • 生活玩家奖 x 5 名:本奖项将颁发给最会享受生活的生活节奏大师,奖品为 LeanCloud 赞助的「积木塔」 1 座;
  • 意外惊喜奖 x 若干名:只要作品好,奖品少不了,思否小姐姐正为大家四处奔波、搜集福利中……

image

备注:文章需添加 「1024-征文活动」为文章的标签,且在文章末尾超链接注明:

本文参与了 SegmentFault思否征文「1024 征文活动」,欢迎正在阅读的你也加入。

思否小姐姐会把优质文章汇总收录并发出,参与征文活动的优质文章内容,还将:

  • 被推荐到社区首页及技术交流群,分享给更多的开发者;
  • 获选的优质投稿内容,还将有机会获得社区精美礼品;
  • 小姐姐也喜欢穿格子衫,忙完这几天也会推荐一个属于自己的好物,为方便文章被尽快收录,文章发布后欢迎在此帖下面留言

PS:鼓励开脑洞,但禁止盗图或剽窃他人的生活

PSS:感谢本次活动礼品的赞助商:Menxlab时光里、AWS、LeanCloud、京东智联云开发者社区

PSSS:感谢每一个愿意分享生活片段、热爱生活的开发者们,谢谢大家!

如有疑问,可以扫码下方二维码,添加「SF 思否小姐姐」微信,欢迎咨询哦~

参选文章(持续更新中):

1、1024好物分享丨脱单不脱发,就靠它!
2、1024 程序员必备好物推荐 丨我和我的“格子衫”
3、1024 程序员必备好物推荐(vscode 插件) 丨我和我的“格子衫”
4、1024 程序员必备好物推荐 丨我和我的“颈椎按摩仪”
5、“智能手表让我和时间的博弈,略胜一筹”丨1024 征文活动
6、好物分享 | 键盘清洁泥与护眼仪
7、1024 程序员必备好物推荐丨我和我的防蓝光眼镜
8、作图神器ProcessOn - 免费好用
9、1024 程序员必备好物推荐丨保护我的颈椎和眼睛
10、1024 程序员必备好物分享丨我和我优秀的茶壶

查看原文

赞 13 收藏 1 评论 12

CrazyCodes 发布了文章 · 2020-10-23

电商系统设计之运费模板(下)

clipboard.png

电商大伙每天都在用,类似某猫,某狗等。
电商系统设计看似复杂又很简单,看似简单又很复杂
本章适合初中级工程师细看,大佬请随意

前言

在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在其内的设计中,要考虑的问题还是很多滴,上一章我们讲了运费的一些规则以及在数据库表中如何设计,本章聊聊如何计算运费

获取

通过上一篇文章我们建立的数据表获取该商品绑定的哪一个运费模版

$templateId = Product::where('id',$product)->value('template_id');
if($template == 0) return [];

指定商品或许会使用多项规则,例如像这样
image.png

  • 是否包邮
  • 指定地区运费
  • 达成某种条件下运费多少或者包邮

那这么多条件,我们要保证所有的规则全部都可以检索到,并且还要提升其计算速度。

在计算前,应当想好有几种可能性,再选择其优先级,就像有

三个不同颜色的球,拼凑的方法有多种一样

我记得这应该是一道小学的数学题。

就近原则

相比大家肯定做过这道面试题

把一份打乱的字符串,进行排序

那按照经典的方式

  • 快速排序
  • 选择排序
  • 插入排序
  • 冒泡排序

当然,我们不讲排序,我们是要通过这类算法去思考如何以快速的方式去查询到我们想要的信息。

排序算法归并与一点核心,就是通过比较的方式进行,无论是从中间开始进行计算,还是从头或者从尾开始,都是通过对字符串本身要呈现方式的一种猜测。

那我们对于运费计算,应该从什么位置开始“排序”呢?

根据业务,首先我们考虑关于是否包邮、指定地区运费、达成指定条件这三种规则,他们的优先级大多是这样的。

达成指定条件 > 指定地区运费 > 是否包邮

一、达成指定条件就不在计算指定地区条件和是否包邮
二、达成指定地区条件就不判断是否包邮

思路是不是清晰了一点呢,那么我们上代码

实战

演示为伪代码,这类计算肯定不能交给前端去计算,会出现很多安全问题,例如数据被篡改等等,偷懒的后端不是一个好后端

当我们获取templateId后,在表product_template_config中查询其关联的规则,这是一个一对多的数据列,意味着会查询出多条,首先我们先查询指定条件。

select count(1) product_template_config where template_id = $templateId and 是否有指定条件

当有指定条件则进行计算,例如

  • 达成指定金额,运费固定
  • 达成指定金额,运费多少

计算就简单了,小学就学过的嘛~

商品数量*商品单价 > 指定金额 = 运费

如果没有指定条件,则去查询指定城市运费,城市我们使用的是json存储,会有多条,免不了for,这样你肯定会说了,那很多个城市不会导致效率低嘛?

做任何功能都要以实际业务出发,除了西藏、新疆及偏远地区,会有商家一个市一个市设置不同运费的嘛😂,那我们就使用二种方式

第一种:死循环法

$list = "select * from `product_template_config` where template_id = $templateId";
$city = [];
for($list){
   if($list->city == "北京市"){
        return price;
   }
}

第二种:模糊查询

select * from `product_template_config` where city like "%北京市%"

like有时会导致索引失效,要特别注意

最后如果以上两种规则都不满足,则就回到最简单都自定义运费和是否包邮,自定义运费的话就计算最终运费,包邮的话,直接return 0就完事喽。

流程图如下

image.png

一些思考

至此,我们运费模版的设计和实战就到此结束了。

当然这仅仅是设计上的思路,使用该方法是承受不住访问冲击的,我仅仅提供思路而已。

最后我给一些思考,你不妨实践下。

1.检索优先级是我们预先设定的,可以每天定时去分析某个商家的设置习惯,例如商家经常都是设置包邮,那我们优先级的计算可以更换下位置。

2.对于并发过大的应用,不妨使用redis试试呢?变化的仅仅是数据结构~

3.根据用户购物习惯,去计算运费,有没有更多的实践呢?

4.考虑如果有免运费卷,或者运费优惠卷,应该加在哪个流程内呢?

任何一个简单的功能,在应用不断迭代中,都会变的不再简单。期待你们的最佳实践。

致谢

感谢你的关注,希望本篇文章可以帮到你,谢谢。

查看原文

赞 8 收藏 4 评论 1

CrazyCodes 收藏了文章 · 2020-10-21

图解你身边的 SOLID 原则

这篇文章我们来简单介绍一下 SOLID 原则(这五个字母代表了面向对象编程的五个基本原则)

我们用身边的事物来举例,让它们更易于理解和记忆。

好啦,开始吧~

S - 单一职责原则

Single Responsibllity Principle - 即 SRP

一个类只能承担一个职责。通俗点儿说就是一个类只能承担一件事,并且只能有一个潜在的原因去更改这个类,否则就违反了单一职责原则。

1_s.jpg

O - 开闭原则

Open/Closed Principle - 即 OCP

软件实体应该对 扩展 开放,对 修改 关闭。允许扩展行为而无需修改源代码。

2_o.jpg

L - 里氏替换原则

Liskov Substitution Principle - 即 LSP

程序中的对象应该可以被其子类实例替换掉,而不会影响程序的正确性。

3_l.jpg

I - 接口隔离原则

Interface Segregation Principle - 即 ISP

使用多个特定细分的接口比单一的总接口要好,不能强迫用户去依赖他们用不到的接口。

4_i.jpg

D - 依赖倒置原则

Dependency Inversion Principle - DIP

程序要依赖于抽象接口,而不是具体实现。

  • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
  • 抽象不应该依赖具体实现,具体实现应该依赖抽象

5_d.jpg

插头不应该依赖具体某种电线,它只需要有线并且能导电。

全文完~希望本文对你理解 SOLID 有帮助啦~

参考文章


本文首发于公众号:码力全开(codingonfire)

本文随意转载哈,注明原文链接即可,公号文章转载联系我开白名单就好~

codingonfire.jpg

查看原文

CrazyCodes 赞了文章 · 2020-10-21

图解你身边的 SOLID 原则

这篇文章我们来简单介绍一下 SOLID 原则(这五个字母代表了面向对象编程的五个基本原则)

我们用身边的事物来举例,让它们更易于理解和记忆。

好啦,开始吧~

S - 单一职责原则

Single Responsibllity Principle - 即 SRP

一个类只能承担一个职责。通俗点儿说就是一个类只能承担一件事,并且只能有一个潜在的原因去更改这个类,否则就违反了单一职责原则。

1_s.jpg

O - 开闭原则

Open/Closed Principle - 即 OCP

软件实体应该对 扩展 开放,对 修改 关闭。允许扩展行为而无需修改源代码。

2_o.jpg

L - 里氏替换原则

Liskov Substitution Principle - 即 LSP

程序中的对象应该可以被其子类实例替换掉,而不会影响程序的正确性。

3_l.jpg

I - 接口隔离原则

Interface Segregation Principle - 即 ISP

使用多个特定细分的接口比单一的总接口要好,不能强迫用户去依赖他们用不到的接口。

4_i.jpg

D - 依赖倒置原则

Dependency Inversion Principle - DIP

程序要依赖于抽象接口,而不是具体实现。

  • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
  • 抽象不应该依赖具体实现,具体实现应该依赖抽象

5_d.jpg

插头不应该依赖具体某种电线,它只需要有线并且能导电。

全文完~希望本文对你理解 SOLID 有帮助啦~

参考文章


本文首发于公众号:码力全开(codingonfire)

本文随意转载哈,注明原文链接即可,公号文章转载联系我开白名单就好~

codingonfire.jpg

查看原文

赞 18 收藏 11 评论 3

CrazyCodes 赞了问题 · 2020-10-21

php设计模式之适配器模式学习总结

一、什么是适配器模式

适配器模式是指通过适配器将原本不兼容的两个东西变得互相兼容

二、应用场景

当两个系统数据和行为都一样,但是接口不符合时,我们应该考虑使用适配器,适配器模式主要应用于希望复用现有的类,但是新的类又和原有的类不一致的情况其常见场景为:短信发送,聚合系统,支付系统

三、实例应用

1. 使用适配器(Adapter)实现短信发送实际案例
案例地址
Github地址: https://github.com/liuzhongsheng/SuperSms
实现目标:
多平台快速对接
多平台快速无缝切换
技术优势:
把每个短信平台看成一个适配器,新增短信平台时可快速添加,无需修改其他文件
运行流程:

image
以上为个人学习总结,如果有不对麻烦各位大佬多多指教,谢谢

关注 3 回答 1

CrazyCodes 回答了问题 · 2020-10-21

如何在不同服务中共用一套model层

承邀:
使用grpc,swoole建立微服务,将model层放入微服务中。例如 @风中有php做的云 给到你的答案。我没有这样做过,不过可以给你一些思路。

1.新建一个仅有Eloquent ORM的项目。
2.将所有model放入这个项目。这是我们的model微服务,composer+复制粘贴即可完成
3.在你原有的项目中需要实现model本身的方法,ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
4.最后,使用tcp或者http去通信你的微服务
5.微服务返回model实体
6.这样就无侵入的完成了model统一的需求

这仅仅是我的思路,未经过实践,建议不要使用在生产环境中。

关注 4 回答 3

CrazyCodes 赞了文章 · 2020-10-20

Hyperf 发布 v2.0.15 版本,企业级的 PHP 微服务云原生协程框架

更新内容

本周主要新增了部分特性,并修复了一些组件的 🐛Bug,继续提升 Hyperf 的稳定性,发布于 2.0.15 版。

建议用户使用以下命令更新此版本。

composer update "hyperf/*" -o

直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容

新增

  • #2654 新增方法 Hyperf\Utils\Resource::from,可以方便的将 string 转化为 resource

修复

  • #2634#2640 修复 snowflake 组件中,元数据生成器 RedisSecondMetaGenerator 会产生相同元数据的问题。
  • #2639 修复 json-rpc 组件中,异常无法正常被序列化的问题。
  • #2643 修复 scout:flush 执行失败的问题。

优化

  • #2656 优化了 json-rpc 组件,参数解析失败后,也可以返回对应的错误信息。

关于 Hyperf

Hyperf 是基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是 可替换可复用 的。

框架组件库除了常见的协程版的 MySQL 客户端Redis 客户端,还为您准备了协程版的 Eloquent ORMWebSocket 服务端及客户端JSON RPC 服务端及客户端GRPC 服务端及客户端OpenTracing(Zipkin, Jaeger) 客户端Guzzle HTTP 客户端Elasticsearch 客户端Consul、Nacos 服务中心ETCD 客户端AMQP 组件Nats 组件Apollo、ETCD、Zookeeper、Nacos 和阿里云 ACM 的配置中心基于令牌桶算法的限流器通用连接池熔断器Swagger 文档生成Swoole TrackerBlade、Smarty、Twig、Plates 和 ThinkTemplate 视图引擎Snowflake 全局ID生成器Prometheus 服务监控 等组件,省去了自己实现对应协程版本的麻烦。

Hyperf 还提供了 基于 PSR-11 的依赖注入容器注解AOP 面向切面编程基于 PSR-15 的中间件自定义进程基于 PSR-14 的事件管理器Redis/RabbitMQ 消息队列自动模型缓存基于 PSR-16 的缓存Crontab 秒级定时任务Sessioni18n 国际化Validation 表单验证 等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。

框架初衷

尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。

设计理念

Hyperspeed + Flexibility = Hyperf,从名字上我们就将 超高速灵活性 作为 Hyperf 的基因。

  • 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。
  • 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准 的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。

基于以上的特点,Hyperf 将存在丰富的可能性,如实现 单体 Web 服务,API 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。

文档齐全

我们投入了大量的时间用于文档的建设以提供高质量的文档体验,以解决各种因为文档缺失所带来的问题,文档上也提供了大量的示例,对新手同样友好。
Hyperf 官方开发文档

生产可用

我们为组件进行了大量的单元测试以保证逻辑的正确,目前存在 1551 个单测共 4813 个断言条件,Hyperf 是一款经历过严酷的生产环境考验的一个项目,目前已有很多的大型互联网企业都已将 Hyperf 部署到了自己的生产环境上并稳定运行。

官网及交流

Github 👈👈👈👈👈 点 Star 支持我们
Gitee 码云 👈👈👈👈👈 点 Star 支持我们
Hyperf 官网
Hyperf 文档
Hyperf 交流群(已满): 862099724
Hyperf 交流 2 群: 811414891

查看原文

赞 5 收藏 1 评论 0

CrazyCodes 发布了文章 · 2020-10-20

鼠标垫上的Git知识库

image.png

前言

Hello,大家好,我是CrazyCodes,之前在极客时间上买过一个git鼠标垫,感觉其知识点展示的非常干练,现手敲分享给大家,文末有购买链接。

Git最小配置

某账号下所有的Git仓库都有效

git config --global user.name '您的名称'
git config --global user.email '您的Email'

只对当前Git仓库有效

git config --local user.name '您的名称'
git config --local user.email '您的Email'

查看Git的配置

查看global类型的配置项

git config --global --list

查看只作用于当前仓库的配置项

git config --local --list

清除Git的配置

清除global类型的配置项

git config --unset --global 某个配置项

清除某个仓库的配置项

git config --unset --local 某个配置项

本地基本操作

查看变更情况

git status

查看当前工作在哪个分支上

git branch -v

切换到指定分支

git checkout 指定分支

把当前目录及其目录下所有变更都加入到暂存区

git add .

把仓库内所有变更都加入暂存区

git add -A

把指定文件添加到暂存区

git add 文件1 文件2 文件3

创建正式的commit

git commit 

比较某文件工作区和暂存区的差异

git diff 某文件

比较某文件暂存区和HEAD的差异

git diff HEAD 某文件

比较工作区和暂存区的所有差异

git diff --cached

把工作区指定文件恢复成和暂存区一样

git checkout 文件1 文件2 文件3

把暂存区指定文件恢复成和HEAD一样

git reset 文件1 文件2 文件3

把暂存区和工作区所有文件恢复成和HEAD一样

git reset --hard

用difftool比较任意两个commit的差异

git difftoll 提交A 提交B

查看哪些文件没被Git管控

git is-files --others

加塞临时任务的处理

把未处理完的变更先保存到stash中

git stash

临时任务处理完后继续之前未完的工作

git stash pop
或者
git stash apply

pop不保留stash,apply保留stash

查看所有的stash

git stash list

取回某次stash的变更

git stash pop stash@{数字n}

修改个人分支的历史

修改最后一次commit

  1. 在工作区修改文件
  2. git add .
  3. git commit --amend

修改中间的commit(代号x)

  1. git rebase -i X前面一个commit的id
  2. 在工作区修改文件
  3. git add .
  4. git rebase --continue

后续可能需要处理冲突,直到rebase结束

查看变更历史

当前分支各个commit用一行显示

git log --oneline

显示就近的n个commit

git log -n

用图示显示所有分支的历史

git log --oneline --graph --all

查看涉及到某文件变更的所有commit

git log 某文件

某文件各行最后修改对应的commit 以及作者

git blame 某文件

分支与标签

基于当前分支创建新分支

git branch 新分支

基于指定分支创建新分支

git branch 新分支 已有分支

基于某个commit创建分支

git branch 新分支 某个commit的id

创建分支并切换到该分支

git checkout -b 新分支

列出本地分支

git branch -v

列出本地和远端分支

git branch -av

列出远端所有分支

git branch -rv

列出名称符合某样式的远端分支

git branch -rv -l '某样式'

安全删除本地某分支

git branch -d 拟删除分支

强行删除本地某分支

git branch -D 拟删除分支

删除已合并到master分支的所有本地分支

git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d

删除远端origin 已不存在的所有本地分支

git remote prune origin

给commit打上标签

git tag 标签名 commit的id

两分支之间的集成

把A分支合入到当前分支,且为merge创建commit

git merge A分支

把A分支合入到B分支,且为merge创建commet

git merge A分支 B分支

把当前分支基于B分支做rebase,以便把B分支合入到当前分支

git rebase B分支

把A分支基于B分支做rebase,以便把B分支合入到A分支

git rebase B分支 A分支

用mergetool解决冲突

git mergetool

和远端的交互

列出所有remote

git remote -v

增加remote

git remote add url地址

删除remote

git remote remove remote的名称

改变remote的name

git remote rename 旧名称 新名称

把远端所有分支和标签的变更都拉到本地

git fetch remote

把远端分支的变更拉到本地,且merge到本地分支

git pull remote 名称 分支名

把本地分支push到远端

git push remote 名称 分支名

删除远端分支

git push remote --delete 远端分支名
或者
git push remote 远端分支名

向远端提交指定标签

git push remote 标签名

向远端提交所有标签

git push remote --tags

致谢

感谢你看到这里,希望本篇文章可以帮到你,谢谢。

鼠标垫内容作者:苏玲 购买链接

查看原文

赞 17 收藏 11 评论 2

CrazyCodes 发布了文章 · 2020-10-19

PHP8.x 你必须知道的这些新特性

前言

Hello 大家好,我是CrazyCodes,距离上次发文已经过去4个月的时间,今年是悲惨的一年,也是奋发的一年,我会发布一些更好更实用的文章与大家分享,谢谢大家一直以来的支持。

本篇是我参加《2020 PHP开发者峰会》 Nikita分享内了解到的一些知识与大家分享

Nikita 是PHP8的核心开发者。
PHP8的版本会在今年11月26日与各位开发者见面,敬请期待

JIT

值得被提起的则是JIT新的特性,它会将PHP代码转换为传统的机器码,而并非通过zend虚拟机来运行,这样大大的增加了运行速度,但并不向下兼容,这意味着你不能通过像PHP5升级到PHP7那样获得该特性。

JIT可以通过php.ini去设置,例如这样

opcache.jit=on // on 代表打开,则off代表关闭

注解

PHP8版本彻底把注解扶正,当然在这之前像 Symfony,hyperf通过php-parser加入注解的使用方法,但这毕竟不属于PHP8内核真正的部分,在PHP8的版本中,但依旧需要反射

new ReflecationProperty(User::class,"id");

去获取到注解部分,看来注解在PHP的历史长河中还是需要继续不断完善的。

类中的成员变量

小的知识点

在PHP8之前,我们一般会这样定义一个类,首先要设置成员变量,然后在构造或者某一个方法为它赋值。

class User{
    public $username;
    public $phone;
    public $sex;
    
    public function __contruct(
        $username,$phone,$sex
    ){
        $this->username = $username;
        $this->phone = $phone;
        $this->sex = $sex;
    }
}

但在PHP8上,我们可以这样做

class User{
    public function __contruct(
        public string $username = "zhangsan",
        public string $phone = "110110";
        public string $sex = "男"
    ){}
}

命名参数

当我们创建一个函数时,例如

function roule($name,$controller,$model){
    // ... code
}

在调用这个函数时,我们需要顺序输入参数

roule("user/login","UserController","login");

但在PHP8中,我们可以这样做

roule(name:"user/login",controller:"UserController",model:"login");

因为可以需要输入参数名来区分传入的字段,那么在一些函数中,类比中间某项这段需要默认值,那我们就可以跳过这个字段

function roule($name,$controller="UserController",$model){
    // ... code
}
roule(name:"user/login",model:"login");

当然也可以以传统方式与其相结合

roule("user/login",model:"login");

联合类型

在PHP7中,我们在强制函数返回类型时是这样做的

function create() : bool

那么在PHP8中你可以使用多种预测类型

function create() : bool|string

当然在传参时也可以这样做

function create(bool|string $userId)

并且也可以设置类型NULL和TRUE,FALSE了。

总结

以上是PHP8主要的一些特性,所有表达和案例都是在Nikita的基础上描述的,并没有直接照搬,当然Nikita的演讲并不仅仅只有这些,为了保持对峰会主办方的尊重,还请各位移步至
https://www.itdks.com/Home/Ac...
观看Nikita的完整演讲。

致谢

感谢你看到这里,希望本篇文章对你的技术生涯多一分动力,谢谢!

查看原文

赞 18 收藏 8 评论 6

CrazyCodes 赞了回答 · 2020-09-18

php设计模式之适配器模式学习总结

比如你后面说的 新增短信平台时可快速添加,无需修改其他文件,而其实这一部分就涉及到 模板模式 的内容,又比如你说的 单平台多通道、多平台多通道、通道快速无缝切换 ,其实这一部分又涉及到了 策略模式 的内容,设计模式是一种面向对象开发的概念,在开发过程中无意间都会用到各种设计模式,甚至都没有可以的去使用它。

关于设计模式学习,可以找到很多文章介绍, 但是大部分都是过于干燥,推荐下面这个网站,通过一些现实栗子和代码的结合来详细介绍每一个设计模式,让其可以深入的理解到每一个设计模式。

当然,不要忘了,面向对象设计的 S.O.L.I.D 原则

关注 3 回答 1

CrazyCodes 回答了问题 · 2020-09-17

解决讨论讨论短信发送多平台多通道的方案可行性

成熟的方案,就选择上面大佬的回答,想自己锻炼锻炼就写适配器,写策略。但如果投入生产环境,还请不要过度自信呦o( ̄︶ ̄)o

关注 4 回答 3

CrazyCodes 赞了回答 · 2020-09-17

解决讨论讨论短信发送多平台多通道的方案可行性

已经有这样的方案了,之前在项目中页做过这样的方案,还是比较常见的。

参考下面这个包

关注 4 回答 3