一篇非常精彩的解释CAP理论的文章,翻译水平有限,不准确之处请参考原文,还请见谅。
Chapter 1: “Remembrance Inc” Your new venture :
Last night when your spouse appreciated you on remembering her birthday and bringing her a gift, a strange Idea strikes you. People are so bad in remembering things. And you’re sooo good at it. So why not start a venture that will put your talent to use? The more you think about it, the more you like it. In fact you even come up with a news paper ad which explains your idea
第一章:记忆公司
昨晚当你的妻子感激你记得她生日还给她买了礼物时, ...
终于熬出月子,也有精力分享一下怀男孩和女孩的症状。先说一下怀老大时候的症状:1.喜欢吃素,口味比较清淡。2.肚子尖,往腰两边扩散。后期右边大,左边小,妊娠线偏左。3.喜欢酸辣口。4.皮肤变黑长斑,汗毛变长,脸上,额头上长痘痘。5.孕吐不严重,且规律。每晚一次。6.胎动左右都有。7.孕40周➕1出生。8.整个孕期增重38斤,无水肿。胎儿5斤8两。由于怀老大是4年前的事情了,想起来的都是比较明显的症状。再说一下,怀老二时候的孕期反应。1.喜欢吃肉。(在怀之前,一直吃素)2.肚子往前长,从后面看不出怀孕。后期左边大,右边小,妊娠线偏右。动作比较灵活。3.前期喜欢吃辣,越辣越好的那种,后期喜欢吃甜。整个孕期没有忌口,麻辣香锅,火锅,奶茶,冰淇淋好吃的都没拉下。4.孕中期皮肤变白变好看。(连我同事都惊讶,怀个孕还能变美😂。可能和吃燕窝水果比较多有关😏。)后期变黑,直到出了月子肚子上的皮肤还黑黑的一层,不知道什么时候完全退下去。5.孕吐和怀老大时一样,但是每次刷完牙都恶心,口水多,必须吃口香糖。6.胎动比较少,但幅度比较大。估计是羊水太多,好几次差点没因羊水过多被医生留院观察。整个孕期喝水比较 ...
redis
未读redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。Redis为我们提供两种持久化的机制,分别是快照RDB和AOF。注意:在redis4.0时候新增了混合持久化。将rbd的内容和增量和aof放在一起。这里的aof是rbd开始到结束之间增量的日志。
快照(rbd):执行快照操作Redis必须进行io读写操作。文件 IO 操作会严重拖垮服务器请求的性能,而且如果在存的过程中突然修改某个值或者删除,就会造成信息的不准确。Redis使用了COW机制(写时复制)来实现持久化。
Cow实现原理:fork()之后,kernel把父进程中所有的内存页的权限都设为read-only,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernel的一个中断例程。中断例程中,kernel就会把触发的异常的页复制一份,于是父子进程各自持有独立的一份。
Cow好处:1.COW技术可减少分配和复制大量资源时带来的瞬间延时。2.CO ...
BenchMark介绍最近大佬叫我做下Benchmark,之前一直没接触过,顺便学习一波。
BenchMark 又叫做基准测试,主要用来测试一些方法的性能,可以根据不同的参数以不同的单位进行计算(例如可以使用吞吐量为单位,也可以使用平均时间作为单位,在 BenchmarkMode 里面进行调整)。
开始前的步骤项目使用的是 Maven,因此只要对 pom.xml 添加依赖即可。
123456789101112<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.19</version></dependency><dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</ ...
前缀和一、什么是前缀和?一维前缀和:
有一个一维数组 和该数组的一维前缀和数组 ,则 和 满足以下关系:
二维前缀和:
有一个二维数组 和该数组的二维前缀和数组 (其同样是个二维数组),则 和 满足以下关系:
看公式可能有点懵,看底下的图更好理解。
右侧标注橙色的二维前缀和元素,其值是左侧的原二维数组中标注橙色的所有元素的和。
二、如何得到前缀和?一维前缀和:
很容易就可以发现:
代码实现如下:
123456for(int i=0;i<n;i++){ if(i==0) y[i]=x[i]; else y[i]=y[i-1]+x[i];}
二维前缀和:
二维前缀和实际上就是一个矩阵内值的和,而矩阵又可以由两个行数或列数少一的子矩阵组合后,删去重合部分再加上右下角的值来构成,也就是以下式子:
代码实现如下:
123456789for(int y=0;y<n;y++)//n行 for(int x=0;x<m;x++)//m列 { if(x==0&&y==0) b[ ...
lettuce-core版本: 5.1.7.RELEASE
在上一篇介绍了Lettuce是如何基于Netty与Redis建立连接的,其中提到了一个很重要的CommandHandler类,这一期会介绍CommandHandler是如何在发送Command到Lettuce中发挥作用的,以及Lettuce是如何实现多线程共享同一个物理连接的。还是先看一下我们的示例代码,这一篇主要是跟进去sync.get方法看看Lettuc是如何发送get命令到Redis以及是如何读取Redis的命令的。
1234567891011121314151617181920212223242526272829/** * @author xiaobing * @date 2019/12/20 */public class LettuceSimpleUse { private void testLettuce() throws ExecutionException, InterruptedException { //构建RedisClient对象,RedisClient包含了Re ...
首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配.
这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素.
基本思想
长度为M的字符串对应着一个R进制的M位数, 为了用一张大小为Q的散列表来保存这种类型的键, 需要一个能够将R进制的M位数转化为一个0到Q-1之间的int值散列函数, 这里可以用除留取余法.
举个例子, 需要在文本 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 查找模式 2 6 5 3 5, 这里R=10, 取Q=997, 则散列值为
2 6 5 3 6 % 997 = 613
然后计算文本中所有长度为5的子字符串并寻找匹配
3 1 4 1 5 % 997 = 508
1 4 1 5 9 % 997 = 201
……
2 6 5 3 6 % 997 = 613 (匹配)
计算散列函数
对于5位的数值, 只需要使用int就可以完成所有需要的计算, 但是当模式长度太大时, ...
redis
未读源码版本:redis-4.0.1源码位置:
dict.h:dictEntry、dictht、dict等数据结构定义。
dict.c:创建、插入、查找等功能实现。
一、dict 简介dict (dictionary 字典),通常的存储结构是Key-Value形式的,通过Hash函数对key求Hash值来确定Value的位置,因此也叫Hash表,是一种用来解决算法中查找问题的数据结构,默认的算法复杂度接近O(1),Redis本身也叫REmote DIctionary Server (远程字典服务器),其实也就是一个大字典,它的key通常来说是String类型的,但是Value可以是String、Set、ZSet、Hash、List等不同的类型,下面我们看下dict的数据结构定义。
二、数据结构定义与dict相关的关键数据结构有三个,分别是:
dictEntry 表示一个Key-Value节点。
dictht表示一个Hash表。
dict是Redis中的字典结构,包含两个dictht。
dictEntry结构的代码如下:
123456789101112typedef struct d ...
redis
未读源码版本:redis-4.0.1源码位置:https://github.com/antirez/sds
一、SDS简介sds (Simple Dynamic String),Simple的意思是简单,Dynamic即动态,意味着其具有动态增加空间的能力,扩容不需要使用者关心。String是字符串的意思。说白了就是用C语言自己封装了一个字符串类型,这个项目由Redis作者antirez创建,作为Redis中基本的数据结构之一,现在也被独立出来成为了一个单独的项目,项目地址位于这里。
sds 有两个版本,在Redis 3.2之前使用的是第一个版本,其数据结构如下所示:
1234567typedef char *sds; //注意,sds其实不是一个结构体类型,而是被typedef的char*,好处见下文struct sdshdr { unsigned int len; //buf中已经使用的长度 unsigned int free; //buf中未使用的长度 char buf[]; //柔性数组buf};
但是在Red ...
转的一个超级有意思,好懂的并查集解释, 膜拜大神~~
找了好久都没找到原帖大多都是转的 , 后来在某评论下看到原帖链接啦 点这里哦
故事读完,并查集就会了~~~~~
江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的帮派,通过两两之间的朋友关系串联起来。而不在同一个帮派的人,无论如何都无法通过朋友关系连起来,于是就可以放心往死了打。但是两个原本互不相识的人,如何判断是否属于一个朋友圈呢?
我们可以在每个朋友圈内推举出一个比较有名望的人,作为该圈子的代表人物。这样,每个圈子就可以这样命名“中国同胞队”美国同胞队”……两人只要互相对一下自己的队长是不是同一个人,就可以确定敌友关系了。
但是还有问题啊,大侠们只知道自己直接的朋友是谁,很多人压根就不认识队长!要判断自己的队长是谁,只能漫无目的的通过朋友的朋友关系问下去: ...

