在redis-cluster模式下使用lua脚本 由于redis cluster不支持事务,在一些原子性的操作时无法使用Multi。因此lua脚本成了最合适的选择,但是由于redis在cluster下多个slot的问题,使用lua稍不注意会导致很多问题。 2023-09-03 #redis #lua
protobuf的二进制编码结构 Protocol Buffers是一种跨平台的序列化数据结构协议,通过.proto文件作为DSL描述,并且将数据以二进制方式字节流方式编码。了解protobuf的编码方式,对于合理组织自己的协议,以及优化业务代码都比较有帮助。 2023-08-29 #go #protobuf
使用Kind在windows上搭建个人用的k8s 在学习k8s的过程中,出于实践的需要,我们经常需要对k8s集群做一些敏感操作,例如使用hostpath,安装daemonset。所以在自己的开发机上组建一个简单的k8s集群是很必要的。本文将会介绍如何使用wsl+Kind搭建一个k8s集群。 2023-08-10 #go #k8s
wire使用技巧 在写go项目时,我们一般对于一些依赖的资源和类会通过依赖注入的方式来解决对象初始化流程耦合的问题。不同于dig和inject这两个工具通过反射来实现依赖注入,wire是通过代码生成的方式。相比之下整体流程更加易懂直观。 2023-07-10 #go #wire
protoc插件编写 利用protoc,可以解析protobuf文件生成。一般来说都是通过自定义插件,调用库方法来实现。官方的protobuf解析实际上也是利用插件完成的,例如protoc-gen-go。 早先使用c++版本书写的时候需要从stdin里获取pb文件的数据,之后再根据descriptor生成代码片段(或者是别的文本片段,txt,json或者别的你需要的文本,根据需求而定),最后把文本输出到stdout里。 2023-05-22 #go #protobuf
ADL,CPO和tag_invoke 在executor提案出现之后,有关于cpo和tag_invoke的话题就变得很常见。这几个功能,包括ADL都是为了解决在不同的namespace下如何正确的匹配到对应的方法的问题。 2023-04-18 #cpp
linux进程内存占用分析 线上服务一般都会遇到因为代码bug或者逻辑不合理导致内存占用暴涨的情况(例如内存泄露),也有可能在线上环境发现内存占用太高和预估不符的情况。单纯分析代码人肉查问题不总是靠谱,此时最直观的方式就是profile进程的内存占用问题。如果遇到了c/c++开发的服务,或者需要分析类似java堆外内存泄露的问题,gperf(tcmalloc)是一个比较好的选择。 2023-03-27 #linux
c++泛型返回值类型推导 C++模板参数类型推导在c++模板中,可以使用以下代码来根据类型推导来定制模板代码: 12345678910template<typename T>void foo(T t) { // c++17之后生效,如果版本更旧可以换成std::is_integral<T>::value if constexpr (std::is_integral_v<T 2022-03-25 #cpp #template