访问计数系统设计

https://zq99299.github.io/note-architect/hc/07/01.html#%E6%94%AF%E6%92%91%E9%AB%98%E5%B9%B6%E5%8F%91%E7%9A%84%E8%AE%A1%E6%95%B0%E7%B3%BB%E7%BB%9F%E8%A6%81%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1



你可能已经想到用消息队列来削峰填谷了,也就是说,我们在转发微博的时候向消息队列写入一条消息,然后在消息处理程序中给这条微博的转发计数加 1。 这里需要注意的一点, 我们可以通过批量处理消息的方式进一步减小 Redis 的写压力

https://blog.51cto.com/u_15230485/2820975



Redis是使用内存来存储信息,相比于使用磁盘存储数据的MySQL来说,存储的成本不可同日而语,比如一台服务器磁盘可以挂载到2个T,但是内存可能只有128G,这样磁盘的存储空间就是内存的16倍。而Redis基于通用性的考虑,对于内存的使用比较粗放,存在大量的指针以及额外数据结构的开销,如果要存储一个KV类型的计数信息,Key是8字节Long类型的weibo_id,Value是4字节int类型的转发数,存储在Redis中之后会占用超过70个字节的空间,空间的浪费是巨大的。



对原生Redis做一些改造,采用新的数据结构和数据类型来存储计数数据。



一是原生的Redis在存储Key时是按照字符串类型来存储的,比如一个8字节的Long类型的数据,需要8(sdshdr数据结构长度)+ 19(8字节数字的长度)+1(’\0’)=28个字节,如果我们使用Long类型来存储就只需要8个字节,会节省20个字节的空间;
二是去除了原生Redis中多余的指针,如果要存储一个KV信息就只需要8(weibo_id)+4(转发数)=12个字节,相比之前有很大的改进。



https://www.jianshu.com/p/2af857d870fb



https://zhuanlan.zhihu.com/p/348660130



https://www.w3cschool.cn/architectroad/architectroad-counting-system.html



https://juejin.cn/post/6844903760221700104



https://blog.csdn.net/H900302/article/details/110198345



https://github.com/confluentinc/confluent-kafka-go/issues/380


Category architect