最近工作总结(28)

2019/06/02 Work

在一个SaaS或PaaS系统中,唯一属性的是company_id(company)

在一个SaaS或PaaS系统中,具有唯一性的应该是company_id,而不是身份证、手机号或邮箱。一个手机号可以属于不同的company。 所以,在设置表的主键时,往往和company_id一起设置为联合主键,这样才是合理的

数据库集群同步对业务的一个影响

一个写操作在node2节点, 写入操作之后会调用mq推送给另一个业务,该业务调接口请求得到这个数据,请求的是总库,结果没拿到该数据。是因为,node2节点的数据库同步到总库需要时间,且时间大于业务逻辑请求总库时获取数据的时间,数据还没同步到总库。

解决方案: 请求从库的接口、 使用sleep方法+补充措施

Redis Cluster or Redis Sentinel

当业务中使用的key的数量达到一定量级或一开始能够预测到会有大量的key存在redis中时,使用Redis Cluster的优势更为明显,会有更好的性能

老鼠与毒药问题

问题:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

解答:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了

其实这和信息论有相关的关系,1000转为二进制,大概需要10位。10只老鼠对应每一位,去确定每一位是0/1,最终能够确定出10位的每一位是0/1,从而得到该数值。

老鼠与毒药问题扩展与总结

如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

答案:7 只老鼠就足够了。事实上,7 只老鼠足以从 3^7 = 2187 个瓶子中找出毒药来。首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ⋯⋯也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。

类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来

config的使用失败 原因是编译执行到这里的时候,config.Common还没有初始化好

var name = config.Common.GetString("name")

上述代码执行报错:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x1612327]

原因是编译执行到这里的时候,config.Common还没有初始化好,所以报错了

###缓存与缓存效果的预生成文件的变更问题

缓存与缓存效果的预生成文件相关的信息变更了,缓存与缓存效果的预生成文件也需要重新生成,否则就会出现新老数据不一致的情况

UFile 的CDN地址的host配置只能用于上传和下载,无法用于删除和更改

Search

    Table of Contents