喜欢用随机数,特别是之前按点给分的题目不知道怎么做的时候,随机返回个数,有一种听天由命的感觉。这里想起几个随机数的妙用,记录一下,以后有的再补充。

随机数最常用的的用途就是密码学方面了,例如生成密钥、生成盐等。另一个就是业务需求,比如抽奖。当然这里不谈这些常用情况,看下比较巧妙的场景。

raft里面提升为候选者的超时时间

复习一下。raft一致性算法里面,follower每隔一段时间会接收leader的心跳,如果一定时间接收不到,那么就会变成候选者candidate。

如果有多个follower的同时达到超时时间变成candidate的话呢,就会很存在candidate间的竞争。为了减小同时成为candidate的概率呢,raft算法就让这个成为candidate的超时时间设置为一个随机时间,这样大大减少了candidate竞争的可能,提高选主效率。

缓存击穿与缓存雪崩

缓存击穿既缓存中的数据在刚过期的时候,同时有很多并发请求查询不到缓存后,去数据库查询,骤然提高了数据库的压力。解决缓存击穿可以有这几种方式:

  1. 缓存设置为不过期。
    这种方式非常粗暴简单有效,但是要看业务需求能不能设置不过期。

  2. 多个请求间设置互斥锁,只有一个请求能去DB里面查询数据。查询完了再同步给其他请求。
    缺点也显而易见,开发非常复杂。特别是分布式应用的话,引入了更复杂的逻辑,甚至要依赖分布式锁,风险更高了。

  3. 定时更新缓存
    这个方案可行,但也是要维护额外的一套逻辑或者服务。

缓存雪崩,是指缓存中在同一时间大量的缓存过期,造成很多数据都去DB查询。原因往往是某些初始化操作或者其他批量写入缓存的操作,在同一时间写入的内存。解决方式之一当然也可以设置为不过期。

缓存的这两个问题,也可以简单的用随机数解决。对于缓存击穿,我们可以在获取缓存后,判断过期时间,小于某个范围内的随机数,那么就去DB获取最新数据并刷新缓存。对于缓存雪崩,则可以在源头设置缓存的时候,设置某个范围内随机的过期时间。


这两个随机数的用途,其实本质都是一样的。当存在竞争态的时候,通过随机去减小竞争态的概率。以后遇到类似问题的时候,也许也可以尝试用随机数去简单解决~