redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)

news2025/1/19 14:15:13

一 亿级别统计分类

1.1 统计分类

1.聚合统计:统计多个集合聚合的结果,也就是多个集合之间交并差的统计。
2.排序统计:在需要展示最新列表,排行榜等场景时,如果数据更新频繁或者需要分页时,建议使用zset127.0.0.1:6379> zadd pl  111222 beijing 111223 tianjing 111333 shanghai
(integer) 3
127.0.0.1:6379> zrange pl 0 1
1) "beijing"
2) "tianjing"
127.0.0.1:6379> zrangebyscore  pl  111222  111233  limit 0 5
1) "beijing"
2) "tianjing"
127.0.0.1:6379> zrangebyscore  pl  111222  1114444  limit 0 5
1) "beijing"
2) "tianjing"
3) "shanghai"
127.0.0.1:6379> 

3.二值统计:集合中的元素只有0和1 ,钉钉打卡的场景,我们只用记录有签到的信息(1签到0没签到)
使用bitmap

4.基数统计:集合中不重复元素的总数,使用hyperloglog

127.0.0.1:6379> pfadd hp1  1 3 5 7 9
(integer) 1
127.0.0.1:6379> pfadd hp2  2 4 6 8 5
(integer) 1
127.0.0.1:6379> pfcount hp1
(integer) 5
127.0.0.1:6379> pfmerge distResult hp1 hp2
OK
127.0.0.1:6379> pfcount distResult
(integer) 9
127.0.0.1:6379> 

1.2 访问指标

uv:用户访问率,一般理解为客户端ip
pv:网页访问率
DAU: 日活跃用户量,登录或者使用了某个产品的用户数(去重复的登录的用户)
MAU:月活跃用户量

二 使用hyperloglog统计某宝uv的访问量案例

2.1 使用java代码实现

2.1.1 模拟用户不停访问某宝的数据

代码:

package com.ljf.redis.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @auther zzyy
 * @create 2022-12-25 11:56
 */
@Service
@Slf4j
public class HyperLogLogService
{
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 模拟后台有用户点击淘宝首页www.taobao.com,每个用户来自不同的IP地址
     */
    @PostConstruct
    public void initIP()
    {
        new Thread(() -> {
            String ip = null;
            for (int i = 0; i < 20; i++) {
                Random random = new Random();
                ip = random.nextInt(256)+"."+
                        random.nextInt(256)+"."+
                        random.nextInt(256)+"."+
                        random.nextInt(256);

                Long hll = redisTemplate.opsForHyperLogLog().add("hll", ip);
                log.info("ip={},该IP地址访问首页的次数={}",ip,hll);
                //暂停3秒钟
                try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
            }
        },"t1").start();
    }

    public long uv()
    {
        //PFCOUNT
        return redisTemplate.opsForHyperLogLog().size("hll");
    }

}

 2.1.2  查看代码编写

 代码

package com.ljf.redis.controller;


import com.ljf.redis.service.impl.HyperLogLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @auther zzyy
 * @create 2022-12-25 11:56
 */
@Api(tags = "淘宝亿级UV的Redis统计方案")
@RestController
@Slf4j
public class HyperLogLogController
{
    @Resource
    HyperLogLogService hyperLogLogService;

    @ApiOperation("获得IP去重复后的UV统计访问量")
    @RequestMapping(value = "/uv",method = RequestMethod.GET)
    public long uv()
    {
        return hyperLogLogService.uv();
    }
}

2.2  启动redis服务

1.启动redis服务

[root@localhost ~]# redis-server /myredis/redis.conf 
[root@localhost ~]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *

2.关闭防火墙

 2.3 查看

1.页面访问

2.redis查看

三 使用GEO获取指定位置附近的坐标

3.1 java实现

1.controller

package com.ljf.redis.controller;


import com.ljf.redis.service.impl.GeoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Point;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @auther zzyy
 * @create 2022-12-25 12:12
 */
@Api(tags = "美团地图位置附近的酒店推送GEO")
@RestController
@Slf4j
public class GeoController
{
    @Resource
    private GeoService geoService;

    @ApiOperation("添加坐标geoadd")
    @RequestMapping(value = "/geoadd",method = RequestMethod.GET)
    public String geoAdd()
    {
        return geoService.geoAdd();
    }

    @ApiOperation("获取经纬度坐标geopos")
    @RequestMapping(value = "/geopos",method = RequestMethod.GET)
    public Point position(String member)
    {
        return geoService.position(member);
    }

    @ApiOperation("获取经纬度生成的base32编码值geohash")
    @RequestMapping(value = "/geohash",method = RequestMethod.GET)
    public String hash(String member)
    {
        return geoService.hash(member);
    }

    @ApiOperation("获取两个给定位置之间的距离")
    @RequestMapping(value = "/geodist",method = RequestMethod.GET)
    public Distance distance(String member1, String member2)
    {
        return geoService.distance(member1,member2);
    }

    @ApiOperation("通过经度纬度查找北京王府井附近的")
    @RequestMapping(value = "/georadius",method = RequestMethod.GET)
    public GeoResults radiusByxy()
    {
        return geoService.radiusByxy();
    }

    @ApiOperation("通过地方查找附近,本例写死天安门作为地址,作为家庭作业")
    @RequestMapping(value = "/georadiusByMember",method = RequestMethod.GET)
    public GeoResults radiusByMember()
    {
        return geoService.radiusByMember();
    }

}

2.servie

package com.ljf.redis.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @auther zzyy
 * @create 2022-12-25 12:11
 */
@Service
@Slf4j
public class GeoService
{
    public static final String CITY ="city";
    @Autowired
    private RedisTemplate redisTemplate;

    public String geoAdd()
    {
        Map<String, Point> map = new HashMap<>();
        map.put("天安门",new Point(116.403963,39.915119));
        map.put("故宫",new Point(116.403414,39.924091));
        map.put("长城",new Point(116.024067,40.362639));

        redisTemplate.opsForGeo().add(CITY,map);

        return map.toString();
    }

    public Point position(String member) {
        //获取经纬度坐标
        List<Point> list = redisTemplate.opsForGeo().position(CITY, member);
        System.out.println("获取经纬度....");
        return list.get(0);
    }

    public String hash(String member) {
        //geohash算法生成的base32编码值
        List<String> list = redisTemplate.opsForGeo().hash(CITY, member);
        return list.get(0);
    }

    public Distance distance(String member1, String member2) {
        //获取两个给定位置之间的距离
        Distance distance = redisTemplate.opsForGeo().distance(CITY, member1, member2,
                RedisGeoCommands.DistanceUnit.KILOMETERS);
        return distance;
    }
    public GeoResults radiusByxy() {
        //通过经度,纬度查找附近的,北京王府井位置116.418017,39.914402
        Circle circle = new Circle(116.418017, 39.914402, Metrics.KILOMETERS.getMultiplier());
        // 返回50条
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortDescending().limit(50);

        GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = redisTemplate.opsForGeo().radius(CITY, circle, args);

        return geoResults;
    }
    public GeoResults radiusByMember() {
        //通过地方查找附近
        return null;
    }
}

3.2 测试

1.添加

 

2.获取坐标

3.计算距离

 四 使用bitmap实现统计

4.1 常用命令

应用场景:

连续签到打卡
最近一周的活跃用户
统计指定用户一年之中的登录天数

1.添加数据

127.0.0.1:6379> setbit u1:20230822 0 1
0
127.0.0.1:6379> setbit u2:20230822 0 1
0

2.获取数据
127.0.0.1:6379> getbit u1:20230822
ERR wrong number of arguments for 'getbit' command

127.0.0.1:6379> getbit u1:20230822 3
0
127.0.0.1:6379> getbit u1:20230822 0
1

3.统计数目

127.0.0.1:6379> bitcount u1:20230822 0 30
1
127.0.0.1:6379> 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/925892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试之Junit

Junit引入注解参数化单参数多参数方法传参 测试用例执行顺序断言测试套件 Junit引入 Junit来编写和组织自动化测试用例&#xff0c;使用Selenium来实际模拟用户与Web应用程序的交互。也就是使用JUnit的测试功能来管理和运行Selenium测试。常见的做法是&#xff0c;使用JUnit作…

mysql 字符集、比较规则, 比较规则底层逻辑

字符集的级别 show variables like ‘%charecter%’&#xff1b; character_set_server 服务器级别 一般在 5.7&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 8.0&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.7\my.ini Linux 系列 vim /etc/my.cnf chara…

stm32之19.温湿度模块(待补充)

dth11.c文件① #include "dht11.h" #include "delay.h"// 1、温湿度模块初始化(PG9) void Dht11_Init(void) {// 0、GPIO外设信息结构体GPIO_InitTypeDef GPIO_InitStruct;// 1、使能硬件时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//…

微调Llama2自我认知

一、概述 最近在学习了解大模型微调相关的内容&#xff0c;在学习的过程中也遇到了很多问题&#xff0c;所以将自己的学习过程记录下来&#xff0c;希望对大模型微调感兴趣的小伙伴提供一点帮助&#xff0c;本文主要介绍一下如何通过SFT微调Llama2的自我认知&#xff0c;先看一…

最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码

全新PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套…

语音芯片国产品牌—认准“深圳唯创知音”语音IC方案商,稳定可靠

​随着科技的飞速发展&#xff0c;语音技术正逐渐渗透进入我们生活的方方面面&#xff0c;从智能助手到智能家居&#xff0c;从汽车到工业设备&#xff0c;语音成为了人机交互的一种重要方式。而在这个充满激烈竞争的领域里&#xff0c;深圳唯创知音作为语音芯片领域的领军品牌…

亚马逊买家评论怎么删除

亚马逊的评论删除通常是由买家自行操作的。如果你是一名亚马逊买家&#xff0c;想要删除你之前发布的评论&#xff0c;可以按照以下步骤进行&#xff1a; 1、登录亚马逊账户 2、找到你的评论&#xff1a;在页面的右上角&#xff0c;你可以找到“Hello, [你的名字]”或者“你好…

关于数组和指针的笔试题解析(详解)

文章目录 说明&#x1f6a9;数组笔试题&#x1f4bb;一维数组&#x1f4c4;练习&#xff1a;&#x1f4a1;解析 &#x1f4bb;字符数组&#x1f4c4;练习1&#xff1a;&#x1f4a1;解析&#x1f4c4;练习2&#xff1a;&#x1f4a1;解析&#x1f4c4;练习3&#xff1a;&#x…

科技资讯|三星再申请智能戒指商标,智能穿戴进入更小型化发展

三星正在积极扩展可穿戴设备生态&#xff0c;近日向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;其分类为“Class 9”&#xff0c;可能会用于未来的智能戒指。 智能戒指&#xff1a; 可穿戴计算机本质上的智能手环、智能项链、智能眼镜和智能戒指&#xff1…

新KG视点 | 白硕—大模型时代的知识图谱

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

全套解决方案&#xff1a;基于pytorch、transformers的中文NLP训练框架&#xff0c;支持大模型训练和文本生成&#xff0c;快速上手&#xff0c;海量训练数据&#xff01; 1.简介 目标&#xff1a;基于pytorch、transformers做中文领域的nlp开箱即用的训练框架&#xff0c;提…

如何满足影视飓风对空间智能化的“挑剔”?智哪儿专访Aqara杭州上城区服务商

最近&#xff0c;商务部、住房城乡建设部等13部门联合印发了关于促进家居消费若干措施的通知&#xff0c;明确提出要促进智能家居设备互联互通&#xff0c;推动单品智能向全屋智能发展。在国家相关政策的支持下&#xff0c;全屋智能引领下的空间智能化面临前所未有的发展机会&a…

“传递信任 服务发展”金融科技标准认证生态大会成功举办 同创永益为支持单位

8月16日下午&#xff0c;北京国家金融科技认证中心&#xff08;以下简称“国金认证”&#xff09;在第十三届农村金融机构信息化发展创新座谈会期间&#xff0c;成功举办“传递信任 服务发展”金融科技标准认证生态大会&#xff0c;邀请管理部门、行业机构、产业机构&#xff0…

亚马逊云科技CEO谈及企业领导力原则的核心:坚持顾客至上

亚马逊云科技首席执行官Adam Selipsky几乎从一开始就在那里&#xff1a;他于2005年加入&#xff0c;在效力亚马逊11年后于2016年离开&#xff0c;转而经营Tableau&#xff0c;并于2021年成为亚马逊云科技首席执行官。当时亚马逊云科技前首席执行官安迪贾西(Andy Jassy)接替杰夫…

基于NXP i.MX 6ULL核心板的物联网模块开发案例(3)

前言 本文主要介绍基于创龙科技TLIMX6U-EVM评估板的物联网模块开发案例&#xff0c;适用开发环境&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Windows 10 64bit 虚拟机&#xff1a;VMware15.1.0 Linux开发环境&#xff1a;Ubuntu18.04.4 64bit U-Boot&…

大型企业是否有必要进行数字化转型?

在数字化、信息化、智能化蓬勃发展的今天&#xff0c;初创公司可以很轻易的布局规划数字化发展的路径。而对于大型企业而言&#xff0c;其已经形成了较为成熟稳固的业务及组织架构&#xff0c;是否还有必要根据自身行业发展特点寻求数字化转型&#xff1f;&#xff08;比如制造…

喜讯|思迈特软件入选2023爱分析·数据智能优秀厂商

近期&#xff0c;“2023爱分析数据智能优秀厂商”评选结果于第五届数据智能高峰论坛现场正式公布&#xff0c;思迈特软件凭借在数据智能领域的技术及服务水平&#xff0c;从150家数据智能厂商中脱颖而出&#xff0c;成功入选为“2023爱分析数据智能优秀厂商”。 本次评选是基于…

Python“牵手”1688商品列表数据,关键词搜索1688API接口数据,1688API接口申请指南

1688平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c; 1688API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问1688平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现1688平…

Wi-Fi网络泄露你位置的新恶意软件,如何保护自己?

通常&#xff0c;当黑客用恶意软件感染最好的Windows笔记本电脑时&#xff0c;经济利益是他们的动机。然而&#xff0c;他们也喜欢部署信息窃取恶意软件来获取你的个人数据。 Secureworks反威胁部门的安全研究人员发现了一种神秘的新恶意软件&#xff0c;它完全是在寻找其他东…

【Unity小技巧】在Unity中实现类似书的功能(附git源码)

文章目录 前言本文实现的最终效果素材1. 页面素材2. 卡片内容素材地址 翻页实现1. 配置我们的canvas参数2. 添加封面和页码3. 翻页效果4. 添加按钮5. 脚本控制6. 运行效果 页面内容1. 添加卡片内容2. shader控制卡片背面3. 页面背面显示不同卡片 源码参考完结 前言 欢迎来到游…