自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (2)
  • 收藏
  • 关注

原创 短文介绍mDNS

当有一台新的设备加入后,如果它也开启了mDNS服务,那么就会询问局域网内其他提供mDNS服务的主机询问是否有对应服务,上面已向自己的mDNS服务注册信息的mDNS会告诉我提供你要的东西,并把相应信息返回给请求mDNS.那么mDNS就是解决这个问题的了。对于任何一个开启mDNS服务的主机,当加入局域网之后,就会向mDNS服务注册自己的信息,告诉他们我提供什么服务,我自己的IP是什么。今天在看个人网站上看见N年前写的一个小短文,介绍了mDNS,说实话,写完过几年我也都忘了,真是迁移的过程会发现宝藏,哈哈。

2024-04-19 14:13:08 238

原创 当面试官的一些想法

前天被同事拉去面试了,一天面试很多人,很是疲惫。之前在小米的5年,也总是被组长拉去当面试官。虽然我个人已经对这种事很厌倦了,但在面试过程中获得的一些收获还是不错的。今天也就从面试官的角度来给一些小建议。事先声明哈,我不喜欢好为人师,只是单纯谈谈自己的感受。

2024-04-18 15:13:58 452

原创 Redis常见的一些问题和注意事项

本文汇总的都是在我们公司出现过的常见问题以及自己曾经记录的注意事项。我们公司sentinel模式以及RedisCluster集群两种部署方式都有使用,下面问题有些可能是哨兵模式下存在的,比如批量操作,下面可能不会特别说明。

2024-04-07 21:34:25 662

原创 HbnnMall电子商城系统介绍(功能与技术栈)

整个系统的架构是这样:上面也说了,我的初衷是学习,所以并不像很多现成的电商系统,所有东西都揉到一起写的,而是拆分出多个微服务,采用Dubbo+nacos实现服务注册和发现。我开发的电商系统并不是完整的,像支付、物流、退款等都没有写,不过当时在开发的过程中,的确又学到了很多。网上也有很多开源的系统,尤其是听说那些报培训班的都有电商系统开发。虽然本人对培训班嗤之以鼻,不屑于多看他们一眼,但所谓存在的就是合理的,他们弄电商系统也侧面说明这玩意是有实战意义的,实战一段时间后还是有提高的。

2024-04-03 11:24:42 1269

原创 数据库嵌套事务的实现

这里额外多说一句,Spring的事务是通过代理实现的,所以要在使用中要额外注意,我之前看同事的代码就会经常出现事务失效的问题,出现最多的就是类的内部调用,即某个方法调用同一个类中的某个被Transactional装饰的方法,这肯定是失效的,因为其绕过了代理,直接调用的是目标对象的方法。不过我们可以借助savepoint来实现嵌套事务,目前很多的应用框架都通过savepoint实现了事务嵌套,比如著名的laravel,这是php领域内的一个比较牛逼的web框架,地为堪比JAVA的spring。

2024-04-02 17:35:09 698

原创 数据访问组件功能简单介绍

本文只是简单介绍下我所开发的数据访问组件,后续我会不断补充新增的功能,并会把具体的技术实现方案补充上。t=N7T8t=N7T8大道至简,聊聊工作中需注意的数据库开发规范https://blog.csdn.net/hbnn111/article/details/136346909复盘公司生产事故后的一些感想https://blog.csdn.net/hbnn111/article/details/135118577。

2024-04-02 11:18:38 633

原创 写在我来到银行一年后,将年满35岁之时

2015年5月,我从北京交通大学硕士毕业,离开了生活近7年的学校,走进了社会。截止到现在已经工作了将近9年,共三份工作经历。人们常说,毕业5年之后,同学之间就会拉开肉眼可见的差距,我是相信的,现在我的大学同学很多都要比我出色得多。如果用几个关键词总结我前9年的职业生涯,”平庸“、”失败“、”优柔寡断“、”懦弱“等负面词都很恰当。所以如果这篇文章被外人看到,那我就应该是一个反面例子。

2024-04-01 16:12:47 995

原创 LVS几种模式介绍

LVS,linux virtual server,可提供IP网络层的负载均衡。其主要模式主要有以下几种:LVS-NAT 主要通过网络地址转换,修改目的IP实现。LVS-TUN 主要封装一层IP头 IP TunnelingLVS-DR 主要是修改目的MAC Direct RoutingLVS-FULLNAT 这个是阿里研发的一种模式,主要是解决多vlan的场景,它会修改请求报文的(源/目的)地址、(源/目的)端口。先看几个LVS的名词定义:CIP:客户端ip。

2024-03-29 18:01:00 680

原创 2023年后端面试总结

为了面试,我准备了很多,基础知识,工作项目,数据结构和算法,中间件,系统架构等等,说实话这要比考试难多了,因为没有考试大纲,只能广度和深度两手抓,两手硬。八股文反复得看,算法反复得刷,算法之前一直是我的弱项,刷了忘,忘了刷,突然某一天,我刷着刷着感觉自己打通了任督二脉,后来面试的时候基本上都是短时间高质量完成,即便是被称为算法收割机的字节,我也顺利通过了。当然,能力仍然还是主要因素,是敲门砖。我需要主动求变,走出去,这是我要迈出的第一步,也许前路坎坷,充满未知,但未来征途,一片大海,有挑战,亦有精彩。

2024-03-29 17:48:02 964 1

原创 支付系列——从支付宝与银联的多年恩怨说起

备注:本文纯属个人观点,可能会有错误,但不接受反驳,哈哈!同时,本文没写太多专业术语,只是科普和胡侃!2003年,马云刚创立淘宝网不久,为了能够提供更便捷的支付方式,马云叩开了银联的大门,求着银联一起合作开发线上支付工具,结果遭到拒绝,恩怨从此形成,只不过银联自己当时还没认识到问题的严重性。被拒绝之后,马云索性自己干出来一个支付宝,并且得益于淘宝网的快速发展,支付宝也得到了飞速地成长,快到都没给银联反应时间。等银联真正反应过来后,它以命令的口吻敦促所有支付结构必须接

2024-03-28 19:36:27 910

原创 JVM知识整体学习

虚拟机栈:由栈帧组成,是线程私有的。实际上,由于本环节会扫描整个堆(虽然是回收老年代,但也有可能,有些新生代会引用老年代对象),因此在真正进行重新标记之前,会进行可中断的预处理,目的就是为了能够进行一次Minor GC,从而回收一些新生代的对象,减少重新标记时堆的扫描时间。上述就是CMS的整个过程,优点很明显,提高了效率,但缺点也很明显,一是它采用标记-清除算法(之所以选择标记清除,是因为回收是并发执行的,如果采用标记整理或者复制,可能会导致用户线程在访问数据时出现内存异常),会产生很多的内存碎片;

2024-03-09 16:29:14 1221

原创 Nginx实现高并发

nginx引入了一个叫accept_mutex的互斥锁,同一时刻可以保证只有一个worker获取到互斥锁,只有成功获得锁的worker才可以accept请求,执行后续的请求处理流程,同时ngx_accept_disabled减1。之前写过一篇关于gunicorn介绍的,其进程模型也是采用了相同的思想,只是每个worker的处理方式不同。真正处理请求的是worker。可以看到,通过这种方式,Nginx的IO多路复用不出现空闲事件,间接上实现了异步非阻塞,是框架层面实现的异步,而非OS层面epoll的同步。

2024-03-08 23:20:24 914

原创 借着ChatGPT的人机交互聊聊长连接

经济基础决定上层建筑,说的一点也不错。基础就是基石,基础决定了最终的高度,看似很基础的通信原理却影响着科技与生活的方方面面。说到这儿,我感觉挺悲哀的,当前计算机领域的基础建设都是欧美创造的,他们是Creator,而国内几乎所有人都是照搬过来,然后去做可以创造财富的应用,他们开发者想的是如何改变世界,我们则以利益为锚点,这就是价值观的不同。当然这并不是我们个人的错,是环境导致的,不搞钱,我们就得饿死。如今国内只有华为一家才真的可以与国外媲美,任正非曾经说过,“华为的理想是为了全世界服务”。

2024-03-08 22:42:59 1567 1

原创 写时复制简介

PHP 在管理内存方面有一个机制叫写时复制(COW,Copy On Write),保证了变量间复制值不浪费内存:当一个变量的值复制到另一个变量时,PHP 没有为复制值使用更多的内存,相反,它会更新符号表来说明两个变量拥有相同的内存块,所以当执行下面的代码时并没有创建一个新的数组。写时复制技术(Copy on Write)是比较常用的一种技术,它的主要目的是延迟减少以及延迟内存的分配,增加执行效率,只有在真正进行写操作的过程中才会真正分配物理资源。相反,Java的读写锁中,读写是完全互斥的,能实现强一致性。

2024-03-03 21:19:21 985

原创 小米消息队列的选型与实践

Guard内部就使用了RabbitMQ,业务系统将邮件发送到Guard,Guard会将所有邮件作为消息头递到消息队列,随后RabbitMQ负责将消息push到消费者(邮件服务器),在上面有过介绍,push消息的速率完全由broker掌握,我们可以控制Push消息的频率,类似大家经常说的限流,消峰,这就可以有效避免邮件服务器被瞬时大量邮件打垮。市面上的多种消息队列都有在小米应用,如Notify,Kafka,EMQ,RabbitMQ,Talos,RocketMQ,MQTT等。因此针对这点,小米进行了优化。

2024-03-03 20:41:55 691

原创 中国支付体系-开篇

最近要写一些支付系列的文章,该系列会介绍中国支付的历史、支付的现状,中国支付体系、平台支付系统的设计与开发、世界支付格局、美国如何实现金融的霸权控制等等和支付相关的方方面面。

2024-03-02 09:31:06 124

原创 简述操作系统内存管理

这篇可是真枯涩啊,哈哈,老早在学操作系统的时候整理的文章,没加润色,单纯从个人网站迁移过来。操作系统内存管理的目的是将线性物理地址用抽象的逻辑地址空间,从而保护物理地址。此外,可以独立地址空间,共享内存以及虚拟化。操作系统内存管理方式:1、重定位;2、分段;3、分页;4、虚拟存储;

2024-02-29 22:20:22 670

原创 大道至简,聊聊工作中需注意的数据库开发规范

最后还要特别强调,希望大佬们引起足够的重视,CURD不仅不丢人,反而是最重要的,对此不屑的代价是惨痛的,尤其是和钱相关的,一个小失误导致少则几十万,多则几个亿,十几亿的金额影响都是我亲眼见过的。我做了很多年财务结算,我从来没有出现过错误,不是因为自己有多牛,完全是因为我发自内心的高度重视,无他。

2024-02-29 20:09:13 811

原创 多任务编程思想-前言

由于市面上的并发书籍基本上都是局限于某种并发方式,最多的就是JAVA多线程,书籍都叫并发编程,实际上只是多线程。然而,多任务处理不仅仅有多线程,还有多进程,IO多路复用,协程,异步等等多种实现方式。因此一直都想自己写一本关于并发编程的书,可能做不到包罗万象,但至少可以涵盖所有关于多任务处理方面的知识。本书会将理论与实践相结合,全面得介绍并发编程的思想,并将其在实践中得以呈现。后续会逐步完善系列文章,下面是整个文章的目录。

2024-02-28 22:04:30 350

原创 个人后端知识点总结

学过计算机软件的多多少少得都会听过设计模式,其主要得目的就是提高我们系统设计和代码质量,增加复用性、提升系统的可扩展性。不过我认为我们在学习的时候不必过多地注重生搬硬套,不能做本本主义,而是要灵活去应用。此外,23种设计模式并不是每一种都是很适合我们实际系统开发。如果要用到一个设计模式,要搞懂,我要用它去解决什么问题。比如单例模式,我就希望全局只有一个实例存在;你要使用观察者模式,我就是要将生产和消费解耦;使用代理模式,我就是要屏蔽我内部实现类,用代理类实现一些额外的控制等。

2024-02-28 14:04:23 967

原创 理清Mybatis的启动装配和调用原理

其会调用ClassPathMapperSacanner扫描所有的Mapper接口,并将其注册到IoC容器中,对应的beanClass设置为MapperFactoryBean,也就是我们在注入的使用时,直接上是注册了MapperFactoryBean,我们在引用时,会调用该类的getObject,这个方法实际上是通过接口类到knownMapper找到了对应的mapperProxy。但问题是,我们在使用时,是使用Autowired,即我们的接口类是给装载到IOC容器中的bean,何时加载的?

2024-02-27 15:58:55 941

原创 Redis的高性能之道

本文主要介绍了redis的高性能解决方案,包括内存、IO多路复用、后台线程以及IO多线程。不知道后续的Redis发展会是什么样,会不会真的在命令执行中引入多线程?如果引入的话,这对于Redis来说是一次大的改动。我认为很长一段时间不会这么做,这个我们拭目以待吧。我们看Redis7里面,主要还是对数据结构、持久化、命令等方面做的优化和调整,并没有特别大的改动。

2024-02-27 14:51:53 1540

原创 话说Web服务器通信接口协议

这个就如我们电脑上的USB接口,所有厂商都要按照这个开发产品。和Python的WSGI类似,Java中同样有相应的接口规范,叫做Java Servlet API,Web服务器诸如Tomcat,jetty,netty等都实现了规范,通常把他们也叫做Servlet容器,同理应用程序框架,spring系列也都实现了该规范,即实现了Servlet,springboot里叫做DispatchServlet,这个可以和Python对比一下,Python里面叫做WSGIHandler,一个道理。

2024-02-26 16:22:33 862

原创 Linux零拷贝技术浅谈

内核态:Ring0级别,运行在内核空间中,可以执行任何操作并且在资源的使用上没有限制。用户态:Ring3级别,运行在用户空间中,访问资源受限。内核缓冲区:Page Cache,在操作系统级别,提高磁盘IO效率,优化磁盘文件的读写操作。读文件:Files: 1写文件:将更改数据写入到PageCache,并标记为dirty,随后操作系统负责将数据刷新到磁盘中。回写机制包括: write back和write through。

2024-02-26 10:33:39 1037

原创 跨境电商与支付介绍

跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同,交易双方属于不同的国家。因此,从交易模式可以分为进口跨境电商和出口跨境电商。进口跨境电商就是指海外卖家将商品卖给国内的消费者;那出口跨境电商反之,国内卖家将商品卖给国外的消费者。目前比较大的跨境电商有天猫国际,网易考拉,亚马逊等等,抖音最近几年也是发展迅速,几年的时间不仅把国内电商做起来,跨境电商也是风生水起,当然跨境电商要依托在海外的抖音-tiktok。当然,还有我的前东家,小米有品,暂时只做进口跨境电商。

2024-02-26 10:05:41 1181

原创 哈希表的扩容机制

哈希表,又称散列表,是一种常见的数据结构。通过哈希表使用某个键值可以快速定位到数据在内存中的位置。比如我们使用新华字典时,前面会有很多页的索引,我们要查找”哈“这个字,会找到拼音首字母是h的,然后查找对应的页码,这样可以快速查到对应页,不必再一页一页翻。哈希表的应用是非常广泛的,如果你之前学过操作系统,一定接触过磁盘缓冲区,bufferCache(PageCache),其内部就使用了哈希表。

2024-02-23 10:34:59 943

原创 浅谈集群的分类

单台服务器本身会受到带宽、内存、处理器等多方面因素的影响,当通过垂直扩展已经无法提升系统性能时,我们就需要通过水平扩展,即以集群的方 式来部署服务,从而提升系统整体性能。集群在提升性能的同时,也可以减轻单机器的压力,同时提高系统的可用性。这就是我们常说的加机器,简单粗暴,但非常有效。提到集群,一定会想到分布式,不过要注意这两者的区别。集群强调的是服务的多个副本冗余部署;分布式强调的是将整个系统拆分成多个子系统独立开发、维护和运行,每个子系统仍然以集群的方式部署。

2024-02-23 10:13:11 1036 3

原创 电商平台商家结算

结算是整个平台后端的后端,一直都是被多数人冷落的一个部门,很多人都会忽略他,但他却是部门相当重要的一部分。因为前面无论干得多么轰轰烈烈,清结算出了问题,前面都是白费了。清结算,清分和结算,你要把每个月数十亿,数百亿,甚至数千亿的流水准确地完成清分,安全地将每一笔钱结算给商户。这实在是太重要的。电商陷“二清门” 业内:平台解决支付问题要么买牌照要么和持牌机构合作电商该怎么避开二清什么是二清?【清结算】清结算之电商行业京东商家结算京东商家日月账单如何规避二清。

2024-02-22 15:21:35 877

原创 小米以及当前公司分库分表的实践

介绍分库分表之前,要说下数据库架构的演进过程。最早的数据库是单体应用,和我们的业务系统部署在同一个机器上。随着业务发展,数据库和业务系统分开部署,大量的读请求会触发高频次的随机IO,这在一定程度上影响了写请求,且我们的业务几乎都是读多写少,因此数据库演变成了一主多从(也有多主多从,但常用的还是一主多从)的部署方式,且实现了读写分离。写只写主库,读只读从库。

2024-02-22 13:52:37 629

原创 分布式系统一致性与共识算法

分布式系统的一致性是指从系统外部读取系统内部的数据时,在一定约束条件下相同,即数据(元数据,日志数据等等)变动在系统内部各节点应该是一致的。所有用户在任意时刻读到的数据,无论会请求到哪个节点上,都是一致的;有用户在任意时刻读到的数据一定会比之前读到的数据新,也就是说,可获取的数据顺序必是单调递增的;相比于强一致性,弱一致性要求没那个严格,不同用户在不同时间读到的数据可能是不一致的,但过了一段时间会达到一致。最终一致性属于弱一致性的一种实例。

2024-02-21 16:31:18 1678 2

原创 Web安全之浅见

昨天去参加了公司组织的一个关于网络安全的培训,了解了很多关于网络安全方面的知识,也才意识到网络安全是一项极其重要的领域。本篇文章主要聊聊Web安全。不过我对于网络安全方面不是特别懂,所以网络安全方面的大牛们,可以忽略我的文章哈。

2024-02-21 11:33:04 1085 1

原创 2023年总结与2024展望

时间从不会停下脚步,由于你走得慢,可能会被时间落在身后,是想做时代的弄潮儿,还是被抛弃,这完全取决于自己。我必须要做自己命运的主宰,要对得起自己的生命。加油吧!

2024-02-19 10:50:52 1718 1

原创 docker部署RedisCluster集群简单介绍

docker部署redis

2024-02-04 11:15:52 364 1

原创 Redis的big key问题介绍以及监控手段

Redis 的big key是指value占用内存空间较大的键值。通常,针对不同的数据类型会用元素个数或者占用空间大小来衡量bigKey:String:value占用空间超过5MB(实际使用避免超过1MB);集合(list,set,zset):成员数量超过1万个(实际使用避免超过2000个);hash:field成员个数1000个,但value总大小超过100M(实际避免超过10MB);

2024-02-01 10:58:26 1160 1

原创 高并发经验总结与分享

我们知道Redis本身的性能瓶颈从来不在CPU,而是在IO上,所以在官方在Redis4引入了后台线程,做一些lazy free等异步操作,Redis6引入了IO多线程,但Redis的命令执行一直是单线程的,所以结合lua脚本,实现命令的原子性,这样就很完美的实现了库存的扣减,也可防止超卖,这也是很多平台都在使用的主要方案。我们现在开发业务系统,基本上都是IO密集型的,很少有CPU密集型的,因此I/O是成为系统瓶颈的主要因素,零拷贝可以减少CPU拷贝次数,减少用户态和内核态的切换,从而提升IO传输效率。

2024-01-18 10:54:08 1114 1

原创 消息队列介绍与对比

消息队列的简单介绍和对比

2024-01-18 09:54:23 388 1

原创 记录一下我们最近在压测过程中调优的过程

这次压测、调优的过程非常有趣,发现问题、排查问题、解决问题这一整个过程真是收获满满。当你看到压测结果通过调优后性能有明显的上升后,还是非常有成就感的,这也是属于我们技术人的一种小幸福吧。最后想说,永远不要轻视测试,包括单元测试,集成功能测试,压力测试。

2024-01-17 10:46:40 851

原创 并发编程不能离开的锁

为了解决上述的问题,一个最常见的解决方案就是加锁。通过加锁,保证了操作的原子性,只有获得锁的任务才能执行相关流程,从而保证最后得到的结果是可预知的。比如在电商系统中,下单支付后更改库存,通过使用悲观锁或者乐观锁来保证不会超售。锁是用于控制多任务同时访问共享资源的一种同步机制。通常,我们会将锁分成两大类,悲观锁和乐观锁。悲观锁即认为一定存在竞争,所以在处理之前加上互斥锁,存在排他性,只有获得到该锁的任务才能处理,其他的会被挂起。

2024-01-16 15:58:02 878 1

原创 复盘公司生产事故后的一些感想

2023年一年复盘过的70个生产事故,有将近40个是因为SQL问题引起的。上面三个只是其中非常典型的问题,且影响比较大的。总结排名比较靠前的几个问题原因:1、where没有查询条件,这个是最多的,我们用orm或者半orm框架的api写时,也不做任何判空。这个发生的概率非常大,不是一般的大;2、where条件没有索引。尤其是新增字段时,忘了增加索引,这是最容易出现问题的。该问题时发生概率排名第二的;3、分库分表没有分片键;4、其他问题。所有导致索引失效的问题,包括隐士转换、违背最左匹配、模糊查询等。

2023-12-25 16:50:49 868 2

原创 互联网缓存那些事儿

高速缓存,英文名称Cache(发音 cash),是一种高速存储层。其最早是在上个世纪70年代的一篇电子期刊中诞生的概念,主要用来解决CPU处理速度和获取内存数据速度不匹配的问题。通过引入缓存层,可将数据提前加载到缓存中,CPU在获取数据时可首先从缓存中读取,从而减小数据的读取时间。随着不断的发展,缓存已经不仅仅包括CPU缓存,后续还出现了磁盘缓存,以及应用层方面的缓存,比如客户端缓存、CDN缓存、Nginx缓存、DB缓存等等,甚至于Linux操作系统内部提供的TLB高速缓存。

2023-12-20 16:33:17 897 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除