发布时间:2025-03-08 16:27:58 点击量:
HASH GAME - Online Skill Game GET 300
1)典型的哈希函数都有无限的输入值域 2)当哈希函数输入一致时,输出必相同 3)当哈希函数传入不同的输入值时,返回值可能一样,也可能不一样,由于输 入域远大于值域 4)(重要)很多的不同输入所得的输出值会均匀的分布在 S 上(但不是绝对均 匀) 最后一个性质对于一个优秀的哈希函数是非常重要的,并且这种均匀与数据的 输入规律无关。比如“aa1”、aa2经过 hash 后可能结果会相差很多。将输出 值对 m 取余(%m),这就是一个哈希函数,就会将不定长输入映射到 0~m-1 空 间中,并且在这个空间也保持均匀分布!哈希表就是这么做的。
请分析这种缓存策略可能带来的问题,并提出改进的方案。 一致性哈希是一种服务器的设计,是一种数据缓存的设计方案。 需求: 有多台后端服务器,希望进行负载均衡。举个例子:现在有 3 台服务 器,那么读取图片的请求会均衡的负载在三台服务器上。 经典的服务器设计的抗压结构: 一种做法是对请求进行哈希计算,计算结果对服务器数量去模(前端抗压结构 完成,ngnix 或 Tomcat),例如 3 台服务器,取模结果为 0,1,2。
尽管需要扩容,但是扩容并不是经常发生的。扩容为 N,其复杂度也就是 logN,因为每次都是成倍翻。另外,除了在线扩容,还可以离线扩容。 在线扩容:如果有用户需要 put 或 get 并且系统正在扩容,需要先等着,等扩 容完成之后返回结果。 离线扩容:开辟一个新的区域,将老的哈希挪到新的哈希表上去重新计算一 遍,如果在扩容的过程中,有用户需要对哈希表做操作,在老的哈希表上做操 作,如果有 put 操作,同时更新老的哈希表和新的哈希表,当扩容完成后,将 流量全部切到新的哈希表上去。