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

这篇具有很好参考价值的文章主要介绍了redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 亿级别统计分类

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 模拟用户不停访问某宝的数据

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

代码:

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  查看代码编写

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

 代码

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.关闭防火墙

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

 2.3 查看

1.页面访问

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

2.redis查看

redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo),redis,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.添加

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

2.获取坐标

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

3.计算距离

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

 四 使用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> 
 文章来源地址https://www.toymoban.com/news/detail-673563.html

到了这里,关于redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据科学、统计学、商业分析

    数据科学、统计学、商业分析是在各方面有着不同的侧重和方向的领域。  1.专业技能 数据科学(Data Science):数据科学涉及从大量数据中提取有价值的信息、模式和洞察力的领域。它使用多种技术和领域知识,如统计学、机器学习、数据库管理、数据可视化等,进行数据清

    2024年02月15日
    浏览(48)
  • 【大数据学习篇6】 Spark操作统计分析数据操作

    通过前面的文章安装好环境下面我们就可以开始来操作 使用MySQL的root用户对数据库进行修改以下设置

    2024年02月05日
    浏览(43)
  • 数据的统计描述和分析——假设检验

    对总体X的分布律或分布参数作某种假设,根据抽取的样本观察值,运用数理统计的分析方法,检验这种假设是否正确,从而决定接受假设或拒绝假设. 1. 参数检验 :如果观测的分布函数类型已知,这时构造出的统计量依赖于总体的分布函数,这种检验称为参数检验.参数检验

    2024年02月14日
    浏览(42)
  • R语言 | 数据分析——统计绘图

    目录 一、分类数据的图形描述 1.1 条形图barplot()函数 1.2 饼图pie()函数  二、量化数据的图形描述 2.1 点图与dotchart()函数 2.2 绘图函数plot()  2.2.1 绘制时间数列对象 ​2.2.2 向量数据与plot()函数 2.2.3 数据框数据与plot()函数 2.2.4  因子型数据与plot()函数 ​2.2.5 使用lines()函数绘制回

    2024年02月04日
    浏览(46)
  • 数据库性能测试实践:慢查询统计分析

    查看是否开启慢查询 mysql show variables like \\\'%slow%’; 如图所示: 系统变量log_slow_admin_statements 表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志 启用log_slow_extra系统变量 (从MySQL 8.0.14开始提供)将导致服务器将几个额外字段写入日志 Log_slow_slave_statements 从库默认

    2024年02月07日
    浏览(54)
  • 使用Python进行数据分析——描述性统计分析

    大家好,描述性统计分析主要是指求一组数据的平均值、中位数、众数、极差、方差和标准差等指标,通过这些指标来发现这组数据的分布状态、数字特征等内在规律。在Python中进行描述性统计分析,可以借助Numpy、Pandas、SciPy等科学计算模块计算出指标,然后用绘图模块Ma

    2024年02月07日
    浏览(49)
  • 【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

    Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析   Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 问题跟踪和用于变更管

    2024年02月07日
    浏览(43)
  • 用Python做数据分析之数据统计

    接下来说说数据统计部分,这里主要介绍数据采样,标准差,协方差和相关系数的使用方法。 1、数据采样 Excel 的数据分析功能中提供了数据抽样的功能,如下图所示。Python 通过 sample 函数完成数据采样。 2、数据抽样 Sample 是进行数据采样的函数,设置 n 的数量就可以了。函

    2024年02月07日
    浏览(47)
  • 数据处理与统计分析——MySQL与SQL

    数据库:DB(DataBase) 概念 :数据仓库,软件,安装在操作系统之上 作用 :存储数据,管理数据 关系型数据库:SQL(Structured Query Language) MySQL、Oracle、Sql Server、DB2、SQLlite 通过表和表之间,行和列之间的关系进行数据的存储 通过外键关联来建立表与表之间的关系 非关系型

    2024年02月12日
    浏览(40)
  • 数据挖掘与数据分析之统计知识篇

    统计学上, 自由度 是指当以样本的 统计量 估计 总体 的参数时, 样本中独立或能自由变化的数据个数叫自由度 。一般来说,自由度等于独立变量减掉其衍生量数。举例来说,变异数的定义是样本减平均值(一个由样本决定的衍生量),因此对N个随机样本而言,其自由度为N

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包