Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster 集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级数据计算Redis系列9:Geo 类型赋能亿级地图位置计算
1 前言我们来回顾下在这个系列的第一篇 深刻理解高性能Redis的本质 中介绍过Redis的几种基本数据结构,它服务于各种不同的业务场景而设计的,比如:
- 动态字符串(REDIS_STRING):整数(REDIS_ENCODING_INT)、字符串(REDIS_ENCODING_RAW)
- 双端列表(REDIS_ENCODING_LINKEDLIST)
- 压缩列表(REDIS_ENCODING_ZIPLIST)
- 跳跃表(REDIS_ENCODING_SKIPLIST)
- 哈希表(REDIS_HASH)
- 整数集合(REDIS_ENCODING_INTSET)
- 位图(BitMap)计算:可以应用于任何大数据场景下的二值计算,比如 是否登录、是否在线、是否签到、用户性别状态、IP黑名单、是否VIP用户统计 等等场景 。
- Geo类型:记录地理空间信息,如 地理坐标存储、位置计算、距离计算等能力,普遍运用在地图业务中的各种场景 。
2 关于HyperLogLogHyperLogLog 主要用于Redis 的基数统计,它的数据结构专门设计用来做数据合并和计算,并能节省大量的空间 。基数计数( cardinality counting) 通常用来统计一个集合中不重复的元素个数 , 例如统计某个网站的UV、PV或者网站搜索的的关键词数量 。在各种应用领域基数统计被广泛应用,如数据分析、网络监控指标、存储性能优化等 。简单来说,基数计数就是记录集合中所有不重复的元素Su ,当新增元素Xa时,判断Su中是否包含,不包含则将其加入Su,包含则不加入,计数值就是Su 的元素数量总和 。当然这种做法也存在两个问题:
- 当统计的数据量变大时,相应的存储内存也会线性增长
- 当集合Su 变大,判断其是否包含新加入元素的成本变大
- 统计单日一个页面的访问量(PV),单次访问就算一次 。
- 统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次 。
- 多个key的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV 。
10,000,000 * 15 /(1024 * 1024)= 143.05 M
如果使用 HyperLogLog,那么在 Redis 中每个键占用的内容都是 12K,理论上能够存储 264 个值,即18446744073709551616,这个数是巨量,Java中long类型也只能计算到 262。无论存储何值,它一个基于基数估算的算法HyperLogLog Counting(简称HLLC),使用少量固定的内存去存储并识别集合中的唯一元素 。HLLC采用了分桶平均的思想来消减误差,在Redis中,有16384个桶。而HyperLogLog的标准偏差公式是1.04 / sqrt(m),m 为桶的个数 。所以
经验总结扩展阅读
- 1 Dive into TensorFlow系列-静态图运行原理
- 【k8s连载系列】2. k8s整体架构
- 深唇口红排行榜10强 显色度超好,深唇和黄皮必入系列
- 33 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取WebSocket数据包
- 华为mate40e参数_华为mate40e参数配置
- 从0到1搭建redis6.0.7续更~
- zk系列三:zookeeper实战之分布式锁实现
- 英雄联盟LOL钢铁瓦尔基里系列皮肤原画预览
- 从0到1搭建redis6.0.7
- Redisson源码解读-公平锁