- 博客(86)
- 资源 (5)
- 收藏
- 关注
原创 redis scan反向二进制位迭代原理
scan反向二进制位迭代原理:顺序遍历会有什么问题?在Redis中,key是使用Hash结构存储的,使用链表法解决hash冲突,需要遍历所有的key最直观的想法就是遍历hash数组,假设数组长度为8,则从0-7遍历取值即可。但hash是会自动扩容缩容的,如果按照顺序遍历,在遍历一半的时候发生扩容缩容会发生什么?如上图所示,原始数据遍历到index=5的位置。发生扩容后:从index=6的位置继续遍历,将会有8、10、27、12这四个元素被重复遍历;发生缩容后:7、12这两个元素将不会被遍历到。
2022-02-20 11:27:21 929 2
原创 Proxifier+Charles对电脑exe应用抓包(https)
Proxifier+Charles对电脑exe应用抓包(https)自己电脑使用Proxifier+Fiddler抓包时折腾好久都是tunnel to …443,证书也都删了重新安装,还是没有用。尝试使用Charles抓包,结果就 成功了,记录一下。安装Proxifier和Charles链接:https://pan.baidu.com/s/1Rq1TlxwBHhcnA-g3TGi72w提取码:s864安装好Charles后,打开可能提示缺少动态库dll,使用微软常用运行库合集_2019.07.20
2021-05-10 19:12:46 5814
原创 python调用C++的dll出现的问题,折中的解决方案
一个DLL引发的一些列问题反编译一个exe文件,目的是获取一个签名字符串的实现过程,结果发现该函数调用了以下dll实现。[DllImport("xx.dll", EntryPoint = "fun1")]private static extern bool sign(string key, string str, ref int buffer, ref int bufferlen);首先使用Exeinfo_PE查看该exe是使用什么语言实现的,结果发现是C#实现,然后尝试使用ILSpy反编译该e.
2021-04-21 14:44:01 1415 2
原创 生产者消费者及交叉打印实现
生产者消费者的几种实现1 lock锁实现class SharaData{ private int num = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //生产 public void increment(){ lock.lock(); try { //必须是wh
2020-09-09 09:20:35 266
原创 聊天系统(5)心跳检测机制
9 心跳检测机制防止客户端假死当客户端与服务器端之间有网络等相关问题时,可能导致客户端或服务器端假死。假死有两种情况:客户端以为连接正常,发送消息时超时;服务器端以为客户端连接正常,还依然保存着连接,大量假死连接会导致服务器性能下降甚至崩溃。当正常TCP四次挥手关闭连接时是不会造成假死现象的,一般是因为网络或硬件等故障造成假死。那么如何去解决这种问题呢?在Netty中,提供了服务器端的空闲检测的Handler,即服务器端一旦在指定时间没有收到客户端发送过来的消息,就判定客户端假死,关闭该连接。这样就保
2020-08-04 13:08:59 864 2
原创 数据库笔记总结
5 数据库5.0 数据库串讲事务及spring事务传播1. 事务的概念:满足ACID特性的一组操作,可以提交和回滚。2. 事务的四大特性:原子性:事务被视为不可分割的最小单元,要么全被成功执行,要么全部失败回滚;一致性:事务执行前后数据一致。如A和B之间转账,无论怎么转,执行前后的总金额保证不变。隔离性:同时执行的事务是相互隔离的持久性:事务一旦提交,做的修改永久保存在数据库3. 事务的并发一致性问题:丢失修改:两个事务对同一个事务修改,先修改的数据会被覆盖丢失。
2020-08-04 10:53:39 529
原创 MySQL索引及存储问题
MySQL索引及存储问题1 索引简述MySQL中的索引结构在MySQL中,使用最多的索引结构是B+树索引,此外还有哈希索引,但很少使用。哈希表原则上查找更快,但基本不使用,因为哈希表解决不了范围查找,只能等值查询,无法用于排序!B+树的特点1)B+树存储时所有非叶节点存储索引,叶节点存储数据。聚集索引的话叶节点存储的是全部数据,非聚集索引只存储主键ID和索引值。2)INnoDB中最小储存单元是页,默认大小为16KB,而文件系统中最小单元是磁盘块,为4KB。3)B+树的任务只是通过索引找
2020-08-04 10:30:07 380
原创 策略模式
策略模式案例:我们需要创建一个duck抽象类代表鸭子类,抽象类中含有一个抽象方法,如fly()/swim()/eat()等方法。然后我们有几种类型的鸭子:北京鸭、玩具鸭、野鸭子,分别继承Duck类并实现几种方法。存在的问题:每种鸭子都有自己的特色,有的鸭子不能飞翔,有的不能游泳…而继承父类就是继承所有方法。此时可以使用策略模式实现。假设所有鸭子都能游泳,而有的不能飞翔,eat吃的食物也不同。我们可以将游泳方法写在抽象类中,因为所有鸭子都有的功能。而飞翔和eat可以使用两个接口,每个接口可以有不同的实
2020-08-03 09:43:50 161
原创 责任链模式
责任链模式案例:学校设备采购审批流程如下:0<=x<=5000由办公室主任审批5000<=x<=10000由院长审批10000<x<=30000由副校长审批30000<x由校长审批编写程序完成审批项目。在没有设计模式时,可以写if、else来判断金额,从而调用对应的审批者。if、else写法存在的问题?如果审批金额发生改变,则if、else中的代码也要改变。责任链模式简介责任链模式,又叫职责链模式,为请求创建了一个接受者对象的链,这
2020-08-03 09:43:09 182
原创 装饰器模式
装饰器模式场景:煎饼的点餐系统中,有各种口味的煎饼,然后选择完煎饼口味后,可以选择加肠加蛋或者加其他的配料。如何设计点餐系统。如果煎饼的成员变量中包含所有的配料,显然系统比较复杂,新增配料时需要修改煎饼的代码,不符合开闭原则。使用装饰器设计模式后:只需要在煎饼对象上加上鸡蛋装饰,加上香肠的装饰即可。新增配料时,新增加一个装饰类即可。装饰器中的几个角色:抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。即煎饼抽象类。具体构件:抽象构件的子类。即煎饼抽象类的实现类。抽
2020-08-03 09:42:30 214
原创 适配器模式
适配器模式Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。**Adapter(适配器类):**适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。**Adaptee(适配者类):**适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下
2020-08-03 09:41:41 207
原创 原型模式
原型模式使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。主要是实现Cloneable接口重写clone方法。浅克隆:只复制这个对象,对象的属性不会进行克隆。即改变原型对象的属性,克隆出的对象的相应属性也可能改变。深克隆:重写clone方法中,手动将对象属性也克隆一份。深克隆可以采用序列化和反序列化:public Object deepClone() throws IOException, ClassNotFoundException { //创建流对象 try
2020-08-03 09:40:46 146
原创 建造者模式
建造者模式当一个类的构造函数的参数比较多时,且有的参数必须传入,有的参数可选时,通过构造函数创建对象比较繁琐,可以使用建造者模式创建对象。在类中创建一个静态内部类Builder,提供方法返回创建好的对象。public class Computer { private final String cpu;//必须 private final String ram;//必须 private final int usbCount;//可选 private final Strin
2020-08-03 09:39:49 110
原创 工厂模式
简单工厂模式(静态工厂模式)就是有一个工厂类中有一些方法可以返回对象。创建对象的时候不自己new,而是通过工厂方法得到一个对象。优点:使用时可以不去关心对象是怎么创建的,解耦;创建一个水果工厂类,提供一个创建水果对象的方法,通过传入一个参数说明需要什么对象。public class FruitFactory { public Fruit createFruit(String type) { if (type.equals("apple")) {//生产苹果
2020-08-03 09:39:04 120
原创 单例模式
单例模式。单例模式确保一个类只有一个实例,并提供全局的访问点,通过一个私有构造函数、私有静态变量和一个公有静态函数实现。单例模式分为懒汉式和饿汉式实现。**懒汉式:线程不安全。**延迟加载,若多个线程同时进入到if(uniqueInstance==null),则会导致多次实例化。饿汉式:线程安全。直接实例化,则不会多次实例化。如何使懒汉式线程安全?方法一:对 getInstance加锁:性能太差方法二:双重校验。先判断是否实例化,若没有实例化则加锁后再判断是否实例化进行实例化,注意对类变量加v
2020-08-03 09:37:57 122
原创 SpringBoot自动装配
自动装配原理注解:@SpringBootApplication :这是springboot最核心的注解,当然也是组合注解@SpringBootConfiguration 表明这是一个配置类@ComponentScan 组件扫描@EnableAutoConfiguration 是自动装配的总开关。@AutoConfigurationPackage 配置自动扫描包的路径,与注解同级目录。AutoConfigurationImportSelector类:根据配置文件(META-INF/sp
2020-08-02 20:25:07 194
原创 Seata处理分布式事务
Seata处理分布式事务通过TC、TM、RM三个组件完成:全局事务管理者、事务发起方、事务的参与方。Seata事务的执行流程(默认是使用二阶段提交):TM开启分布式事务(TM向TC注册全局事务记录)按业务场景,编排数据库、服务等事务内资源(RM向TC汇报资源准备状态)TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚事务)TC汇总事务信息,决定事务是提交还是回滚TC通知所有的RM提交或回滚资源,事务的二阶段结束。Seata二阶段提交(AT模式)的原理首先,我们的Seata
2020-08-02 16:16:05 1555
原创 秒杀系统中常见问题及解决方案
秒杀中的常见问题的解决1)解决超卖的问题1)Redis预减库存,有一个下单请求过来时预减库存,若减完后的redis库存小于0说明已经卖完,此时直接返回客户端已经卖完。后续使用内存标记,减少Redis访问。若预减库存成功,则异步下单,请求入队列,返回客户端排队中。2)数据库层面防止超卖:Redis预减库存只是抢到了这个机会,真正是否购买成功还是要等到所有数据库操作的真正成功,即消息队列的消费端是否消费成功。数据库层面,秒杀的订单表设置唯一索引,防止重复下单。数据库层面,减库存的时候同时判断此时库
2020-08-02 16:13:20 6337
原创 Sentinel流量控制及熔断
Sentinel流量控制及熔断Sentinel:哨兵,用于监控接口的流量、熔断、降级等。相对于Hystrix,Sentinel有界面,不用加那么多注解来实现,实现更加方便。其实两个理念都一样。使用流程:1)启动sentinel。下载官网的jar包,使用java -jar去执行即可,默认端口为8080。用户名密码都是sentinel。2)在项目模块中,引入sentinel模块,将服务注册进nacos和sentinel。3)将微服务注册进sentinel后即可监控。再访问后就可以在sentinel图
2020-08-02 09:12:50 1259
原创 安装rabbitMQ即常见问题解决方案
第一次装的时候没注意erlang版本,安装的版本低了,安装rabbitMq时提示版本过低,然后下载最新版安装又出现各种问题。最后总结安装如下:下载erlang19.0.4版本并安装。wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm yum install erlang-19.0.4-1.el6.x86_64.rpm -y由于之前安装erlang环境时erlang环境已经被我弄的一团
2020-08-01 16:43:19 3298 5
原创 Netty聊天系统(4)群聊功能实现
7 群聊功能的实现7.1 群聊的创建创建一个创建群聊请求的实体类,依然是继承Packet,因为要通过我们的协议进行编解码服务器端创建一个处理创建群聊请求的Handler,并实现其中的逻辑创建一个群聊创建响应的实体类,继承Packet客户端创建一个Handler来处理响应创建一个CreateGroupRequestPacket类,@Datapublic class CreateGroupRequestPacket extends Packet { private String
2020-08-01 16:38:39 4080 1
原创 Mybatis技术内幕(2)基础支持层
2 Mybatis基础支持层2.1 类型转换模块JDBC的数据类型与Java的数据类型并不是完全对应的,在PreparedStatement为SQL绑定参数时,需要从Java类型转换成JDBC类型,当查询出结果时,又需要将JDBC类型转成Java类型。该模块的功能作用非常明确,也很容易理解,此处只是学习源码怎么设计,怎么优雅的去实现这个功能。2.1.1 JdbcType枚举类首先,JDBC的所有数据类型都记录在java.sql.Types类中,每一种类型都用final static int表示。
2020-08-01 14:34:03 247
原创 Java并发编程知识点总结
文章目录2 并发编程2.1 线程2.1.1 线程的几种状态有哪些方法可以保证线程安全?2.2 创建多线程的几种方式2.3 并发机制底层实现2.3.1 synchronized关键字2.3.2 synchronized与Lock的区别联系2.3.3 volatile关键字2.3.4 atomic包和CAS原理及问题2.4 Java并发容器2.4.1 List集合的线程安全2.4.2 Set集合类的线程安全2.4.3 Map的线程安全2.4.4 CountDownLatch(倒计数)2.4.5 CyclicB
2020-07-31 10:54:16 684
原创 Mybatis技术内幕(1)Mybatis架构设计
1 Mybatis架构1.1 为什么要有ORM框架在传统的JDBC编程中,操作数据库时一般会经过以下步骤:1)注册数据库驱动类,指定数据库连接信息2)通过DriverManager打开数据库连接3)通过数据库连接创建Statement对象4)通过Statement对象执行SQL,得到ResultSet对象5)通过ResultSet读取数据,并将其转换成Java对象6)关闭数据库连接,释放资源以上通过JDBC操作数据库有以下缺点:有大量的重复代码,虽然可以提取工具类(刚学JDBC时就
2020-07-31 10:44:53 558 1
原创 Netty聊天系统(3)登录与私聊功能实现
5 定义一个Handler实现身份校验在客户端与服务器端之间通信时,一定要进行身份认证,即客户端必须要登录。此时可以在用户登录完成后,在channel上添加一个标志位,表示用户已经登录。在接受客户端发送的消息时,必须确保此时客户端已经登录。在客户端登录后,在channel上添加一个标志位。在服务器端的LoginRequestHandler中,用户登录成功后,就将channel添加一个“login”的标志位,并设置为true。ctx.channel().attr(AttributeKey.newI
2020-07-30 21:33:10 1382 3
原创 Netty聊天系统(2)粘包和半包问题的解决
4 粘包和半包问题的解决什么是TCP粘包和拆包1)TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的。由于TCP无消息保护边界,需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题。虽
2020-07-30 21:31:33 360 1
原创 二维数组中任一点出发能走的最长步数
解析:深度遍历,当索引无效时或者上下左右的数字都小于该值且k==0时,结束递归。不开辟额外空间记录遍历过的路径时,会超时。所以使用一个三维数组dp[i][j][k]记录已经遍历过的点。import java.util.*;public class Main { private static int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; public static void main(String[] args){.
2020-07-29 21:55:07 282
原创 Netty聊天系统(1)通过自定义协议实现客户端与服务器端通信
1 自定义实现客户端与服务器端通信的协议1.1 通信协议的设计自定义的通信协议需要哪些内容1)魔数:第一个字段一般是魔数,一般固定的几个字节。一个PNG图片的编码中有固定数量固定内容的字节,用于表示这是一个PNG图片;Java的Class文件打头有一串魔数用于表示这是一个class文件;同样,我们的通信协议也是这么定义,服务器端或客户端收到数据包之后,会先读取魔数看看是不是我们定义的通信协议,只有是我们的通信协议时才能按照我们定义的规则正确读取数据。2)版本号:用于一个字节表示,比如Http协议
2020-07-29 20:08:22 1243 4
原创 自定义实现客户端与服务器端通信协议
自定义实现客户端与服务器端通信协议1 通信协议的设计自定义的通信协议需要哪些内容1)魔数:第一个字段一般是魔数,一般固定的几个字节。一个PNG图片的编码中有固定数量固定内容的字节,用于表示这是一个PNG图片;Java的Class文件打头有一串魔数用于表示这是一个class文件;同样,我们的通信协议也是这么定义,服务器端或客户端收到数据包之后,会先读取魔数看看是不是我们定义的通信协议,只有是我们的通信协议时才能按照我们定义的规则正确读取数据。2)版本号:用于一个字节表示,比如Http协议有1.0/
2020-07-29 14:52:54 1406
原创 猿辅导解压字符串问题
我的答案:思路很明显,就是用栈去模拟这个过程。import java.util.*;public class Main { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); while(scanner.hasNextLine()){ int n = scanner.nextInt(); scanne..
2020-07-27 20:32:20 252
原创 5、Nginx的缓存配置
5 Nginx缓存通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提⾼网站并发延时。缓存的类型客户端缓存:如之前的浏览器缓存。Nginx缓存:第一次请求时做转发,第二次请求时直接将缓存发送给客户端,而不需要请求服务器服务器端的缓存:Redis缓存、数据库缓存等等upstream cache { server 192.168.69.113:8081; server 192.168.69.113:8082; server 192.168.
2020-07-27 18:18:08 142
原创 4、Nginx代理与负载均衡
4 代理与负载均衡4.1 正向代理与反向代理正向代理与反向代理的区别正向代理:代理的是客户端。如通过代理服务器去翻墙,代理服务器充当的是客户端的角色。反向代理:代理的是服务器端。我们访问服务器端时,访问的是代理服务器,代理服务器再去帮我们找真正的服务器。如一个服务器没有公网IP地址,就可以在用一台有公网的服务器做代理,前提是这两台服务器能通信正向代理配置测试// 配置69.113访问限制,仅允许同⽹网段访问location ~ .*\.(jpg|gif|png)$ { al
2020-07-27 18:17:24 172
原创 3、Nginx静态资源
3 Nginx静态资源静态资源不需要服务器动态运行生成的文件为静态资源,如HTML、css、js、图片、视频、文件等静态资源配置语法1)文件读取的高效:sendfile开启。直接在内核态拷贝,减少拷贝和切换。2)提高网络传输效率:tcp_nopush开启。在sendfile开启的情况下,提高网络包的传输效率,但是不能保证实时性。3)要求传输实时性:tcp_nodelay开启。与tcp_nopush相反。静态资源文件压缩Nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节
2020-07-27 18:16:11 405
原创 2、Nginx常用模块
2 Nginx的常用模块2.1 日志模块在主配置文件中,有一个配置为定义日志格式,可以在里面指定一些日志变量等信息用于日志记录格式。只能放在http里面,不能放在server里面。log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_u
2020-07-27 18:14:48 141
原创 1、Nginx入门概述
1 Nginx概述1.1 Nginx简介Nginx是一个开源的高性能、可靠的HTTP中间件、代理服务器。常见的HTTP服务:HTTPD:Apache基金会IIS:微软tengline:淘宝基于nginx开发Nginx应用场景静态处理反向代理负载均衡资源缓存安全防护访问限制访问认证nginx特性采用IO多路复用:epoll轻量级:功能模块少、代码模块化CPU亲和:将CPU核心与Nginx工作进程绑定,将每个worker进程固定在某个CPU上进行,减少
2020-07-27 18:12:27 123
原创 TCP粘包拆包及Netty的解决方案
10 TCP粘包和拆包10.1 TCP粘包拆包概述什么是TCP粘包和拆包1)TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的由于TCP无消息保护边界,需要在接收端处理消息边界问题,也就是我们
2020-07-23 22:04:07 190 1
原创 Netty的线程模型
4 I/O线程模型4.1 IO线程模型分类目前存在的线程模型主要有:1)传统的阻塞IO服务模型2)Reactor模式Reactor模式又可以根据Reactor数量和处理线程数量不同,分为:1)单Reactor单线程2)单Reactor多线程3)主从Reactor多线程Netty主要是基于主从Reactor多线程模型做了改进,其中主从Reactor多线程模型有多个Reactor。4.2 Reactor模型概述传统阻塞IO模型缺点1)每个连接都需要独立的线程去完成处理,当并发量十分大
2020-07-23 21:58:25 222
原创 FastDFS实现分布式文件系统
FastDFS实现分布式文件系统1、FastDFS简介FastDFS是什么用C语言编写的一款分布式文件系统。FastDFS为互联网量身定制,充分考虑到了冗余备份、负载均衡、线性扩容等机制,注重高可用、高性能。使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传下载等服务。流程安装流程准备好FastDFS的相关压缩包。1)yum -y install libevent安装相关的依赖环境2)解压libfastcommon-1.0.7.tar.gz压缩包,并进入解压后
2020-07-23 20:43:41 161
原创 基于Netty实现在线实时聊天系统
基于Netty实时通信的简单案例实现1 案例说明多个客户端与服务器端建立websocket连接,服务器端将收到的客户端消息发送给所有与服务器端建立连接的客户端,相当于直播间的群聊功能。当一个客户端发送消息时,所有客户端都将收到消息。并且保证实时性。2 服务器端搭建建立maven项目,引入Netty依赖:<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</a
2020-07-23 10:58:18 2067 1
原创 Java中的NIO编程
1 BIO和NIO简介BIO、NIO、AIO简介1)Java BIO : 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销2)Java NIO : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理3)Java AIO(NIO.2) : 异步非阻塞,AIO 引入异步通道的概念,采用了 Pr
2020-07-19 09:17:13 406
fastDFS.zip
2020-07-23
nccl_2.4.8-1+cuda10.0_x86_64.txz
2019-09-17
se_resnet50-ce0d4300.pth
2019-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人