从0开始实现rpc
概述
rpc和http都是属于应用层、 HTTP/1.1协议的内容非常的冗余,显得非常啰嗦。因为为了适用于多个平台。
而rpc定制化程度更高,可以使用体积更小的序列化协议去保存这些数据结构。同时不需要考虑各种浏览器的行为,比如重定向跳转之类的,因此性能会更好一点。
rpc的通信流程
在实现一个rpc之前我们有必要了解一下它的大概工作流程
rpc能实现调用远程方法就跟调用本地(同一个项目中的方法)一样,发起调用请求的那一方叫做调用方,被调用 的一方叫做服务提供方。 发起远程调用的核心是网络通信,整个调用过程中的一些流程和细节:
传输协议:既然 rpc 存在的核心目的是为了实现远程调用,既然是远程调用那肯定就需要通过网络来传输数 据,并且 rpc 常用于业务系统之间的数据交互,需要保证其可靠性,所以 rpc 一般默认采用 TCP 来传输。事实 上。我们常用的 HTTP 协议也是建立在 TCP 之上的。选择tcp的核心原因还是因为他的效率要比很多应用层协议高 很多。
封装一个可用的协议:选择了合适的传输层协议之后,我们需要基于此建立一个我们自己的通用协议,和http 一样需 ...
redis原理
Redis原理篇1、原理篇-Redis数据结构1.1 Redis数据结构-动态字符串我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。
不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。例如,我们执行命令:
那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“虎哥”的SDS。
Redis是C语言实现的,其中SDS是一个结构体,源码如下:
例如,一个包含字符串“name”的sds结构如下:
SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS:
假如我们要给SDS追加一段字符串“,Amy”,这里首先会申请新内存空间:
如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1;
如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。称为内存预分 ...
使用游标分页优化深分页
业务复现12345QueryWrapper<Post> postQueryWrapper = new QueryWrapper<>();postQueryWrapper.eq("detection_status",DETECTION_SUCCESS) .eq("has_delete",0) .eq(!Strings.isBlank(tagId),"tag_id",tagId)//tagId 不为空 更具tagId 查询 .orderByDesc(strategyMap.get(order));
在进行分页查询的时候,此时数据库中的数据是无序的,假设数据库中有三个数据1,3,5
第一次查询的时候可能是 1,3,5 的顺序,此时在第一页取俩条数据是1和3
第二次查询的时候可能是 1,5,3 的顺序,此时在第二页取俩条数据是3
此时导致俩次查询到同一条数据2
第一次问题的解决办法123456QueryWrapper<Post> postQuery ...