![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【后端】
文章平均质量分 85
理想主义的许佳佳
一位理想主义的程序员,祝你健康幸福。
展开
-
序列化小结
为什么要序列化wiki的描述如下:序列化在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。笔者个人理解如下:序列化:“把当前环境的数据结构 转化成一种 可存储 或者 可传输的形式” 的过程。反序列化:”这种可传输或者可存储的形式 还原成 当前环境的数据结构“的过程。此处为了便于读者理解举个例子:现在有一个 Student类,有name,age等参数。需求一原创 2021-02-09 06:29:49 · 270 阅读 · 0 评论 -
一篇文章理解进程、线程、协程
概述笔者之前已经对进程和线程有过了一定的探索,有兴趣的读者可以了解下:进程和线程的区别(Linux)近期笔者又接触到了协程,顺便也想尝试用一种更加通俗易懂的方式讲下这几个概念。期望能对有需要的读者有所帮助,如有理解不对的地方欢迎评论指出。为什么要有多进程?多进程目的:提高cpu的使用率例子:一个用户现在既想使用打印机,又想玩游戏。假设只有一个进程(先不谈多线程)从操作系统的层面看,我们使用打印机的步骤有如下:使用CPU执行程序,去硬盘读取需要打印的文件,然后CPU会长时间的等待原创 2020-11-01 08:17:42 · 1210 阅读 · 2 评论 -
一篇文章理解 同步异步、阻塞非阻塞
前述同步异步,阻塞非阻塞是一些非常常见的概念,但是对于开发者来说往往是用到了很难说清楚。笔者专门整理了下这方面的概念,作此文以记之。这部分内容可能存在一些争议,如有不同意见欢迎评论交流。概念个人理解同步异步与阻塞非阻塞最好的区分是从描述对象上:同步异步:用于描述任务、事件或者行为。阻塞非阻塞:用于描述线程或者进程是否会被挂起。同步一个任务调起另一个任务的时候,会去等待其任务返回结果(或执行结束),然后再继续执行。如下两图都是同步操作:在Task A调用Task B后,Task原创 2020-06-06 18:35:51 · 1764 阅读 · 0 评论 -
Redis RDB和AOF
原文地址:Redis持久化RDB和AOF优缺点是什么?Redis是一种高级key-value数据库。数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。Redis为了保证效率,数据缓存在内存中,Redis 会周期性的把更新的数据写入磁...转载 2019-05-19 09:37:21 · 291 阅读 · 0 评论 -
Raft协议详解
本文参考:《大数据日知录》Raft协议详解简介Raft是一个一致性算法,它用于在分布式场景中保证多个副本之间的一致性。对于”分布式场景“和”一致性“不是很理解的读者可以先看下笔者前一篇文章:CAP简介在Raft中,实现多个副本的一致性的方式是,让多个副本之间的log数据达成一致。基本概念集群中的服务器有三个状态:Leader、Follower和Candidate。每个状态...原创 2019-05-19 15:25:33 · 1486 阅读 · 0 评论 -
SkipList详解
本文参考:《大数据日知录》概念SkipList是一种用来代替平衡树的数据结构。虽然在最坏的情况下SkipList的效率要低于平衡树,但是大多数情况下效率仍然非常高,其插入、删除、查找的时间复杂度都是O(log(N))。除了高效外,其实现和维护非常简单也是一大优势。SkipList的使用还是比较广泛的,比如在LevelDB中的MemTable就是使用SkipList实现的,Redis的...原创 2019-05-19 17:45:28 · 2436 阅读 · 0 评论 -
由LevelDB理解 LSM-Tree
本文参考《大数据日知录》LSM Tree 学习笔记概念LSM-Tree(Log-structured Merge tree)是一种数据结构,它的本质是将大量的随机写操作转换成批量的序列写。LSM-Tree可以极大提升磁盘数据写入的速度,所以LSM-Tree非常适合对写操作效率有高要求的应用场景。为何“随机写”改成“序列写”可以提高磁盘写入速度磁盘每次读写数据,不管你读写的数据有...原创 2019-05-11 15:18:42 · 2951 阅读 · 0 评论 -
netty学习小结
前言近期碰到网络相关的问题,准备使用netty,于是学习了一番,本文主要记录学习中的一些要点,至于诸多细节的学习,笔者推荐《Netty实战》和“简书闪电侠”的博客。本文参考:《netty实战》简书闪电侠的博客netty简介Netty是一个NIO客户端服务器框架,目前已经有苹果、Facebook等诸多大厂在使用。主要特点:API简单,文档丰富,社区活跃。使用NIO,能用较少的...原创 2019-06-15 17:47:34 · 438 阅读 · 0 评论 -
游戏对战匹配逻辑小结
前言近期接触了到了游戏后台的匹配逻辑,写此文作记录,也给后来者一些参考。场景与需求玩家去匹配战斗力与自己类似的其他玩家。如果在一定区间找不到对手,那就扩展区间。连续匹配两次,不能匹配到相同的玩家。如果已经战斗过的玩家,在一定时间内不能再被匹配到。(此处假设5分钟内不能再被匹配到,5分钟之后需要又可以被匹配到)数据结构根据上面几个需求,得出以下初步结论:至少要有两个List,一...原创 2019-06-15 18:45:43 · 4347 阅读 · 1 评论 -
netty ByteBuff 详解
本文参考:https://segmentfault.com/a/1190000015104849概要netty的ByteBuff是用来替代nio的ByteBuffer的,与nio的ByteBuffer相比有诸多优势,主要有以下几点:扩容问题ByteBuffer长度固定,分多了会浪费内存,分少了会数组越界。如果发现存储的数据大于ByteBuffer的长度,那么就需要创建一个新的Byt...原创 2019-07-13 12:09:14 · 1991 阅读 · 1 评论 -
netty write 和flush 源码解析
本文参考:https://www.jianshu.com/p/1ad424c53e80概要netty中每次write之后都需要flush才能将消息发送出去,代码如下。笔者很好奇为什么一定要分成write和flush两个方法——既然每次都需要调用flush,直接由框架自动去调用flush不就好了吗?于是就去看了源码,写此文记之。public void channelRead(Chann...原创 2019-07-13 15:17:24 · 2544 阅读 · 0 评论 -
netty实现 socket demo
概要近期学习netty,写了个socket简单demo作记录,也供新手参考。由于主要记录netty网络协议的使用,demo中并没有socket粘包和分包的处理,有兴趣的读者可以自己写下,理论可以参考笔者文章:Socket粘包和分包问题netty相关理论可以参考笔者文章:netty学习小结简介使用nodejs模拟客户端发送消息。netty中使用SocketInHandler和Dea...原创 2019-06-29 10:56:38 · 4167 阅读 · 0 评论 -
netty 长连接 demo
概要近期接触netty长连接方面,实现简单demo记录,主要实现以下内容:使用HashMap存储Channel,保证需要的时候可以根据key获取到。被HashMap存储的长连接实现心跳机制。demo中是以id为key存储在HashMap中,解析内容用到了Gson。为了让demo更容易理解,没有实现粘包分包的逻辑,一旦发生会有问题。对粘包和分包有兴趣的可以看下笔者的另一篇文章:So...原创 2019-07-20 10:11:33 · 1019 阅读 · 0 评论 -
自定义网络协议总结
为什么要自定义网络协议?目前网络通信常用的应用层协议已经有了HTTPS和HTTP,为什么还要自定义协议呢?个人认为主要有两个好处:更加安全。目前网络上最常见的攻击手段就是抓HTTP/HTTPS包,如果自定义网络协议,抓包工作无法使用,能避开大部分来自于脚本小子的攻击。当然对于直接在TCP/IP层的攻击还是需要由网络协议本身的安全来保证。更加轻便。HTTP/HTTPS在业务上绝对已经...原创 2019-08-04 09:15:21 · 3633 阅读 · 0 评论 -
二段式提交协议和三段式提交协议(2PC和3PC)
参考《大数据日知录》2PC与3PC场景这两者是常用解决分布式事物的方式,保证在分布式事物中要么都提交事物,要么都取消事物。二段式提交(2PC)主要有两个阶段:准备阶段提交阶段主要步骤如下:4. 步骤一,协调者询问参与者是否可以提交。5. 步骤二,参与者告知提交者可以提交。6. 步骤三,协调者让参与者发送提交请求。7. 步骤四,参与者提交完毕后告知协调者已经提交完毕。...原创 2019-04-27 15:39:37 · 2100 阅读 · 0 评论 -
布隆过滤器简介
适用场景检测某个元素是否是巨量数据集合中的成员。一般操作检测某个元素是否是一个数据集合中的成员,我们第一时间想到的就是使用哈希。但是仅仅使用哈希是不够的,当数据非常多的时候,就会有这样的问题:如果只使用一个哈希容器,多个数经过哈希计算后会得到一样的值,如果要查找到具体的某个值的话,单个节点必须存储原来的值。那么如果数据非常多,比如有10GB,那么这个哈希容器也不会小于10GB。布隆...原创 2019-04-27 11:14:07 · 473 阅读 · 0 评论 -
公钥加密、数字签名、消息认证
网络安全的几个问题一、网络是开放的,在上面要发送一段内容,随时可能被其他人拦截看到,因此需要加密。 最初想到的是对称加密,可以通过同一个密钥加密,也可以通过同一个密钥解密。(比如加密字符串,加密时每个字符ASCII码同时加2,解密时ASCII同时减2,在这里密钥就是2,而ASCII的操作称作加密解密算法,加密前的字符串称为明文,加密后的字符串称为密文) 但是对称加密有一个问题:通信双方在网...原创 2018-05-11 09:23:34 · 2545 阅读 · 0 评论 -
多线程读写优化(双buff内存交换代替有锁设计)
例子(场景)目前有线程ThreadA和ThreadB,一个队列Queue。ThreadA会对Queue进行入队操作,而ThreadB会对Queue进行出队操作。如下图: 一般情况下,我们都会直接给Queue上锁,这样就能保证多线程同时对Queue进行操作时不会有问题。 直接加上锁可以很容易就解决这个问题,但是也会带来其他的问题:入队操作一般几乎不耗时,而出队操作往往带有其他一系列逻辑操...原创 2018-07-22 09:55:18 · 3121 阅读 · 5 评论 -
Socket 粘包和分包问题
概念Socket通信时会对发送的字节数据进行分包和粘包处理,属于一种Socket内部的优化机制。粘包:当发送的字节数据包比较小且频繁发送时,Socket内部会将字节数据进行粘包处理,既将频繁发送的小字节数据打包成 一个整包进行发送,降低内存的消耗。分包:当发送的字节数据包比较大时,Socket内部会将发送的字节数据进行分包处理,降低内存和性能的消耗。例子解释当前发送方发送了两个包,...原创 2018-10-20 11:08:42 · 9175 阅读 · 1 评论 -
Java NIO简介
原文地址:https://zhuanlan.zhihu.com/p/27419141简介个人理解,nio 最关键的地方是实现了io的多路复用问题。引入多路复用的原因实际上,在服务端与客户端一对一通信的时候,同步阻塞式地读写并不会有太大的问题,最典型的就是两个对等机器之间建立了TCP连接,并且通过TCP连接来发送一个大文件,有大量的数据传输。在这种场景中,阻塞式的写法简单高效。但是,...转载 2018-11-17 11:12:50 · 663 阅读 · 0 评论 -
负载均衡、Docker、服务发现科普
本文参照:https://zhuanlan.zhihu.com/p/32841479https://www.jianshu.com/p/9826d866080ahttp://www.ruanyifeng.com/blog/2018/02/docker-tutorial.htmlhttps://zhuanlan.zhihu.com/p/32027014负载均衡wiki解释:负载均...原创 2018-12-15 11:21:14 · 799 阅读 · 0 评论 -
apache kafka 简介
概述Apache Kafka 是分布式发布-订阅消息系统。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。kafka合适也是最常见的使用场景就是日志投递。即适合对可靠性、持久性、吞吐量要求高的场景。图解下图摘自wiki:一般使用中会接触到的主要是以下几个名词:Producer: 消息的投递者Consumer: 消息的消费者Topic: Producer和Cons...原创 2019-01-12 16:32:47 · 449 阅读 · 0 评论 -
base64原理简介
原文地址:http://www.ruanyifeng.com/blog/2008/06/base64.htmlhttp://blog.xiayf.cn/2016/01/24/base64-encoding/转化步骤:将每三个字节作为一组,一共是24个二进制位。将这24个二进制位分为四组,每个组有6个二进制位。在每组前面加两个00,扩展成32个二进制位,即四个字节。(加00的作用是...转载 2019-02-16 10:08:54 · 504 阅读 · 0 评论 -
mysql索引原理:B-Tree 和 B+Tree简介
本文参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41856完全不了解B-Tree的读者可以先看下这篇文章:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41844B-TreeB-Tree毫无疑问是树结构,如下图:主要有以下特性:d为大于1的一个...原创 2020-10-17 10:42:51 · 1547 阅读 · 2 评论 -
coids+pika集群 问题小记
概要近期搭建coids+pika集群,碰到一些小坑,此文记录下流程以及碰到的问题。pika github:https://github.com/Qihoo360/pikacodis github:https://github.com/CodisLabs/codis碰到问题的时候第一时间除了google之外,其实也可以去官方github的issue中搜索下,因为一般流行框架的坑都会有人先...原创 2019-04-03 20:57:03 · 1693 阅读 · 0 评论 -
哈希分片总结
主要参考:《大数据日知录》https://zhuanlan.zhihu.com/p/34985026什么是哈希分片后台随着数据规约的越来越大,单机明显无法存储着庞大的数据量,只能依靠大规模集群在对数据进行存储和处理,所以系统的可扩展性也成为了很重要的一个点。目前主流的大数据存储于计算系统通常采用横向扩展的方式支持系统的可扩展性,即通过增加机器数量来获得水平扩展能力。与此对应,对于待存...原创 2019-03-23 16:22:09 · 3446 阅读 · 0 评论 -
由codis架构一步步理解分布式数据库集群
前言近期在搭建codis,其中涉及的知识点较多,可以说每个控件都有其作用。而很多知识点在分布式集群的方向上是共通的。于是,在大概梳理完知识点后,做此文记载该块内容,也供后面入坑的新手参考。codis github链接:https://github.com/CodisLabs/codis主从服务器和sentinel我们要搭建一个数据库服务器,最简单的就是直接一台服务器部署数据库的功能,...原创 2019-03-30 17:10:15 · 1024 阅读 · 3 评论 -
CAP简介
参考《大数据日知录》概念CAP:Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容忍性)CAP最初是由Eric Brewer提出,他证明了,在分布式数据系统中,CAP三要素不可能兼得,同时只能满足其中的两种。单条解析Consistency(一致性)在分布式系统中,同一数据多副本的情况下,对于数据的操作能保证不会出现多...原创 2019-04-13 11:33:51 · 3477 阅读 · 0 评论 -
一个例子理解依赖注入
前言之前已经记录过一篇文章解释依赖注入,现在看来有点过于理论化,于是写了一个demo解释下什么是依赖注入,也是在实际开发中依赖注入的使用场景。对依赖注入还完全不理解的可以看一下上一篇文章:依赖注入 简介场景假设目前你正在开发公司的一个框架,为了保证线上代码的安全,你需要引入你们公司的“线上开关”的模块,这样如果发现你的框架有问题,可以及时用线上开关关闭部分功能,而不至于在下个版本发布前...原创 2019-04-13 15:00:03 · 1767 阅读 · 0 评论 -
阿里云+docker搭建简单node.js服务
前提概要实习的时候接触到docker,当时对其理解比较模糊。现在回学校做毕设,正好服务器这一块没人写,于是稍微复习了一下nodejs,买了个阿里云,摆弄了一下docker,搭建了个简单的服务器。最终效果主要是提供HTTP服务器,直接通过IP访问,提供两个示例: http://120.77.148.92/point_info http://120.77.148.92/img/mi...原创 2018-04-13 08:24:22 · 2890 阅读 · 0 评论