high-concurrent-cache
  • Introduction
  • Redis
    • redis常用命令
      • 生产环境谨慎使用keys命令
      • Redis 命令参考
    • redis客户端
      • Jedis使用指南
      • redisson
      • redis连接池
      • jedisCluster详解
      • jedisCluster+SpringMVC整合
    • redis主从模式
      • 配置方式
      • 一主多从读写分离架构
    • redis持计划机制的讲解
      • 持久化
      • RDB详解
      • AOF详解
      • RDB与AOF异同比较
    • 哨兵机制详解(sentinel)
      • 哨兵使用架构(sentinel)
      • 哨兵工作原理/哨兵如何监控redis
      • 哨兵如何高可用
      • 哨兵内部通讯原理/自动发现 Sentinel 和从服务器
      • 基于哨兵的redis高可用架构
    • redisCluster集群
      • 架构分析
      • 搭建高可用集群
      • 分区存储详解
      • java客户端使用redisCluster
    • 实战场景
      • 高性能分布式缓存
      • 实现定时消息通知
      • 简单高速队列的实现与应用
      • 实现去重幂等性
      • 数据计数/订单号生成
      • 基于redis实现分布式锁
      • 排行榜
      • 使用Redis bitmaps进行快速、简单、实时统计
      • 利用Redis集合(Set)统计新增用户和次日留存率
    • Redis回收进程如何工作的? Redis回收使用的是什么算法?
    • Redis持久化数据和缓存怎么做扩容?
    • Redis 分区的优势、不足以及分区类型
    • Redis 大量数据插入
    • redis实现简单延时队列
    • 使用 redis 如何设计分布式锁?说一下实现思路?使用 zk 可以吗?如何实现?这两种有什么区别?
    • Redis的bitmap讲解
    • 分布式锁的漫画教程
  • Memcached
    • Memcached概念
    • 安装配置
      • Linux安装
      • Windows安装
    • 集群搭建
    • 常用场景
    • 客户端命令
      • 客户端连接命令
      • Memcached 存储命令
        • Memcached set 命令
        • Memcached add 命令
        • Memcached replace 命令
        • Memcached append 命令
        • Memcached prepend 命令
        • Memcached CAS 命令
      • Memcached 查找命令
        • Memcached get 命令
        • Memcached gets 命令
        • Memcached delete 命令
        • Memcached incr 与 decr 命令
      • Memcached 统计命令
        • Memcached stats 命令
        • Memcached stats items 命令
        • Memcached stats slabs 命令
        • Memcached stats sizes 命令
        • Memcached flush_all 命令
    • Java客户端
    • memcached特点与redis区别
    • 一致性哈希算法原理
    • Memcache 高可用集群之magent实现主从
  • 互联网缓存架构设计
    • 常见的缓存架构方案
    • 缓存雪崩的解决方案
    • 缓存穿透的解决方案
    • 缓存击穿的解决方案
Powered by GitBook
On this page

Was this helpful?

  1. Redis
  2. 实战场景

利用Redis集合(Set)统计新增用户和次日留存率

新增用户:在某个时间段(一般为一整天)新登录应用的用户数,一般通过用户设备号判断用户是否是第一次登录应用

次日留存率:(当天新增的用户中,在注册的第2天还登录的用户数)/第一天新增总用户数

公司有专门的统计数据库,但是每张表的数据量都非常大,都是百万、千万级别,如果用常规的SQL语句去查找,查找的速度会非常慢,很不现实。结合实际的业务,最后想到用Redis的集合去计算处理数据。

1、首先我们需要计算所有出现过的用户设备号(SELECT distinct(user_device) FROM `statistic_20170801` UNION SELECT distinct(user_device) FROM `statistic_20170802`),把这些设备号存在redis的集合中($redis->sadd('user_device','6ab3d84ace678644f44645'));

2、再计算当天出现的所有设备号(SELECT distinct(user_device) FROM `statistic_20170803`),将这些设备号存在redis临时集合中($redis->sadd('tmp_20170803','5a6vhbb84ace678fgv44f44645');

3、利用redis的sdiffstore命令,返回user_device和tmp_20170803两个集合的差集($redis->sdiffstore('new_20170803',"user_device","tmp_20170803)),这个新的new_20170803集合,就是当日(20170803)的新增用户,为避免占用内存,需给这个new_20170803集合设置过期时间,由于要算次日留存率,所以new_20170803集合的生存期设为1天(同理,要算七日留存率,则设置7天生存期);

4、利用redis的SCARD命令,得出new_20170803这个集合的元素数量($redis->SCARD('new_20170803')),就是20170803新增的用户数量;

5、不要忘记,将当天的用户设备号合并进user_device集合中,利用redis的SUNIONSTORE命令,$redis->sunionstore('user_device',"user_device","tmp_20170803"),再用$redis->del('tmp_20170803'),删除这个临时集合;

6、计算次日留存率,我们要计算8月4日出现的所有设备号(SELECT distinct(user_device) FROM `statistic_20170804`),将这些设备号存在redis临时集合中($redis->sadd('tmp_20170804','5a6vhbb84ace678fgv44f44645');

7、利用redis的SINTERSTORE命令,$redis->sinterstore('next_day_ retention',"new_20170803","tmp_20170804"),返回new_20170803和tmp_20170804两个集合的并集,就是8月3日新增的用户,8月4日也正常登陆的用户集合了;

8、利用redis的SCARD命令,得出next_day_retention这个集合的元素数量($redis->SCARD('next_day_retention')),就是当天新增的用户,在注册的第2天还登录的用户数;

9、之前给new_20170803这个集合设置一天的生存期就派上用场了,利用redis的SCARD命令,得出new_20170803这个集合的元素数量($redis->SCARD('new_20170803')),就是20170803新增的用户数量;

10、再通过除法运算,$redis->SCARD('next_day_retention') / $redis->SCARD('new_20170803'),得出的就是8月3日的次日留存率了。

Previous使用Redis bitmaps进行快速、简单、实时统计NextRedis回收进程如何工作的? Redis回收使用的是什么算法?

Last updated 5 years ago

Was this helpful?