这样子签到好像比较舒服

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 这样子签到好像比较舒服

前言:

大家好,我是小面~今天给大家带来的主题是:

每当我们进入各种网页或者是APP或者是游戏,里面都有一个耳熟能详的功能那就是签到功能。而用户也是很乐意去签到, 因为会送东西。签到功能同时也保证了用户的粘性,保持活跃量。今天小面就在这里用redis给大家实现一下简单的签到功能~

正文:

我们要实现签到功能用的结构是bitmap(位图)。小面在这里也讲一下,为什么要用redis的bitmap结构去做签到功能。

首先我们了解一下bitmap。bitmap,我们可以理解为他是一串二进制数组(由0,1)组成,可以通过偏移量来定位。他的优点之一就是它存储非常节省空间,特别适合一些数据量大且使用二进制统计的场景。回到我们的签到功能,如果一个用户比如今天签到了 ,那么我们就用1来表示该用户签到,一个月30天,那么该用户一个月的签到记录 也就只占用30bit。如果我们用mysql数据库去保存用户签到信息的话,那占的空间就很大了,一条数据包括了 userId,date,isCheck等等…… 这样一个月就是30条数据。。。相较于redis 的bitmap空间占用还是太大了。

我们来学习一下redis的bitmap的相关命令:

SETBIT: SETBIT key offset value

根据我们要求实现签到功能,我们的命令如下:
(假设我们按周统计,今天用户id为1的用户在这周的第一天签到)
SETBIT WEEK:CHECK:USERID:1 0 1
(这周的第二天签到)
SETBIT WEEK:CHECK:USERID:1 1 1
(这周的第三天签到)
SETBIT WEEK:CHECK:USERID:1 2 1
(后面三天天没签到)
(这周的第七天签到)
SETBIT WEEK:CHECK:USERID:1 6 1
此时的bitmap的存储内容是:【1,1,1,0,0,0,1】,中间三天是没有签到的。

GETBIT:GETBIT KEY OFFSET

我们可以用GETBIT命令去查询一下用户是否有签到记录:
GETBIT WEEK:CHECK:USERID:1 0    (返回1,就是签到过)
GETBIT WEEK:CHECK:USERID:1 3    (返回0,就是没签到过)

BITCOUNT BITCOUNT key [start end]

(这里的start 和 end 代表字节,一个字节=8个bit) 我们可以用BITCOUNT来统计该用户一共签到了几天

BITCOUNT WEEK:CHECK:USERID:1 (返回4,代表一共签到了4天)

做到这里,大家也就知道咱们基本的签到功能就可以实现了~ 是不是很简单呀

此外既然已经和大家介绍了三个bitmap的命令,那就顺便把其他命令也给大家讲述一下吧~

BITPOS BITPOS key bit [start [end]]

这个命令的意思就是返回字符串中,从左到右,第一个比特值为bit(0或1)的偏移量 (以我们刚刚的签到记录为例子)

BITPOS WEEK:CHECK:USERID:1 1  (返回0)
BITPOS WEEK:CHECK:USERID:1 0  (返回3)

BITTOP BITOP operation destkey key [key ...]

这个命令就是对多个字符串进行操作(AND 逻辑与、OR逻辑或、XOR求异或 或者 NOT 逻辑非)

set a "\xff"
set b "\x00"
 bitop AND andkey a b (andkey:"\x00")
 bitop OR orkey a b (orkey:"\xff")
 bitop XOR xorkey a b (xorkey:"\xff")
 bitop not notkey a (notkey:"\x00")

BITFIELD BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

BITFIELD可以对非同宽的比特位进行处理,对于任意偏移量的字段也可以进行处理。

结语:

这就是redis实现简单的签到功能,你会了吗?

相关文章
|
8月前
|
关系型数据库 MySQL 数据安全/隐私保护
大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望
本文深入探讨数据库课程设计 MySQL 的数据安全。以医疗、电商、企业案例,详述用户管理、数据加密、备份恢复及网络安全等措施,结合数据安全技术发展趋势,与《大数据新视界 -- 大数据大厂之 MySQL 数据库课程设计》紧密关联,为 MySQL 数据安全提供全面指南。
大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望
|
8月前
|
安全 Java 程序员
巧用Optional之优雅规避NPE问题
本文探讨了Java中常见的NullPointerException问题及其解决方案,重点介绍了Optional类的使用。通过实例代码分析,展示了如何用Optional替代传统的空值检查,使代码更简洁、优雅。文章详细讲解了Optional的创建方法(如of、ofNullable、empty)及常用方法(如get、orElse、map、flatMap、filter),并通过实战案例演示了其在实际开发中的应用,帮助开发者有效避免NPE问题,提升代码质量。
213 2
巧用Optional之优雅规避NPE问题
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
264 0
|
8月前
|
SQL 存储 关系型数据库
MySQL选错索引了怎么办?
本文探讨了MySQL中因索引选择不当导致查询性能下降的问题。通过创建包含10万行数据的表并插入数据,分析了一条简单SQL语句在不同场景下的执行情况。实验表明,当数据频繁更新时,MySQL可能因统计信息不准确而选错索引,导致全表扫描。文章深入解析了优化器判断扫描行数的机制,指出基数统计误差是主要原因,并提供了通过`analyze table`重新统计索引信息的解决方法。
226 3
|
8月前
|
消息中间件 NoSQL Java
RocketMQ实战—10.营销系统代码优化
本文主要介绍了如何对营销系统的四大促销场景的代码进行优化,包括:全量用户推送促销活动、全量用户发放优惠券、特定用户推送领取优惠券消息、热门商品定时推送。
|
9月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
216 16
|
9月前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
330 2
|
10月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
314 5
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
344 11
IDEA统计项目代码量
IDEA统计项目代码量
729 0