自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 raft

共识算法concensus algorithm是指在分布式系统中,多个节点对某个值达成一致,各个节点总是返回一致对结果,并且只要大于一半对节点还存活,就能正常工作,超过一半节点挂掉会停止工作但绝不会返回不一致但值,一旦达成一致,这个消息就不会丢失状态机和日志raft集群中,每个node都是一个状态极,日志就是一系列但命令,初始时候状态机处于empty状态,每读取一条日志状态机就更改自身但状态,所以只要保证node但日志序列相同,那么他们的状态就一定是相同的。在etcd这种情况下,状态其实就是kv ma

2020-10-30 13:11:31 162

原创 秒杀轻重分离

场景以秒杀为例,不能因为参加秒杀的商品的突发请求就拖垮整个系统。另外秒杀商品和正常商品的下单流程以及优化思路都不一样,所以即便都是下单,也要使用不同的处理逻辑。目的1,容错,部分系统的失败不影响全局2,隔离,不同的逻辑使用不同的优化思路做法1、渠道分离:如优先、无线服务的分离;2、部署分离:如电信、联通、教育、海外服务的分离3、快慢分离:如文字、图片、视频、下载等服务的分离4、用户分离:按set划分系统为用户提供服务,常用的方式是按照游戏世界(区)、按UIN号段、按UIN取模等方式做到服务

2020-10-29 10:44:11 175 1

原创 使用gob实现简单的本地队列

gob 使用https://pkg.go.dev/encoding/gob#example-package-Basic用法利用gob的流式自解析能力,我们可以把数据变成一个stream 流写入文件,然后用另一个线程从文件中读出这些数据。为了回收和避免竞争,可以写一个文件,文件数太大或者超过一定时间以后就生成新文件简单说一下逻辑:调用者传入dir, 和dataHandler写入者逻辑:扫描dir,把所有文件名发送给接收者打开文件 queue.writer.current.timestamp

2020-10-28 11:59:40 255

原创 mysql体系结构和存储引擎

概念数据库:存储数据的文件集合,静态概念实例:一个提供数据读写服务的进程集群模式下数据和和实例是一对多的关系conf文件mysql --helpDefault options are read from the following files in the given order:/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf架构connection poolsql & cacheenginefil

2020-10-27 21:54:39 106 1

原创 redis server事件处理

分类文件事件:server-clientserver-slave定时事件serverCron单线程所谓的redis单线程,其实就是指事件处理器的单线程。各类事件轮流处理,不会抢占

2020-10-24 13:06:42 86

原创 aof

作用追加服务器执行的命令格式文本:*2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n这个就是redis的文本协议,所以redis可以像读取客户端命令那样还原数据aof buffertypedef struct redisServer {sds aof_buf;}缓冲文件也是一个sds,很奇怪为啥不是循环缓冲区aof rewrite1, fork2,scan & write(集合命令会分多次写入,每次64(默认))3,子进程退出4,父进程记录aof重写

2020-10-24 12:58:44 80

原创 rdb

用途数据快照,可以定期保存使用save:不fork,阻塞服务器,期间不处理client请求,不推荐bgsave:子进程save,请求正常相关命令save, bgsave, bgrewriteaof,不能同时执行自动执行save duration updatessave 900 10000在900s以内有10000次更新就执行bgsavetypedef struct saveparan {time_t seconds;int changes;}状态保存typedef stru

2020-10-24 11:28:43 119

原创 服务器

database默认16个,是一个数组, int dbnumdb num是保存在redisClient里面的,每个建立好链接的redis client都会分配一个redisClient保存session信息redisDbtypedef struct redisDb {dict *dict;dict *expires;};每个redis数据库都是一个大dict,所以我们要少用单独的kv,多用hash, set等数据结构。统计数据keyspace_hitskeyspace_misses

2020-10-23 17:09:58 65

原创 2020-10-23 远程办公

来源https://coolshell.cn/articles/20765.html人员素质团队管理的头等大事是找人,没有之一。很多人都会跟我说,你的这种远程团队需要很好的人。是的,没错,人很关键。远程团队需要的人的一般需要有这些特质:能独挡一面的人。这样交给他的事能独立完成,没有路能自己找路,这样可以省很多管理成本。沟通能力很强的人。一方面,他们把模糊的事能变清楚,另一方面,他能有效地说服他人。不然就会非常扯皮和消耗时间。能自管理和自驱动。不能自管理和自驱的人,会增加大量的管理和教育成本。能

2020-10-23 11:56:13 676

原创 对象

定义在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等。Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。对象进一步封装来数据和算法,隐藏了细节,并且还增加了引用计数,ttl,访问时间等属性数据结构查看对象的属性:

2020-10-22 22:44:03 69

原创 ziplist

用途list, zset, hash条件items比较少小整数短字符串数据结构content的内容根据encoding来决定,c语言最大的好处就是可以直接强制内存转换来把同一块内存地址的值更改为不同的类型prev_entry_len用于反向遍历,也是可变长度的算法复杂度由于每个entry都是可变的,所以在删除和更改的时候有可能导致级联更新...

2020-10-22 22:10:41 138

原创 整数集合

使用场景当集合里面只包含整数并且集合数量较小的时候就用intset,为啥还必须说明集合较小的时候呢?因为如果集合较大,这时候再把key转换为string工作量就比较大了实现typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset;如果老老实实通过contents[

2020-10-22 21:10:17 1174

原创 2020-10-22 与程序员相关的CPU缓存知识

来源酷壳 https://coolshell.cn/articles/20793.html架构三级cache:cache linecache更新的block,最小单位,不是一个字节一个字节的更新的N way cachehash + 数组查找cache, N就是代表hash table的大小总结1,多访问本地变量2,全局共享和lock有性能影响...

2020-10-22 12:45:02 125

原创 2020-10-22 计时攻击 TIMING ATTACKS

来源https://coolshell.cn/articles/21003.htmlexampleboolean safeEqual(String a, String b) { if (a.length() != b.length()) { return false; } int equal = 0; for (int i = 0; i < a.length(); i++) { equal |= a.charAt(i) ^ b.charAt(i

2020-10-21 21:36:24 423

原创 如何编写易于测试的package

隔离db和rpc《架构整洁之道》里面说了,对于db, rpc等外部访问,必须进行隔离,业务代码不能与具体的db和rpc交互,应该把db和rpc的stub抽象成interface,这样便于替换db和rpc,使用interface也便于unit test设计模式即便是对外部的访问抽象成了interface,比如rpc client,但是对于业务来说使用起来也是不方便的,比如这个client提供了很多复杂的接口,而业务使用的只是其中的一个子集,并且业务可能还需要加入鉴权限流等逻辑,于是需要把外部的inter

2020-10-21 14:55:14 128 1

原创 跳跃表

特点1,每个节点多个指针2,有序链表3,基本平衡,平均logn使用只有zset使用了还有集群的内部实现

2020-10-20 20:17:07 65

原创 字典

使用1,redis的db space就是一个大map2, hash value定义typedef struct dictht {dictEntry **table;unsigned long size;unsigned sizeMask;//size-1, eg: 0xFFFFFFunsigned long used;} dictht;struct dictEntry {void *key;union {void *valueuint64_t u64;int64_t s64;

2020-10-20 19:49:00 65

原创 链表

定义typedef struct ListNode {struct ListNode *prev;struct ListNode *next;void *value;} ListNode;typedef struct List {ListNode *head;ListNode *tail;unsigned long len;void *(*dup)(void *prt);void *(*free)(void *prt);void *(*match)(void *prt, void

2020-10-20 17:34:36 50

原创 简单动态字符串SDS

用途1, redis的key(都是字符串)2,string value3,缓冲区(AOF/客户端输入)特点1,二进制安全2,较少alloc和copy次数3,常熟时间获取len,free4,兼容部分c string api5,避免缓冲区溢出struct sdshdr{int len; //总长int free; //剩余char buf[]; //data,也是以\0结尾的,但不计算在len里面}sds在字符串增长的时候会重新分配内存并copy,为了减少内存的allocate和

2020-10-19 23:18:39 57

原创 2020-10-19 - 程序员如何把控自己的职业

TODO

2020-10-19 10:31:30 153

原创 golang interface实现

https://research.swtch.com/interfaces其实看这一个图片就明白了,直接使用interface定义的函数效率是很高的,跟c++的虚函数表一样。itable的填充是在某个具体的值赋值给interface的时候发生的

2020-10-10 13:09:05 222 1

原创 限流算法

固定窗口eg:以timestamp为key,统计当前的请求数量,超过就拒绝滑动窗口其实就是把窗口分为多个子窗口,子窗口越多,限流越平滑leaky bucket请求放入队列,以固定速率读取请求并处理,不会有bursttoken bucket以固定速率往桶里面加入令牌,每个请求获得处理之前都需要获取令牌。有burst...

2020-10-09 17:05:02 75

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除