- 博客(135)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Redis-分布式锁-明了清晰
1、什么是Redis分布式锁Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。所谓的占坑,就是一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁;也可以配合EXPIRE key seconds自动释放锁;设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除2、Redis分布式锁的缺陷Redis 分布式锁不能解决超时的问题,分布式锁有一个
2021-01-26 23:00:04
158
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 源码-JDK1.8HashMap扩容方法resize()解析
1、准备知识HashMap的底层数据结构Java语言的基本数据结构可以分为两种,一种是数组,另一种的模拟指针/引用,Java语言中涉及到的数据结构都是这两种的扩充。JDK1.8之前HashMap是数组+链表结合的链表散列。JDK1.8在解决哈希冲突上发生了变化,当链表长度大于阈值/默认8的时候,会将链表转化为红黑树,减少搜索时间。hash算法我们希望HashMap的元素位置尽量分散,最好是每个位置只有一个元素,这样用hash算法求得该位置后可以直接返回结果,不用再遍历链表/红黑树。H
2020-12-13 23:33:21
310
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JVM-JAVA对象创建的五个步骤
对象创建的五个步骤1、类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2、分配内存在类加载检查完成后,虚拟机为new出来的对象分配内存。新对象需要的内存大小在类加载完成后就已经确定,现在要做的是吧一块确定大小的内存从Java堆中划分出来。分配方式涉及到两种:指针碰撞空闲列表堆内存规整时堆内存不规整
2020-06-29 10:03:01
6354
7
原创 EdgeCloudSim-windows端通过intellij打开-方便快捷
1、下载开源的EdgeCloudSim到本地https://github.com/CagataySonmez/EdgeCloudSim复制以上地址打开github链接,可以使用git指令clone也可以直接下载压缩包解压2、通过intellij打开左上角点击File->open->已经解压好的EdgeCloudSim-master文件夹打开之后配置相关环境运行:1)在src文件夹右键可以mark directory as你想要的格式2)记得切换对应的JDK版本新建一个文件
2021-04-21 15:26:42
1062
2
原创 Intellij-对Matlab的支持-开源插件使用
1、开源地址https://github.com/kornilova203/matlab-IntelliJ-plugin2、如何使用1、先在Maven或者别的方法将本插件下载到自己的intellij过程中2、直接运行,会出现报错,因为这个插件是辅助Matlab融合到Java开发环境中的,但并没有自带matlab编译器3、右键自己的matlab程序(一般是画图用的),找到Edit…4、导入自己本地的Matlab.exe路径,.m文件就能直接在intellij上运行了3、作用辅助m
2021-04-21 14:33:59
1943
2
原创 Error:Cannot determine path to ‘tools.jar‘ library for 16 (C:/Users/PC/.jdks/openjdk-16)解决方案
git下来一个新的工程文件,导入intellij之后,找到含main函数的文件运行报错-Error:Cannot determine path to 'tools.jar' library for 16 (C:/Users/PC/.jdks/openjdk-16)点击左上角file-project structure在project将Project SDK等修改为需要的版本,这里我改为1.8...
2021-04-21 10:36:52
24077
14
原创 算法-Stone Game V-石子游戏/阿里笔试0322
几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。返回 Alice 能够获得的最大分数 。
2021-03-26 09:28:24
303
原创 论文-EdgeCloudSim: An environment for performance evaluation of edge computing systems-笔记
1、论文题目EdgeCloudSim: An environment for performance evaluation of edge computing systems :边缘计算系统性能评估的环境2、内容摘要EdgeCloudSim的模拟器工具作为仿真工具来支持计算资源和网络资源的建模以处理边缘计算方案EdgeCloudSim建立在CloudSim之上,可满足边缘计算研究的特定需求并支持必要的功能。本文模拟了不同边缘架构的实验设置,还研究了边缘服务器容量和移动性对整体系统性能的影响
2021-03-26 09:25:00
2320
原创 分析-MQ消息队列中间件-在IM即时通讯系统的用途
MQ消息队列在IM即时通讯的用途1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中;用户的操作日志收集环节:log这种数据价值不高,但关键时刻又非常有用,而且数
2021-03-21 19:43:50
2141
原创 2019百度之星开发者大赛-复盘
进决赛时是前十名,之后因为队员的安排没有去北京参加路演答辩1、比赛介绍面向AI爱好者的深度学习算法竞赛——百度之星-开发者大赛,总之是为有创新力、专业性、团队合作精神和极客精神的顶级开发者团队提供真实的数据集+深度学习飞桨平台+一站式深度学习开发平台AI Studio模型小型化技术成为最近几年学术界和工业界研究的热点,模型小型化技术也从最开始的网络剪枝、知识蒸馏、参数量化等发展为最新的神经网络架构搜索(NAS)和自动模型压缩等技术。目标检测任务要找出图像中所有感兴趣的目标,确定它..
2021-03-16 10:27:42
573
原创 算法-堆排序-原理与Java代码实现
以大顶堆举例:1、首先用构造一个初始的大顶堆2、然后将堆顶和堆尾的一个元素交换,交换后的队尾元素加入排序队列尾3,重新构建堆4,重复步骤2-3理解上就是每次选取堆的最大值,之后将最大值删除,重构堆再重复以上操作在Java中我们常用优先队列构建大顶堆和小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>();在后边的括号中使用Lamba表达式调整大顶堆和小顶堆使用代码实现一个堆排序如下package so
2021-03-10 09:45:29
118
原创 Java-HashMap的put()方法-源码详解
1、HashMap是什么?HashMap继承自Map接口,是键值对存储的一种集合。JDK1.7之前底层使用数组+链表实现;JDK1.8之后当链表长度大于默认值8的时候,链表转换为红黑树一般的put()方法就是将key-value添加到HashMap当中,通过key的hashCode经过扰动函数后得到hash值就是在数组中的位置,之后判断数组中是否已经存在了当前的value,存在则覆盖,不存在通过拉链法解决Map<Object,Obkect> hashmap = new HashMap
2021-02-27 15:05:36
2274
原创 Netty-ChannelInitializer-实现原理
在之前的文章中解读了Netty对于一条连接的各个状态的生命周期进行了解读1、ChannelInitializer的实现原理在定义handler的时候通过childHandler()方法设置了一个handle/也就是ChannelInitializer在ChannelInitializer的initChannel()方法中,通过获取channel对应的管道,在里面加入各种方法//xxxxxxxxxxxxxx省略代码```.childHandler(new ChannelInitializer&l
2021-02-17 21:42:20
871
原创 Netty-ChannelHandler-生命周期/顺序解读
继承关系ChannelHandler---------->ChannelInboundHandler----------->ChannelInboundHandlerAdapter自定义一个handler继承ChannelInboundHandlerAdapter,来查看ChannelInboundHandlerAdapter中各个方法的执行顺序LifeCyCleTestHandler.javapublic class LifeCyCleTestHandler extends Cha.
2021-02-17 21:18:45
764
1
原创 算法-尽可能使字符串相等-滑动窗口
1、题目描述给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。-
2021-02-05 22:28:10
157
原创 Netty-基于Netty实现RPC-仿Dubbo
1、什么是RPCRPC,英文全称是Remote Procedure Call,翻译过来就是远程过程调用。作为一个计算机通信协议,运行在计算机A的程序调用另一台计算机B上的子程序就像调用本地方法一样方便,而这两个程序是分布在不同的服务器上的RPC远程过程调用图示:其中Client就是RPC服务的消费者,Server就是服务提供者,通过上图可以看到完整的调用关系RPC就是将以上的步骤全部封装起来,用户直接使用,而不用关心使用细节,部署后直接能像使用本地方法一样使用远程程序2、设计一个RPC
2021-02-05 22:07:44
236
原创 Java错误解决-incompatible types: cannot infer type arguments for PriorityQueue<>
在以下代码运行时出错PriorityQueue<Long> pq1 = new PriorityQueue<>((o1,o2) -> (o2 - o1));//大顶堆查看报错原因Line 6: error: incompatible types: cannot infer type arguments for PriorityQueue<>reason: cannot infer type-variable(s) E(argument mismat.
2021-02-03 15:19:39
6523
1
原创 Netty-Unpooled类-细节使用
1、是缓冲区工具类作为Netty具体的缓冲区/数据容器,提供的常用方法如下区别于NIO的ByteBuffer通过给定的数据和字符返回一个Bytebuf对象public static ByteBuf copiedBuffer(CharSequence string,Charset charset)2、内部细节ByteBuf内部维持了三个变量,一个是readerIndex/读数据的指针,一个是writerIndex/写数据的指针,一个是capacity/容量大小3、实战分析代码1pack
2021-02-02 17:46:43
951
原创 Netty-EventLoopGroup/NioEventLoopGroup-自动向下
1、NioEventLoopGroup是EventLoopGroup的实现类EventLoopGroup接口直接继承JDK中的EventExecutorGroup接口。Netty中的NioEventLoopGroup是继承了MultithreadEventLoopGroup抽象类,而MultithreadEventLoopGroup继承MultithreadEventExecutorGroup抽象类。MultithreadEventExecutorGroup抽象类实现了Netty中的EventLoo.
2021-02-02 16:52:05
188
原创 IntelliJ IDEA 2021.1.EAP发布-新特性介绍-附下载链接
1、Java16支持最新发布的IntelliJ IDEA 2021.1.EAP版本,增加了对JDK16的基本支持1)内部类可以声明显式或隐式的成员tream.collect(toUnmodifiableList())被转换成stream.toList()当前toList()函数显示在stream的code completion list中2、WSL 2支持当用户的 IDE 在 Windows 上运行时,该 EAP 将包括对 WSL 2 内的 Java 项目的初步支持。Inte
2021-02-02 16:24:43
2849
原创 Netty-Future/ChannelFuture-核心组件II
1、在Netty中的作用Netty中的IO操作都是异步进行的,并不能和同步一样立即知道消息是否被正确处理Netty为IO操作注册一个监听,当IO操作成功或者不成功的时候都会自动触发注册的监听事件Future和ChannelFuture就是为监听IO事件服务的,不敢IO操作成功不成功都会返回一个ChannelFuture2、FutureNetty的Future接口继承了JDK的Future接口,同时提供了更多的方法public interface Future<V> exten
2021-02-01 21:47:36
222
原创 Netty-Bootstrap/ServerBootstrap-核心组件I
1、BootstrapBootstrap的字面意思是引导,通常情况下,一个Netty应用由一个Bootstrap开始,配置整个Netty程序和串联各个组件在Netty中,Bootstrap是客户端程序的启动引导类2、ServerBootstrap在Netty中,ServerBootstrap是服务端启动引导类3、二者相关的常用方法//该方法用于配置两个服务器端的EventLooppublic ServerBootstrap group(EventLoopGroup parentGrou
2021-02-01 21:28:05
194
原创 Netty-通过Maven构建Netty项目-IDEA依赖导入
1、IDEA IntellIJ左上角File ->New -> Project -> 新建一个Maven工程2、左上角打开pom.xml文件配置依赖3、加入依赖语句,根据需求选择Netty的版本 <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all.
2021-01-31 20:12:35
12404
1
原创 Netty-基于NIO实现群聊系统-逐步搭建
1、功能介绍基于NIO实现一个群聊系统,实现服务器端和客户端之间的简单通讯,非阻塞方式实现多人群聊,客户端的消息可以无阻塞的发给所有的其他用户,也能接收其它用户的消息服务器端:需要监测用户上线、下线,实现客户端消息转发功能客户端:通过通道无阻塞的发送消息给其它用户,并接收其他用户的消息2、系统分析**服务器端:**服务器启动并监听端口,服务器接收客户端的消息并转发,同时处理客户端上线和离线**客户端:**连接服务器,发送消息,接收服务器转发的消息3、服务器端实现package N
2021-01-30 20:32:43
208
2
原创 Netty-NIO学习-基于FileChannel读写实战
1、准备知识介绍NIO模式的三大组件:Selector/选择器、Channel/通道、Buffer/缓存的关系图如下所示:每个线程对应一个Selector,每个Selector对应多个Channer,每个Channerl对应一个Buffer,每个Buffer对应一个客户端程序。缓冲区/Buffer的实质是一个可以读写数据的内存块,底层是容器对象/数组。可以使用flip()方法进行读写切换。Buffer是一个顶层抽象父类,有很多实现子类2、本地文件写数据FileChannal主要用作对本地文
2021-01-28 20:10:10
669
2
原创 Netty-使用线程池优化BIO-代码实现
1、背景介绍已知NIO的性质是每有一个新的连接请求就要新建一个线程与之连接,线程的创建对资源的消耗是很大的,可以使用之前学过的池化思想来节省线程资源2、设计要求使用BIO模型食记一个服务器端,监听某个端口,当有客户端请求连接时就启动一个线程与之通讯,服务器端可以接收服务器发生的数据3、代码实现代码分为两部分,第一部分是main函数,第二部分是handler函数,需要注意是是涉及到Socke和输入流的一些Java知识点package BIO;import java.io.IOExceptio
2021-01-27 22:07:15
361
1
原创 Netty-三种IO方式-对比介绍
1、IO模型是什么IO模型可以理解为是通信双方用什么样的通道进行数据的接收和发送2、Java支持的IO模型Java支持三种网络编程模型/IO模式:BIO、NIO、AIOBIO:同步阻塞,服务器实现模型是为每个连接创建一个线程,当客户端请求服务端时就要启动一个新线程进行处理,不管这个连接要求什么数据/不要求数据NIO:同步非阻塞,服务器实现模式–一个线程处理多个请求,客户端发起的连接请求都会注册到多路复用器上进行轮询,一次只有一个进行IO请求AIO/NIO.2:异步非阻塞,当前使用的不多,A
2021-01-27 20:59:30
346
2
原创 算法-保证图可完全遍历-并查集
1、题目介绍Alice 和 Bob 共有一个无向图,其中包含 n 个节点和 3 种类型的边:类型 1:只能由 Alice 遍历。类型 2:只能由 Bob 遍历。类型 3:Alice 和 Bob 都可以遍历。给你一个数组 edges ,其中 edges[i] = [typei, ui, vi] 表示节点 ui 和 vi 之间存在类型为 typei 的双向边。请你在保证图仍能够被 Alice和 Bob 完全遍历的前提下,找出可以删除的最大边数。如果从任何节点开始,Alice 和 Bob 都可以到达
2021-01-27 19:16:06
237
原创 Netty-入门介绍-清晰明了
1、Netty是什么?Netty是JBOSS提供的一个JAVA网络应用开源框架Netty是异步的、基于事件驱动的网络应用框架,能够用作快速开发高性能高可用的网络IO程序Netty主要针对在TCP协议下面向Client端/客户端的高并发应用,或者Peer to Peer场景下的大量数据持续传输的应用Netty本质是一个NIO框架,适用于服务器通信相关的多种应用场景。Netty的底层是NIO,NIO的底层是Java的IO和网络编程,再底层就是计算机网络的TCP/IP协议实现Netty的源码已经开源,
2021-01-27 16:17:57
159
原创 Redis-在千万/亿级别数据中筛选数据-场景分析
1、问题描述假如 Redis 里面有 1 亿个 key ,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?2、 解决方式使用Keys指令扫描出指定模式的key列表。3、问题升级这个Redis正在给线上的业务提供服务,采取2的keys指令会带来什么问题?如何解决这个新的问题?4、深入分析Redis是单线程的,keys指令执行的时候会阻塞线程一段时间,这时候Redis对线上业务的服务就会暂停,直至keys指令执行完毕瑷珲恢复。使用scan指令规避以
2021-01-26 23:09:39
1260
1
原创 Redis-集群中有多少个节点-极限分析
1、结论Redis集群最多有16384个节点。2、分析要知道每个Redis哈希槽都要有一个节点相对应,哈希槽的数量是16384,所有极限情况是每个哈希槽对应的节点都不同,所以此时Redis集群最多有16384个节点。3、拓展每个 key 通过 CRC16 算法计算的结果,对 16384 取模后放到对应的编号在 0-16383 之间的哈希槽...
2021-01-26 22:52:22
2631
原创 Redis-集群节点如何组成-从数据机构入手
1、背景集群中的每个节点都需要专门的数据结构来存储集群的状态和自身信息。分为clusterNode和 clusterState结构:–clusterNode记录了集群中的单个节点的状态– clusterState记录集群所有节点作为一个整体的状态2、clusterNode结构typedef struct clusterNode { //节点创建时间 mstime_t ctime; //节点id char name[REDIS_CLUSTER_NAMELEN];
2021-01-26 22:47:52
187
原创 Redis-集群节点间的五种消息类型-区分
1、消息类型划分节点间发送的消息主要分为 5 种:meet 消息、ping 消息、pong 消息、fail 消息、publish 消息。不同的消息类型,通信协议、发送的频率和时机、接收节点的选择等是不同的:2、特点介绍MEET 消息: 在节点握手阶段,当节点收到客户端的 CLUSTER MEET 命令时,会向新加入的节点发送 MEET 消息,请求新节点加入到当前集群;新节点收到 MEET 消息后会回复一个 PONG 消息。PING 消息: 集群里每个节点每秒钟会选择部分节点发送 PING 消息,接
2021-01-26 22:39:31
554
原创 Redis-[压缩列表]数据结构-深入了解
1、什么是压缩列表压缩列表是列表键和哈希键的底层实现之一:1)当一个列表键只包含少量列表项,且都是小整数值或者较短的字符串时;2)当哈希键只包含少量键值对,且键值对的键和值都是小整数值或者较短的字符串时。压缩列表是为了节约内存而开发的2、压缩列表的构成一个压缩列表可以包含任意多个节点/entry,每个节点可以保存一个字节数组或整数值。可以看到以上就是压缩列表的组成,分为zlbytes、zltail、zllen、entryX、zlend几个部分,下边分别介绍1)zlbytes:记录整个压
2021-01-14 21:23:33
149
原创 《剑指Offer》Java实现版-电子科大-2021最新
LeetCode-剑指offer-全1、03数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000/*我的思路:1、暴力解答,两层for循环,直接超时警告 n^22、使用额外的数组来模拟
2021-01-14 19:52:06
1243
1
原创 Redis-[整数集合]数据结构-深入解析
1、什么是整数集合整数集合/intset是集合键的底层实现之一:当一个集合只包含整数值元素,并且整个集合的元素数量不多 的时候使用。是Redis用来保存整数值的集合抽象数据结构,可以保存int16_t,int32_t,int64_t类型的整数值2、如何实现整数集合typedef struct intset{ uint32_t encoding;//编码方式 unit32_t length;//元素数量 int8_t contents[];//保存元素的数组}contents数组是整
2021-01-14 16:15:22
96
原创 Redis-[跳跃表]数据机构-深入解析
1、跳跃表是什么?跳跃表/skiplist是一种有序数据结构,通过在每个节点上维持多个指向其它节点的指针,达到快速访问节点的目的。节点查找平均复杂度O(logN),最坏情况是O(N),还可以通过顺序性操作来批量处理节点。效率可以和平衡树媲美,在Redis中被应用。在Redis中使用跳跃表作为有序集合键的底层实现之一:1)有序集合见包含的元素数量较多时 2)有序集合键的元素的成员是比较长的字符串时。Redis只在两个地方用到跳跃表:1)实现有序集合键 2)在集群节点中用作内部数据结构。2、有序集
2021-01-14 15:32:57
124
原创 算法-Binary Prefix Divisible By 5-可被 5 整除的二进制前缀
LeetCode-1018-每日一题2021.01.14
2021-01-14 13:24:04
177
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人