第十八天,7月12日,八股
1、redis中的特殊数据结构Bitmaps
类似一个大数组只存0或1,Bitmap 使用比特位(bit)来表示元素的状态,每个比特位只能是 0 或 1,因此非常适合于统计二值状态,如在线状态(0离线,1在线)、签到记录等,Bitmap 操作通常具有常数时间复杂度(O(1)),使得更新和查询操作非常快速
(1)setbit
(2)getbit
(3)bitcount
场景:当日网站访问量(user visitor(uv))
假设用户id={2,4,5}访问
setbit uv:2025:07:12 2 1;
setbit uv:2025:07:12 4 1;
setbit uv:2025:07:12 5 1;
注意:用集合或者key-value键值对存储,空间非常大【例如存值为id,long类型则64位,8字节】;Bitmap则 每个数组为1位(0或者1),1/8字节
假设有1亿用户,每天有5千万用户上线,存id(Long类型):集合=8字节*5千万(集合只需要记录在线用户)≈400M(每天);Bitmap=1/8字节*1亿(建立1亿的数组)≈12.5M(每天)
2、布隆过滤器与Bitmaps的关系
布隆过滤器:由一个二进制数组和一个Hash算法组成,判断一个元素是否在一个集合中
不在的一定不在,在的大概率在(hash冲突,优化方案:增大数组,增加hash函数)
解决缓存穿透(key不存在)
实现方法:
(1)自己通过hash和数组实现;
(2)Guava依赖包,可以无redis
(3)redission.getBoolemFilter
3、HyperLogLog
大型网站的网页访客,HyperLogLog提够不精准的去重的方法,标准误差0.81%,HyperLogLog 的内存消耗固定为 12KB,无论集合中元素数量多大,都不会增加内存需求。
(1)pfadd :添加内容,如pfadd uv:2025:07:12 user1 user2 user3 user1
(2) pfcount:统计数量,如 pfcount uv:2025:07:12 返回3,因为有一个重复
(3)pfmerge:并集,将多个HyperLogLog合并成一个
原理:伯努利实验+极大似然估计方法+分桶优化
4、GEO的操作命令
实现地理位置信息
(1)添加内容: geoadd ditu 精度 维度 北京 精度 维度 上海
(2)获取坐标:geopos ditu 北京 上海
(3)计算两个城市之间的距离:geodist ditu 北京上海
(4)以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadius ditu 精度 维度 距离 withdist withcoord
其中距离默认单位是米,withdist 返回位置元素时,距离也一并返回;withcoord位置元素的经纬度也返回
(5)georadiusbymember 根据指定的元素返回指定范围内定位置元素
GEORADIUSBYMEMBER ditu 北京 100km
暂时完结,重新复习一下,然后更新一些网上面经题目