首页 > 数据库 >使用 Redis 记录用户连续登录天数的方法及代码分享

使用 Redis 记录用户连续登录天数的方法及代码分享

时间:2024-09-26 22:22:40浏览次数:9  
标签:存储 登录 天数 Redis 用户 bitmap 统计

目录

标题:使用 Redis 记录用户连续登录天数的方法及代码分享

一、为什么不适合放在数据库中

二、Redis 的 bitmap 介绍

三、存储方式及统计方法

(一)以每天维度存储

(二)以用户维度存储


在本文中,我们将探讨如何使用 Redis 记录用户连续登录天数的问题。这是一个在面试中可能会遇到的场景题,同时也在实际的购物 APP 和游戏中经常出现。当用户连续签到达到一定天数时,可以获得奖励,因此准确记录用户的连续登录天数非常重要。

一、为什么不适合放在数据库中

如果将用户连续登录的数据放在数据库中,需要有一张表单独记录每一个用户在哪一天进行了签到。当用户量非常多时,这个表的数据会成倍增长,给数据库带来巨大的压力。因此,放在 MySQL 数据库中是不合适的。

二、Redis 的 bitmap 介绍

我们可以利用 Redis 提供的 bitmap(位图)来实现用户连续登录天数的记录。Bitmap 实际上是由一个一个的 bit 的二进制位所组成的数组,每一个位只能存 0 和 1。凡是这种二值统计,都可以用 bitmap 来实现,比如是否登录、是否签到、是否点赞等涉及到海量数据的场景。因为它所占的内存很小,并且统计速度也非常快。

Redis 的 bitmap 是由 string 类型所实现的,string 类型最大可以存储 512 兆。经过计算,512 兆最多可以存储 42 亿多个 bit 的位,所以哪怕有几亿个用户需要统计他们的连续签到,bitmap 也是可以存储得下的,并且所占的内存也是可以承受的。

三、存储方式及统计方法

(一)以每天维度存储

  1. 存储方式:
    • 假如要统计 30 天的所有用户的连续登录,就需要存储 30 个 bitmap。以日期作为 bitmap 的 key,将用户的 id 映射到 bitmap 的偏移位。前提是用户 id 是唯一的数字,比如 id 为五的用户登录了,就可以把他的 bit 位存储为 1。第二天再给他存储一个 bitmap,到对应的用户的 id 登录了,同样存储为 1,以此类推。
  2. 统计方法:
    • 以最后一个日期(当天)为起点,往前面的日期去推算。凡是碰到 1,就给用户的登录次数加 1;碰到 0,则不再给这个用户进行统计。这样就可以统计对应用户的连续登录次数。
  3. 适用场景:
    • 这种方式统计每一天的所有用户效率比较高,但统计单个用户不太方便,需要循环每一个日期的 key。比较适用于用户量比较多的情况。
  4. 注意事项:
    • 不建议统计超过 30 天的日期,一般游戏或签到也只统计 30 天。可以将当前 key 的过期时间设置为 30 天,超过 30 天自动过期,这样可以有效利用 Redis 的内存。

(二)以用户维度存储

作者准备了以用户维度来进行存储并且统计的代码,大家需要的话,可以在评论区扣 666 来进行获取查看。

以下是用 Java 语言实现以日期维度存储和统计用户连续登录天数的示例代码,使用了 Jedis 库来连接 Redis:

import redis.clients.jedis.Jedis;

public class RedisUserLoginDays {
    public static void main(String[] args) {
        // 连接 Redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 假设用户 id 为 5,当前日期为 '20240926'
        int userId = 5;
        String today = "20240926";

        // 将用户登录状态存储到当天的 bitmap 中
        jedis.setbit(today, userId, true);

        // 统计连续登录天数(假设今天是第 5 天,前四天用户都有登录)
        int days = 0;
        for (int i = 1; i < 5; i++) {
            String prevDay = "202409" + (26 - i);
            if (jedis.getbit(prevDay, userId)) {
                days++;
            } else {
                break;
            }
        }

        System.out.println("用户连续登录天数:" + (days + 1));

        // 关闭连接
        jedis.close();
    }
}

对于以用户维度存储和统计的代码,可以根据上述思路进行类似的 Java 实现,具体的实现方式可以根据实际需求进行调整和扩展。

标签:存储,登录,天数,Redis,用户,bitmap,统计
From: https://blog.csdn.net/m0_57836225/article/details/142578323

相关文章

  • Redis缓存过期淘汰策略
    先来看下我们遇到的问题生产上redis内存需要设置多少才合适如何配置、修改redis的内存大小,具体怎么操作如果内存满了Redis怎么办redis清理内存的方式选择那种:定期删除和惰性删怎么选择redis缓存淘汰策略1.redis内存1.1查看Redis内存配置文件查看Redis最大占用内......
  • 当超级管理员因错误而不允许用户登录时会发生什么
    想象一下,您是网络应用程序的用户,兴奋地导航到登录页面以访问您的帐户,然后输入凭据,单击闪亮的“登录”按钮,然后满怀期待地等待。但可惜的是,您的个性化仪表板并没有迎接您,而是出现了一条不祥的错误消息:“抱歉,由于系统错误,站点管理员已暂时禁用用户登录。”当您感到沮丧时,您可能想知......
  • redis自身查询很慢 排查redis-benchmark
    redis-benchmark 是一个用于测试Redis性能的基准测试工具,可以帮助开发人员评估和比较Redis在不同配置或负载情况下的吞吐量和延迟。通过 redis-benchmark 的测试结果,你可以获得qps、平均延迟、错误率等性能指标,从而根据需要进行调优和优化,确保Redis在实际生产环境中具有良......
  • linux主机入侵排查 爆破登录
    一、系统排查分析1.用户信息的排查#查看用户和密码cat/etc/shadowcat/etc/passwd#查看组信息cat/etc/group#查看历史命令history#查看最近登录成功的用户及信息last#查看主机所有用户最近一次登录信息lastlog#查看当前用户信息id#查看当前登录系统......
  • Docker容器启动Redis设置密码并持久化
    启动命令dockerrun--namewh-redis-p6379:6379-v/root/RedisData:/data-d--restartunless-stoppedredis--appendonlyyes--requirepass'Your-password'dockerrun:启动一个新的Docker容器。--namewh-redis:给容器指定一个名称,容器名为wh-redis。指定名......
  • 2 Redis实现分布式锁
    用Redis实现分布式锁的原理主要基于Redis提供的原子操作命令(如SETNX、EXPIRE等)和一些高级特性(如Lua脚本、RedLock算法等),来确保在分布式环境中对共享资源的互斥访问。以下是用Redis实现分布式锁的具体原理:一、分布式锁的基本步骤分布式锁的基本原理可以分为以下几个步骤:请求锁......
  • VB.net(C#同理)使用 ServiceStack.Redis 二进制存储、读取图像
    搜索了一下,网上似乎没有相关的内容,于是把自己探索的经验写一下。'安装提示:首先需要把当前的目标框架设置为.NetFramwork4.5。'方法一:复制ebay订单里的DLL\ServiceStack.Redis(整个文件夹),自行添加引用(4个dll)'方法二:使用Nuget安装servicestack.redis,选择5.0版本PublicClas......
  • Redis 事务
    概述Redis支持分布式环境下的事务操作,其事务可以一次执行多个命令,事务中的所有命令都会序列化地顺序执行。事务在执行过程中不会被其他客户端发送来的命令请求打断,服务器在执行完事务中的所有命令之后,才会继续处理其他客户端的其他命令。Redis的事务操作分为开启事务、命令入队......
  • redis常用命令
    目录Redsi最核心的命令(set和get)1.set2.get全局命令(通用命令)1.keys(按照匹配规则查看key)2.exists(用来判断指定key是否存在)3.del(删除指定的key)4.expire(给key设置过期时间)5.ttl(查看key的过期时间)reidis的key的过期策略怎么实现的?定时器的比较高效的实现方式6.type(查询key......
  • (Centos7/麒麟V10)服务器 Redis安装指南
    1.下载或上传安装包安装包官方下载地址:https://download.redis.io/releases/2.准备GCC编译环境查看gcc编译器版本:gcc-v若不存在则执行:yuminstall-ygcc或参考服务器gcc离线安装指南3.解压安装包并移至目标目录本文以redis-7.0.8.tar.gz安装包,部署路径/home/redis为......