- 博客(27)
- 收藏
- 关注
原创 华为机试:报文解压缩
2)原始报文不包含数字,所有的数字只表示重复的次数 n ,例如不会出现像 5b 或 3[8] 的输入;注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;n[str],表示方括号内部的 str 正好重复 n 次。为了提升数据传输的效率,会对传输的报文进行压缩处理。1)原始报文长度不会超过1000,不考虑异常的情况。输入一个压缩后的报文,请返回它解压后的原始报文。
2024-06-17 18:51:26
278
原创 分布式缓存学习笔记(九)—— 缓存生存时间
只有在缓存永不超时的情况下,我们才需要在集群新增节点时进行节点再平衡。如果设置了缓存生存时间 (time to live,TTL),管理员就可以选择不进行节点再平衡,因为老节点上的缓存迟早会因为超时而被删除。本章我们就来讨论缓存生存时间的作用并实现缓存的超时功能。
2023-05-22 15:27:22
248
原创 分布式缓存学习笔记(八)—— 节点再平衡
上一章实现了缓存服务集群。当集群的容量逐渐不能满足系统要求时,我们需要对其扩容,扩容的方法是增加新的节点。然而新增节点一开始是空的,而老节点几乎是满的,此时我们就需要节点再平衡,将老节点上的缓存迁移一部分到新节点上。本章将讨论节点再平衡的技术细节并实现节点再平衡的功能。
2023-05-22 15:09:40
178
原创 分布式缓存学习笔记(七)—— 分布式缓存(一致性哈希算法)
本章我们将主要讨论分布式缓存的概念,描述缓存集群相对单节点缓存的优势以及如何实现一个缓存集群。
2023-05-22 12:37:12
1358
原创 分布式缓存学习笔记(六)—— 异步操作
上一章介绍了 RocksDB 的批量写入技术,以及如何将批量写入技术应用到缓存服务中。只需要改变rocksdbCache 结构体的内部实现,Set 操作就能有40%以上的写入性能提升。那“如果 RocksDB 还支持批量读取,那我们的 Get 操作性能是否也可以得到提升?” 回答是:不行。RocksDB 虽然有一个批量读取 (MultiGet)功能,但是它不能让我们的读取性能得到提升。
2023-05-21 08:29:35
1089
原创 分布式缓存学习笔记(五)—— 批量写入
上一章介绍了利用pipelining技术在不改变任何服务端实现的情况下提升性能,这样的提升非常有限。本章将要做的是深入 RocksDB 内部,借助它的批量写入功能来给我们的缓存服务 Set 操作提速。
2023-05-20 23:54:10
610
原创 分布式缓存学习笔记(四)—— 用pipelining加速性能
我们会在本章介绍 pipelining 技术的原理研究客户端如何通过pipelining 技术来加速自己的吞吐量。
2023-05-20 23:22:30
163
原创 分布式缓存学习笔记(三)—— 数据持久化
我们的缓存是inmemory 的,这样的实现存在两个问题,首先是缓存的容量受到内存的限制,其次是一旦服务重启,之前保存的键值对就会全部丢失。这样对于客户来说很不友好,功能上来看也不完备。现在基本上所有的缓存服务都支持数据持久化,也就是说在服务器重启后,缓存的数据不会丢失。为了能做到这一点,我们在本章会用 RocksDB 来重新实现我们的缓存服务。
2023-05-19 11:43:15
431
1
原创 分布式缓存学习笔记(二)——基于TCP的内存缓存服务
受限于HTTP/REST协议的解析,基于HTTP/REST的内存内缓存服务运行的性能非常差,只有 Redis 的四分之一,而 Redis 使用的序列化协议规范正是基于 TCP 的。所以在本章,我们的目标就是要抛开 Go语言自身的HTTP框架,实现一个基于TCP的缓存服务来提升我们的性能。
2023-05-19 10:20:15
337
原创 Redis 持久化机制
需要注意的是,如果这段时间并没有新的缓存 Set 操作,那么持久化的效率还是相当不错的,因为持久化进程并不需要从原服务进程复制内存,它们共享同一批虚拟内存页。但是如果在持久化过程中,原服务进程收到了缓存 Set 操作,那就意味着原服务进程中部分内存需要修改,此时操作系统内核会对涉及到的虚拟内存页进行一个写时复制 (copy onwrite)的操作,确保持久化进程地址空间中的数据不变而服务进程中的数据则被更新。AOF 的日志只允许添加,所以不会有数据损坏,日志最后如果有写到一半的命令也可以被轻易丢弃。
2023-05-19 00:09:49
267
原创 分布式缓存学习笔记(一)——基于HTTP的内存缓存服务
用Go语言写基于HTTP的缓存服务太方便了,只需要一个 map来保存数据,写一个 handler 负责处理请求,然后调用 http.ListenAndServe,最后用go run 运行。一切就是这么简单,你不需要去考虑复杂的并发问题,也不需要自己设计一套网络协议,Go语言的HTTP 服务框架会帮你处理好底层的一切。本章要实现一个简单的内存缓存服务,所有的缓存数据都存储在服务器的内存中。一旦服务器重启,所有的数据都将被清零。我们利用HTTP/REST协议的等方法实现缓存的基本操作。
2023-05-18 17:21:47
286
原创 分布式对象存储学习笔记(九)——数据维护
对象存储系统的长期运行离不开对系统的维护,系统维护包括3个方面数据维护则主要通过软件执行预先设定的维护工作。本章将要介绍的就是一个对象存储系统通常都会需要哪些数据维护工作。
2023-05-17 18:54:48
285
原创 分布式对象存储学习笔记(八)——数据压缩
在对象存储服务端实现数据压缩的功能。在整个云存储系统中,对象存储服务端并不是最适合做数据压缩的地方。最适合做数据压缩的地方是客户端。一个高性能的客户端不仅可以将大量小对象打包成大对象提高存储和传输的效率,也可以在客户机本地进行数据压缩,进一步节省网络带宽和存储空间。云存储系统在设计最初就包含了专门的客户端,那么一定要将数据压缩功能放在客户端,而不是服务端。
2023-05-17 17:56:38
669
原创 分布式对象存储学习笔记(六)——数据冗余和即时修复
本文介绍数据冗余的概念和 RS码技术。介绍如何利用RS码实现对象存储系统的数据余策略,并详细述即时修复的实现方式。
2023-05-16 16:55:54
1448
1
原创 分布式对象存储学习笔记(五)——数据校验和去重
本章介绍和实现对客户端提供的散列值进行数据校验的原因和方法,并实现对象存储的去重功能。同时,本章还会对数据服务的对象定位性能进行优化。
2023-05-16 11:24:44
1082
原创 分布式对象存储学习笔记(四)——元数据服务
元数据服务就是提供对元数据的存取功能的服务。元数据指的是对象的描述信息。对象的名字、版本、大小以及散列值等。这些都是系统定义的元数据,因为它们的存在对一个对象存储系统有实际意义,比如说客户端和接口服务之间根据对象的名字来引用一个对象;一个对象可以有多个版本,除了删除标记外,每个版本实际都指向数据服务节点上的一份数据存储。自定义的元数据通常是以键值对形式保存的任意描述信息,比如一张照片的拍摄时间和拍摄地点,一首歌的作者和演唱者等。
2023-05-15 11:24:09
1198
原创 分布式对象存储学习笔记(三)——HTTP请求封装
对go语言的http包作一些封装,把http函数调用转换成读写流的形式。用于接口服务调用数据服务实现数据传输。
2023-05-14 16:47:58
789
原创 BCGO:一种生物启发式云计算任务调度算法
随着应用程序计算需求的快速增长,异构计算资源不断地增多,任务调度成为云计算领域中重要的研究问题。云计算提供了一个异构的环境来执行各种操作,对于任何应用程序,将异构任务高效地调度到异构处理器是获得高性能的关键。云环境下的任务调度是一个NP-Hard优化问题,研究者提出了各种启发式和元启发式技术来提供问题的次优解决方案。本文提出了一种基于天牛须搜索(BAS),并结合蚁群优化(ACO)和遗传算法(GA)的任务调度算法天牛群遗传优化(BCGO)来优化系统的最大完工时间和减少平均等待时间。
2023-04-24 14:37:47
1505
3
原创 go语言中常用的一些格式化样式中的动词及功能
常用的一些格式化样式中的动词及功能动词功能%v按值的本来值输出%+v在 %v 的基础上,对结构体字段名和值进行展开%#v输出 Go 语言语法格式的值%T输出 Go 语言语法格式的类型和值%%输出 %% 本体%b整型以二进制方式显示%o%d整型以十进制方式显示%x整型以 十六进制显示%X整型以十六进制、字母大写方式显示%UUnicode 字符%f浮点数%p指针,十六进制方式显示...
2021-07-06 12:17:11
164
原创 Go 中的面向对象
Go 中的面向对象Go 没有类,而是松耦合的类型、方法对接口的实现。OO 语言最重要的三个方面分别是:封装,继承和多态,在 Go 中它们是怎样表现的呢?**封装(数据隐藏):**和别的 OO 语言有 4 个或更多的访问层次相比,Go 把它简化为了 2 层包范围内的:通过标识符首字母小写,对象 只在它所在的包内可见可导出的:通过标识符首字母大写,对象 对所在包以外也可见类型只拥有自己所在包中定义的方法。**继承:**用组合实现:内嵌一个(或多个)包含想要的行为(字段和方法)的类型;多重继承可
2021-06-23 11:14:38
106
原创 go语言 调用接口的方法
在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以从具体类型 P 直接可以辨识的:指针方法可以通过指针调用值方法可以通过值调用接收者是值的方法可以通过指针调用,因为指针会首先被解引用接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址将一个值赋值给一个接口时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。package mainimport ( "fmt")type List []intfunc (l L
2021-06-22 09:29:39
2765
1
原创 golang append 函数常见操作
将切片 b 的元素追加到切片 a 之后:a = append(a, b...)复制切片 a 的元素到新的切片 b 上: b = make([]T, len(a)) copy(b, a)-删除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)切除切片 a 中从索引 i 至 j 位置的元素:a = append(a[:i], a[j:]...)为切片 a 扩展 j 个元素长度:a = append(a, make([]T, j)...)在索引 i..
2021-06-14 22:16:23
306
原创 Go 单元测试
Go语言作为一门工程化语言,但Go语言一个包下只能有一个main()函数,为了避免测试函数时要新建包或每次都修改main()函数,Go提供了非常简单而且实用的编写单元测试的能力。而且每个测试方法都可以单独执行,也可以通过一个命令全部执行。文件名必须以xxx_test.go命名;方法名称必须是Test[^a-z]开头,而且 Test 的后缀部分第一个字符必须大写;方法参数必须是 t *testing.T。package mainimport ( "fmt" "testing")fun
2021-06-13 19:52:12
263
1
原创 Goland 时间和日期time
time 包为我们提供了一个数据类型 time.Time(作为值使用)以及显示和测量时间和日期的功能函数。time.Now() :获取当前时间可以t.Day()、t.Minute() :获取时间的一部分;自定义时间格式化字符串: fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year()) 将会输出 21.07.2011。Duration 类型表示两个连续时刻所相差的纳秒数,类型为 int64。Location 类型映射某个时区的时间UTC
2021-06-13 19:05:34
889
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人