自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 到底为什么我们需要ThreadLocal?

先说作用ThreadLocal为每个线程提供一个独自的变量,这个变量不会在线程间共享。但是如果仅仅要实现他的话我们也可以通过自定义线程继承Thread类的方式声名成员变量来实现线程间变量隔离。那为什么我们还需要ThreadLocal?主要就是因为在自定义线程内这个自定义成员变量使用没有问题但是在非自定义的线程方法中我们如何实现变量线程间隔离?ThreaadLocal设计就是为了解决这个问题,在代码中任何一处声名的ThreadLocal都可以实现线程隔离的变量。Thread中都有一个Thr

2022-03-17 10:49:49 793

原创 JMM与多核CPU

并行导致的问题众所周知,我们写的进程跑在CPU上,进程下线程作为CPU调度的基本单位,而当今CPU基本都是多核CPU也就是说可以实现线程并行。由于CPU计算极快,快到从主内存加载一次变量都要经过很多个时钟周期,为了提高CPU的利用率,在CPU内部引入了快速缓存。那么线程跑的时候局部变量跑没有问题,但线程共享变量就会出现并发问题,因为他们拿到的都是从主内存中读到的共享变量的副本。假设变量X = 0共享,两个线程同时执行X++最后的结果可能就不是设计的2而是1。因为X++需要先从主存中读

2022-03-16 17:58:07 742

原创 NAT简介

基本NAT内部IP与外部IP一对一静态NAT路由器有一部分可用公网IP,维护一个静态地址映射表。在内部IP访问公网IP通过路由器时将IP头中的内网IP替换为路由器维护的地址映射表中该IP对应的公网IP。在有进入内网的IP时,根据映射将公网IP转换为内部IP。动态NAT还是一对一,但关系不再是静态,内部IP访问公网IP时,路由器从可用IP表中找出一个可用IP进行替换。NAPT将数据包、端口同时替换,比如一个192.168.0.1:4399的ip出去访问124.222.2

2022-03-16 15:27:50 242

转载 Websocket握手

当客户端想要使用 WebSocket 协议与服务端进行通信时, 首先需要确定服务端是否支持 WebSocket 协议, 因此 WebSocket 协议的第一步是进行握手, WebSocket 握手采用 HTTP Upgrade 机制, 客户端可以发送如下所示的结构发起握手 (请注意 WebSocket 握手只允许使用 HTTP GET 方法):GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: Upgra

2022-03-16 13:07:30 2830

原创 HTTPS连接过程

HTTPS1、C->S ClientHellotcp三次握手建立连接自身支持的加密方式自身生成的随机数a支持的安全协议(TLS/SSL)版本2、S->C ServerHello确定加密版本自身随机数b确定加密方式自身的证书3、C校验证书校验是否过期根据证书的机构从浏览器中找出该机构的公钥,证书中记录有加密使用的算法,摘要生成的算法签名是摘要算法生成的,证书重用CA的私钥加密过,浏览器用该机构的公钥解密(确认是该机构发的),同样使用摘要算法计

2022-03-16 13:04:13 3582

原创 深入理解Redis持久化机制——COW

RDB普通的八股不多说,说说使用bgsave后快照到底如何实现持久化并且还能继续提供服务。bgsave会调用fork出一个子进程,那子进程要如何获取父进程的数据?其实就是进程通信中的内存映射,将子进程的逻辑内存与父进程的逻辑内存映射到同一块物理内存。但是如果父进程更改了数据怎么办?在父进程修改的内存页(linux页4kb)内核才会将要更改的内存页实际拷贝到子进程里,他把拷贝延迟到实际需要拷贝的时候才真正进行拷贝。相对于没有COW时大大减少了内存的实际占用以及拷贝带来的性能消耗。COW

2022-03-16 12:02:15 1283

原创 微服务到底如何拆分

AwakeningEra2-Back: 微服务在我的项目中目前是

2022-03-16 11:20:15 1147

原创 简单理解NIO、BIO、AIO模型

保证你轻松看懂BIO、NIO、AIO

2022-03-14 12:04:22 1279

原创 JWT的优缺点及主动失效方案

原因:前后端分离以前的传统模式下,后台对应的客户端就是浏览器,就可以使用session+cookies的方式实现登录,但是在前后分离的情况下,后端只负责通过暴露的RestApi提供数据,而页面的渲染、路由都由前端完成。因为rest是无状态的,因此也就不会有session记录到服务器端。优点JWT的优点是服务端生成之后就不需要在维护JWT,只需要解析即可,省去分布式session方案中需要去数据库查询的时间。缺点不易实现JWT的主动失效。要改变某个用户权限时数据库中用户的权限很容易改变

2022-03-12 19:19:41 3713

原创 死磕单点登录

需求首先如果信息不需要根据用户隔离则不需要登录,所有人都看到一样的内容拥有一样的权限享有同样的资源即可,假设一个系统中一些信息需要根据不同用户实现信息隔离,需要一种机制实现对用户的认证。交互协议在web系统中使用HTTP协议进行通信,HTTP协议是一种无状态的协议,当一个请求响应与另一个请求响应之间没有联系(1.0短连接)。如何维护状态(单体系统)但是系统需要对用户身份进行判断,在单体系统中,在浏览器与服务器间使用了cookie session机制,在浏览器向服务器首次发起请求时服务器会

2022-03-12 13:09:11 1926

原创 MySQL的事务隔离机制、锁、MVCC的联系

MySQL并发可能出现的问题丢失更新 脏读(未提交内容) 不可重复读 幻读2、3不满足事务一致性原则。MySQL事务隔离级别读取未提交 读取已提交 可重复读 串行MySQL的锁锁的级别上分行锁与表锁。锁的类型上分读锁与写锁。在Innodb中支持行锁,并且在加行锁前会加对应类型的意向锁。读锁、写锁之间出了读锁与读锁不冲突其他都冲突。锁算法用到索引的查询上锁的都是索引或者索引间空隙。如果没有索引行锁会退化为表锁。记录锁在唯一索引上,对查询到的记录会直接

2022-03-11 20:24:27 1277

原创 多线程单例安全----双重校验锁+volatile

双重校验锁上图单线程安全。先判断null如果为null再尝试获取锁(提高性能,如果已经创建就不用加锁判断了),获取锁后还不能直接创建,因为之前可能也有判断为null的已经获取过锁并创建对象,所以锁内需要再次检测。两次的if判断与synchronized称为双重校验锁。为什么要加volatile因为在上述if判断即使加锁了还是可能出错。new可分为几步1、检查类是否加载2、分配内存3、变量赋默认值4、设置对象头5、执行初始化方法简单说,先分配内存,再

2022-03-10 11:06:52 1609

原创 Redis数据结构、底层数据结构及使用场景

Redis的五种数据结构String底层数据结构有int,SDS(raw,embstr)分别为整型与动态字符串,动态字符串内有预留空间,拼接不用每次扩展空间。可以做缓存序列化的对象如JSON,计数Hash底层HashTable与ziplist,字典底层也是HashTable,hashtable中计算出hash值得到在哪一个数组后,还要通过sizemask 属性和哈希值再次得到数组下标,冲突解决链地址法。rehash,有两个地址ht0 ht1,当rehash时将ht0的内容移到ht1上

2022-03-10 09:40:42 608

原创 设计模式在Spring中使用总结

简单工厂又叫做静态工厂方法(StaticFactory Method)模式,但不属于 23 种设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,但 是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。工厂方法实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBea

2022-03-09 23:29:29 318

原创 RabbitMQ消息可靠性、重复、顺序问题、集群

可靠性RabbitMQ消息可能丢失消息的地方1、消息从生产到交换机2、消息从交换机到队列3、在队列还未被消费时宕机4、消息消费时失败对应解决1、RabbitMQ有ack机制,当send消息到交换机成功时会返回ack消息,生产者方channel开启confirm模式,然后增加监听,注意这时候可能由于网络波动可能已经消息入队但生产者主观认为失败,而再次发送(即可能出现重复消息,目的是为达到最少一次消费)。2、与1相同,当交换机到队列失败会返回nack报文3、队列可以开启持久化

2022-03-09 17:55:48 2735

原创 谈谈Mybatis、Mybatis-Plus与Spring Cache

大家都知道Mybaits有两级缓存一级缓存作用范围默认sqlsession级别,在并发中可能出现脏读,调整为statement可以避免。二级缓存作用范围为namespace级别,在多表查询namespace不同时出现脏读,原因是aMapper中的方法获取到联查的数据后,如果被联查的表更新aMapper是不能更新缓存的。SpringCache可以提供key value形式的缓存,可以在根据id查询时以类名加id的形式缓存在redis中...

2022-03-02 20:23:32 1107

原创 IM即时通信分布式后端方案(分布式websocket)

最近在准备春招项目时碰到了一个问题,在自己的项目中想实现聊天的功能,传统的http请求轮询对服务器资源太浪费,于是采用websocket。websocket通信需要依靠javax.websocket.Session的session.getBasicRemote().sendText()方法发送消息,但websocket session 并未实现 Serializable 接口,无法进行序列化。所以想靠分布式缓存实现websocket session共享走不通了。在...

2022-02-22 22:44:23 3614 1

原创 手把手教你用鸿蒙HarmonyOS实现微信聊天界面(三)

《微信聊天界面》项目,实现功能有1、聊天信息功能,包括图片、文字2、发送定位功能3、选择发送本机图片功能4、拍照并发送图片功能

2021-10-13 20:11:04 2334

原创 手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)

手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历,此篇为《微信聊天界面》项目,实现功能有1、聊天信息功能,包括图片、文字2、发送定位功能3、选择发送本机图片功能4、拍照并发送图片功能

2021-10-10 18:33:09 3232 1

原创 手把手教你用鸿蒙HarmonyOS实现微信聊天界面(一)

手把手教你用鸿蒙HarmonyOS实现微信聊天界面,实现功能1、聊天信息功能,包括图片、文字2、发送定位功能3、选择发送本机图片功能4、拍照并发送图片功能

2021-10-09 23:55:22 4481

原创 重放攻击的原理与防护

本文因好奇快速完成超星任务是否技术上可行所为,只做学习、讨论为目的,不展示细节。一开始想拖动进度条发现拖不动,之后想找后端验证视频观看完成的api。经过修改观看时间再发送请求实现完成任务点,通过修改request验证视频是否观看完成的请求请求参数修改参数再发送后的响应内容再次刷新页面,任务点已完成建议超星在发送查询视频完成请求时可以加上时间戳防止重放攻击。为同学们好好学习,本文仅提供思路,如果希望交流可以评论区或发消...

2021-09-24 22:36:22 932 2

原创 鸿蒙HarmonyOS版抖音(含源码)

效果图 总的思路是实现两方面,一方面实现刷的功能,一方面实现视频播放的功能。 刷的功能可以在鸿蒙的javaui组件中找到PageSlider是非常符合此功能使用的,可以自定义大小与刷的方向。 至于视频想办法放在里边嵌进去就是实现了基本的刷视频的功能。 视频播放功能参考了鸿蒙官方文档。 概要内容为:播放视频的多媒体应用程序通常包含两个部分:给定媒体源的播放器加载媒体资源,并通过Surf...

2021-09-24 22:21:15 2242 2

原创 真机调试鸿蒙HarmonyOS应用步骤(超详细!!!)

HarmonyOS应用调试支持使用真机设备调试。使用真机设备进行调试前,需要对HAP进行签名后进行调试。调试应用签名的方式包括如下两种:方式一:通过从AppGallery Connect中申请调试证书和Profile文件后,再进行签名。关于该方式,本文不做重点介绍。方式二:通过DevEco Studio自动化签名的方式对应用进行签名。该方式相比方式一,在调试阶段更加简单和高效,本文重点介绍DevEco Studio自动化签名方案(DevEco Stud...

2021-08-28 20:04:56 14062 25

原创 Nacos+GateWay+ElasticSearch+Redis+Hystrix+Security+Oauth2实现的觉醒年代展示项目

项目介绍基于本学期所学的JAVA Web技术编写觉醒年代的展示Web项目,实现基于SpringSecurity的安全框架的登录、注册、权限管理;实现基于Spring Cloud的分布式服务; 实现基于Redis的缓存机制;实现基于RabbitMQ的消息通知;实现基于Elasticsearch的搜索服务;实现基于Feign的负载均衡;实现基于Hystrix的熔断机制;实现基于Thymeleaf的前端模板引擎;实现基于Mybatis-plus的持久层操作;基于MybatisX的代码生成功能。版本Sp

2021-08-04 14:00:55 397

空空如也

空空如也

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

TA关注的人

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