- 博客(106)
- 收藏
- 关注
原创 redis内存淘汰策略-------Reservoir Sampling(水库采样)
水库采样法(Reservoir Sampling)是一种在处理大规模数据流或未知大小的数据集合时,用于从中随机抽取固定数量样本的算法。它特别适用于数据流场景,因为在数据流开始之前并不知道其总量。核心思想水库采样的核心思想是在处理一个可能无限大的数据流时,从中抽取固定数量的样本,使得每个数据元素被选中的概率是相同的。操作步骤初始化:创建一个大小为k的“水库”数组,并将前k个元素直接存入水库。替换阶段对于每一个新的元素(假设这是第n个元素),生成一个随机数r,该随机数的范围是[0, n-1]。
2024-08-11 17:40:33
800
原创 在Zotero中使用Deepl翻译
Zotero是一款非常实用的文献管理软件,可以快速帮助我们下载、分类和标注文献。由于专业需要,很多使用者需要阅读外文文献,Zotero并没有内置翻译功能,但是好在其有丰富的插件进行选择,本文将详细介绍如何在Zotero中使用Deepl翻译。
2024-07-01 15:35:29
1199
1
原创 go|sync系列:WaitGroup、Once、Cond
对于Add操作原子操作将state高32bits计数器的值增加delta获取state中计数器的值为v,阻塞等待的协程数量为w如果v==delta则表明是第一次执行add操作,需要同步给wait如果 v<0,计数器的值小于0,产生panic如果v==delta但是w!=0说明Add操作和wait操作并发执行产生panicv==0 && w>0说明计数器变为0,并且有被wait操作阻塞的协程,此时需要将state的值变为0,并以此释放信号量唤醒阻塞等待的waiter。!
2024-03-21 17:41:33
1188
2
原创 网络层:地址解析协议ARP、网际控制报文协议ICMP、虚拟专用网络VPN、网络地址转换NAT
ARP把已经得到地址映射保存在ARP高速缓存中,这样就使得主机下次再和具有相同的目的地址的主机通信时,可以直接从高速缓存中找到所需要的硬件地址而不必使用广播的方式发送ARP请求分组。有了ARP高速缓存之后,主机请求另一台主机的时候,会先从ARP高速缓存中寻找目的主机的MAC地址,不存在或者过期的话,才会发送ARP请求分组。现在有这样一种情况,在专用网内部的一些主机本来已经分配到了本地IP地址(仅在本专用网内使用的专用地址),但是现在想和互联网上的主机通信(并不需要加密),应当采取什么措施呢?
2024-03-13 09:35:37
1061
原创 go|一道算法题引发的思考|slice底层剖析
go中的copy函数可以做到这个,接下来看看切片复制的原理。小对象(<=32KB)可以直接分配在P拥有的cache的空闲链表中[这里的P是指GMP中的P,cache和go的内存管理有关,指的是mcache],大对象(>32KB)直接在堆上分配。切片截取会复制slice struct中的三个字段:array[unsafe.Pointer]、len[int]、cap[int],所以由一个切片截取出来的切片会指向同一个底层数组。但是需要注意的是,切片之间共享的是底层的数组,len和cap变量的值是没有共享的。
2024-03-08 15:39:07
1027
原创 散列表、散列函数、散列冲突、哈希算法
当装载因子达到阈值之后,只申请新空间不进行数据迁移的操作,当有新的数据要插入的时候,将新数据插入到新的散列表中,并且从老的散列表中拿出一部分数据放入到新的散列表中。比如,我们可以从图片的二进制码串开头取100个字节,从中间取100个字节,从最后再取100个字节,然后将这300个字节放到一块,通过哈希算法(比如MD5),得到一个哈希字符串,用它作为图片的唯一标识。举一个极端的例子,如果散列表当前大小为1GB,想要扩容为原来的两倍大小,那就需要对1GB的数据重新计算哈希值,并且从原来的散列表迁移到新的散列表。
2024-03-08 09:25:21
706
原创 灵神笔记(1)----动态规划篇
本篇文章主要是观看"灵茶山艾府"动态规划篇视频后,做出的笔记。视频链接如下[动态规划入门:从记忆化搜索到递推][0-1背包,完全背包][最长公共子序列,编辑距离]
2024-03-06 14:36:31
955
原创 redis7.2.2|SkipList源码解析,源码面前了无秘密
本篇文章基于redis7.22源码位置:redis-7.2.2\src\t_zset.c有关skiplist的介绍可以参考:skiplist文章目录ZsetzsetData_StructzskiplistFunctionzslCreateNodezslCreatezslFreeNodezslFreezslRandomLevelzslInsertzslDeleteNodezslDeletezslGetRankzslGetElementByRankzslUpdateScorezsetLengthzsetS
2024-03-05 12:42:31
982
原创 redis7.2.2|Dict
/根据ht_size_exp计算dictht_size//根据ht_size_exp计算dictht_size # define DICTHT_SIZE(exp)((exp) == - 1?0 :(unsigned long) 1 <<(exp)) //获取sizemask # define DICTHT_SIZE_MASK(exp)((exp) == - 1?//根据ht_size_exp计算dictht_size # define DICTHT_SIZE(exp)((exp) == - 1?
2024-03-01 15:25:05
1087
原创 从[redis:LinkedList]中学习链表
来看看都定义了哪些宏方法。//获取长度,由此可以看出对于OBJ_ENCODING_LINKEDLIST 编码方式的list来说,获取长度的时间复杂度为O(1)
2024-02-01 21:30:29
721
原创 Redis过期删除策略和内存淘汰策略
但是由于8个bit能表示的最大整数值有限为255,存储访问频次肯定不够用,所以这8个bit存储的是频次的对数值,并且这个值会随着时间衰减。由于redis的核心处理逻辑是单线程的,如果同一时间有过多的key同时过期就会导致主线程处理过期的key花费太多的时间,从而导致主线程阻塞可能无法执行线上的读写指令。惰性删除的策略是,不会主动删除过期的key,只有当客户端访问该key的时候,redis才从过期字典中获取key的过期时间进行判断,如果过期立即删除。10非常接近真实的LRU,但需要更多的CPU。
2024-01-22 19:53:43
1215
原创 开源节流--ziplist、listpack
ziplist是一种节省内存的数据结构,是旧版本中"list"、“hash”、“zset"的底层编码之一。由于ziplist存在一些问题,于是在新版本中用listpack代替ziplist。更具体地数据类型和底层编码的对应关系,可以参考文章"sds源码剖析先来分析一下"ziplist"和"listpack"的结构以及一些基本的操作,然后再分析"list"、“hash”、“set”、"zset"如何利用它节省内存的。//返回ziplist占用的总字节数。
2024-01-21 09:00:00
1093
原创 栈、队列专题
上一篇文章提到过,栈和队列都是操作受限的线性表。栈只允许在线性表的一端进行删除和增加操作,另外一端是封闭的状态。就像是一摞叠在一起的盘子,放的时候只能从下往上一个一个放;取的时候,从上往下一个一个取;既不能从中间放也不能从中间抽取;像这种"先进后出,后进先出"的结构就是栈。队列与栈一样都是操作受到限制的线性表,队列是一种"先进先出,后进后出"的结构,就像是排队买糕点,先来的人先买到后来的人后买到。入队的时候从队尾进入,出队的时候从队头出去。下图把"队列和栈"放在一起对比。
2024-01-19 22:28:48
885
原创 redis | set | intset竟然是按序存储整数值的
redis有一个数据类型"set",它的特性是"无序,不重复"。遇到一些需要去重的场景可以使用redis的"set"进行存储。它的底层实现有两种,一个是"intset整数集合"是一种比较节省内存的结构,另一个是"ht哈希表"。本篇文章先介绍"intset","ht"在之后的文章介绍。在读源码的过程中,发现在redis7.2.2版本中set的底层多了一种实现"listpack",我又去看了之前的版本发现之前的版本set的实现只有两种"intset"和"ht"。对于上一篇文章的出现的错误已改正。
2024-01-15 10:00:00
799
原创 数组、链表专题
文章目录线性表数组为什么数组从0开始编号而不是从1开始数组VS容器算法题二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵链表链表结构单链表循环链表双向链表双向循环链表链表代码编写的小技巧理解指针或引用的含义警惕指针丢失和内存泄露利用哨兵简化实现难度重点留意边界条件处理算法题两个有序链表的合并移除链表元素反转链表两两交换链表中的结点删除链表的倒数第N个结点回文链表环形链表||数组VS链表Go--fmt.Scan VS fmt.Scanf线性表定义如下:线性表是指零个或者多个数据元素的有限序列;
2024-01-12 14:39:08
1037
原创 从源码中分析SDS相较于C字符串的优势
从本篇文章开始会持续更新有关"redis数据结构源码"的分析。[分析的源码是redis7.2.2版本的,有时候会结合之前的版本]。由于能力有限,有些地方可能有些错误,还望指正。编码为embstr的字符串是无法被修改的字符串对于编码为embstr的字符串使用的sds结构为"sdshdr8"新创建的字符串的cap和len保持一致,并且字符的结尾含有’\0’结束符[猜想这里应该是为了兼容c中字符数组并且必要时候能够使用c的库函数]
2024-01-09 20:33:01
1077
原创 解决“invalid UTF-8 encoding”
出现上述问题的原因在于"记事本的默认编码是ANSI,而go的默尔编码是UTF-8",所以将其改变为"UTF-8"编码即可。问题“invalid UTF-8 encoding”,无效的utf8编码。有可能是文件的编码不是“utf8”为了验证猜想,看一下“xxx.go”文件的编码方式。之后可以看到文件的编码方式为"UTF-8"go run xxx.go出现以下的问题。再次运行该文件,运行成功。
2024-01-07 17:50:05
1273
原创 CSMA/CD协议、二进制指数退避、自旋锁SpinLock
电路接通了"表示链路两端的节点交换机已经开机了,物理连接已经能够传送比特流了,但是,数据传输并不可靠,在物理连接基础上,再建立数据链路连接,才是"数据链路接通了”,此后,由于数据链路连接具有检测,确认和重传功能,才使不太可靠的物理链路变成可靠的数据链路,进行可靠的数据传输;因此,当好几个适配器执行指数退避算法时,很可能有某一个适配器发送的新帧能够碰巧立即成功地插入信道中,得到了发送权,而已经推迟好几次发送的站,很可能不巧,还要继续执行退避算法,继续等待。A重传的数据会不会和B重传的数据再次发生碰撞?
2023-12-25 16:42:41
1257
原创 redis命令
NoSQL(not only sql)泛指非关系型数据库,不依赖业务逻辑方式存储,而以简单的key-value模式存储,大大增加了数据库的扩展能力。不遵循sql标准不支持ACID远超于sql的性能使用场景对数据高并发的读写海量数据的读写对数据的高扩展性不适用的场景需要事务支持基于sql化的结构查询,处理复杂的关系一些nosql数据库MemcacheRedisMongoDB列式数据库行式数据库。
2023-12-22 08:59:22
877
原创 限流方式、算法、策略、位置
限流虽然会导致部分用户的部分请求丢失,但是在更大程度上保证了系统的安全性和稳定性。以上四种算法针对的是单体框架的限流策略。对于分布式,微服务系统来说,可以借用一些中间件或者网关配置相应的限流策略。
2023-12-21 09:17:39
971
原创 计网期末考试复习
(1)认证:当移动站点与AP[access point无线访问接入点]建立了关联后,AP会向移动站点发送一个质询帧,看它是否知道以前分配给它的密钥;移动站点用自己知道的密钥加密质询帧,然后发送给AP,AP检验之后,该移动站点就会被正式加入到单元中。(2)解除认证,一个以前经过认证的站想要离开网络时,需要解除认证。(3)保密。处理加密和解密,加密算法为RC4(4)数据传递。提供了一种数据传送和接收方法。
2023-12-17 17:34:18
109
原创 每日一题2023.12.14|LeetCode3.无重复字符的最长子串
如果右边界对应的字符出现在集合中,就移动左边界,如果左边界对应的字符与右边界对应的字符不相等,就将左边界对应的字符从集合中删除,如果左边界对应的字符与右边界对应的字符相等就只移动左边界不需删除[因为右边界对应的字符与左边界对应的字符一致但是并没有将右边界对应的字符加入集合]窗口内的字符都是连续的,只需计算窗口内满足要求的最长的子串。如果该字符对应的次数大于1,就移动左边界,将左边界对应的字符的个数减1,直到右边界对应的字符个数为1。或者集合存储不重复的字符。移动窗口的右边界,将右边界对应的字符加入哈希表,
2023-12-14 21:16:46
82
原创 每日一题2023.11.3|41.缺失的第一个正数
i+1"也就是nums[i]这里存储的值应该是"i+1"不是的话就置换,但是发生了时间超限,顺序遍历数组中的元素,将num映射在下标为num-1的位置处,遍历完之后,哪个位置没有打上标记,那个位置加1就是缺失的第一个正数。=nums[nums[i]-1]"下标为i位置的元素与与其应该出现的位置的元素不一致时才交换。缺失的第一个正数一定是位于范围[1,n+1]内,当数组中的数都为正数并且都按照顺序出现,那么缺失的第一个正数是n+1;如果数组中包含x属于[1,N],将其置换到位置x-1。
2023-11-03 18:31:20
137
原创 GIN框架路由的实现原理
sync.Pool是sync包下的一个内存池组件用来实现对象的复用,避免重复创建相同的对象,造成频繁的内存分配和gc,以达到提升程序性能的目的,虽然池子中的对象可以被复用,基本思想就是将字符串中的每个字符作为树的一个节点,从根节点开始,每个节点代表代表字符串中的一个前缀。在Trie树,每个节点都包含一个指向子节点的指针数组,数组的大小等于字符集的大小。从两图可以看出,Radix Trie对Trie进行了压缩:遍历Trie发现某个节点只有一个子节点,就与子节点进行合并,减少指针数组的占用,优化空间。
2023-10-10 12:04:47
290
2
原创 每日一题2023.9.25|LeetCode1367.二叉树中的链表
采用前序遍历的方式从根节点开始遍历二叉树,并在遍历的过程中比较与链表节点的值是否相等,如果当前链表节点的值和树节点的值相等,就在树节点的左右子树寻找下一个链表节点;如果不相等就在树节点的左右子树寻找当前链表节点的值;后来我再次回想这版错误答案的时候,我发现错误之处并非像上述所说的那样,链表的结构不会因为传递的参数而被改变,就像遍历二叉树的时候,树的结构不会因为传递的参数而发生变化。后来我发现,我传递的参数是以指针的形式传递的,如果当前的链表节点的值与树节点的值相等,会做这么一个操作。
2023-09-25 14:14:54
211
原创 LRU/LFU
LRU算法更加关注数据的访问时间,而LFU算法更加关注数据的访问频率。因此,在实际应用中,需要根据具体的业务场景来选择合适的缓存淘汰算法。
2023-09-06 17:32:26
135
原创 hiredis的安装与使用
Hiredis 是一个用于 C 语言的轻量级、高性能的 Redis 客户端库。它提供了一组简单易用的 API,用于与 Redis 数据库进行交互。Hiredis 支持 Redis 的所有主要功能,包括字符串、哈希、列表、集合、有序集合等数据结构的读写操作,以及发布订阅、事务和管道等高级功能。Hiredis 设计简洁,代码轻量,且具有很高的性能。它被广泛用于开发需要与 Redis 数据库进行交互的 C 语言项目,可以帮助开发者轻松快捷地利用 Redis 的强大功能。
2023-08-27 20:33:31
696
原创 MySQL|查看事务加锁情况
该表存储了INNODB存储引擎当前正在执行的事务信息,包括事务id(如果没有为该事务分配唯一的事务id,则会输出该事务对应的内存结构的指针)、事务状态(比如事务是正在运行还是等待获取某个锁、事务正在执行的语句、事务是何时开启的)等等。在information_schema数据库中,有几个与事务和锁紧密相关的表。(如果在库里面创建表时不指定字符集,这个表的字符集默认是库的字符集)ps:修改库字符集后库里面的表的字符集不会随着库的字符集更改而更改。表明每个阻塞的事务因为获取不到哪个事务持有的锁而阻塞。
2023-08-06 09:47:54
3046
原创 每日一题2023.7.22|链表的基本操作
输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表是1、2、3那么输入的顺序是3、2、1。第二行有一个整数m,代表下面还有m行,每行有一个字符串,字符串是“get”、“insert”、“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;
2023-07-22 21:53:56
302
原创 每日一题2023.7.21|删除重复元素
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开。针对每组测试数据,输出包括两行,分别是删除前和删除后的链表元素,用空格隔开;如果链表为空,则只输出一行,list is empty。根据一个递增的整数序列构造有序单链表,删除其中的重复元素;
2023-07-21 20:28:28
224
原创 每日一题2023.7.20|单链表反转
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开。根据一个整数序列构造一个单链表,然后将其反转。列如:原单链表为2 3 4 5,反转之后为:5 4 3 2。针对每组测试数据,输出包括两行,分别是反转前和反转后的链表元素,用空格隔开。
2023-07-20 20:21:48
46
原创 每日一题2023.7.17|根据层序遍历构建二叉树
如果所给层序遍历数组非空,先构建出root结点并加入辅助队列qu,之后当qu非空时,每次从qu中取出一个结点node,从头开始取数组中的元素作为node的左右孩子结点。并将非空的左右孩子结点加入到qu中。持续上述操作直到qu为空。重新定义“print_treenode”让其不打印没有必要的NULL结点。
2023-07-17 07:01:22
186
原创 每日一题2023.7.16|49.字母异位词
将strs中的每个字符串的每个字符的数值之和作为哈希表的键,提交代码发现之后运行错误。时间复杂度为O(nklogk)其中n是strs中字符串的数量,k是strs中字符串的最大长度。由于互为字母异位词的两个字符串包含相同的字母,因此两个字符串中相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示作为哈希表的键;由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定相同,故可以将排序之后的字符串作为哈希表的键;空间复杂度为O(n*k)
2023-07-16 10:30:02
356
原创 SkipList
跳表是实现二分查找的有序链表每个元素插入时随机生成它的level最低层包含所有元素如果一个元素出现在level(x)那么它一定出现在x以下的level中每个索引节点包含两个指针一个向下一个向右(但是各种跳表源码包括redis的zset都没有向下的指针)跳表查询删除插入的时间复杂度都是O(logn)与平衡二叉树接近。
2023-07-14 23:27:51
323
原创 MySQL常用命令1
概述:指从多张表中查询数据笛卡尔积:笛卡尔乘积是指在数学中,两个集合A和B的所有组合情况(在多表查询时需要消除无效的笛卡尔积)。-- 消除无效的笛卡尔积多表查询分类事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失效。
2023-07-13 09:53:43
231
原创 如何在Ubuntu18.04中下载MySQL5.7
如果有则清理干净在安装,输入找到文件夹目录,再把它删除检查系统是否自带mariadb,输入如下检查如果有将其卸载,因为会和mysql引起冲突。
2023-07-11 22:31:30
1328
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人