redis使用bitmap实现签到
import redis
import datetime
import calendar
r = redis.Redis(
host="127.0.0.1",
port=6379,
db=1,
password=""
)
def check_input(func):
def wrapper(*args, **kwargs):
if not isinstance(args[1], int):
raise ValueError(f"User_id must be int, and your input is {type(args[1])}")
return func(*args, **kwargs)
return wrapper
class RedisCheckIn:
_private_key = "_check_in_"
def __init__(self):
pass
@check_input
def sign(self, user_id: int) -> int:
# 用户签到
today = str(datetime.datetime.now())[:10]
return r.setbit(self._private_key+today, user_id, 1)
@check_input
def sign_status(self, user_id: int) -> int:
# 用户今日签到状态
today = str(datetime.datetime.now())[:10]
return r.getbit(self._private_key+today, user_id)
@check_input
def week_sign_status(self, user_id: int) -> list:
# 求出这个周的签到状况
now = datetime.datetime.now()
# 周一是1 周日是7 now.weekday()则是周一是0,周日是6
weekday = now.isoweekday()
with r.pipeline(transaction=False) as p:
for d in range(weekday):
check_day = str(now-datetime.timedelta(days=1)*d)[:10]
p.getbit(self._private_key + check_day, user_id)
data = p.execute()[::-1]
# 比如周三的时候我们只查3次getbit,然后剩下补0
data.extend([0] * (7 - len(data)))
return data
@check_input
def month_sing_status(self, user_id: int) -> list:
# 求出这个月的某个用户签到状况
now = datetime.datetime.now()
day = now.day
with r.pipeline(transaction=False) as p:
for d in range(day):
check_day = str(now - datetime.timedelta(days=1) * d)[:10]
p.getbit(self._private_key + check_day, user_id)
data = p.execute()[::-1]
# 获取当月天数,还没到的天数补0
month_range = calendar.monthrange(now.year, now.month)
data.extend([0] * (month_range[1] - len(data)))
return data
@check_input
def week_sign_num(self, user_id: int) -> int:
# 求出这个周的签到次数
return sum(self.week_sign_status(user_id))
@check_input
def month_sign_num(self, user_id: int) -> int:
# 求出这个月的签到次数
return sum(self.month_sing_status(user_id))
@check_input
def today_sign_all_num(self) -> int:
# 求出当天有多少用户签到
today = str(datetime.datetime.now())[:10]
return r.bitcount(self._private_key + today)
redis_sign_in = RedisCheckIn()
redis使用bitmap实现签到的更多相关文章
- Redis位图实现用户签到功能
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...
- 基于Redis位图实现用户签到功能
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...
- 基于Redis分布式BitMap的应用
一.序言 在实际开发中常常遇到如下需求:判断当前元素是否存在于已知的集合中,将已知集合中的元素维护一个HashSet,使用时只需耗时O(1)的时间复杂度便可判断出结果,Java内部或者Redis均提供 ...
- 利用redis的bitmap实现用户签到功能
一.场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 比如签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 显 ...
- Redis中bitmap的妙用
BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间. Redis中的 ...
- redis的bitmap
BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间. Redis中的 ...
- Redis 中 BitMap 的使用场景
BitMap BitMap 原本的含义是用一个比特位来映射某个元素的状态.由于一个比特位只能表示 0 和 1 两种状态,所以 BitMap 能映射的状态有限,但是使用比特位的优势是能大量的节省内存空间 ...
- Redis -使用 Bitmap
redis数据类型 String.Set.Zset.List.hash Bitmap . 四种统计类型: 二值状态统计: 聚合统计: 排序统计: 基数统计 二值状态统计: 就是集合中的元素 ...
- redis位图(bitmap)常用命令的解析
描述 bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到.登录等场景 常用命令及解析 常用命令 setbit key offset va ...
- 5、分布式缓存Redis之bitmap、setbit
基本语法: 1)SETBIT redis 127.0.0.1:6379> setbit KEY_NAME OFFSET VALUE //该命令用于对 key 所储存的字符串值,设置或清除指定偏移 ...
随机推荐
- Prometheus 监测 RocketMQ 最佳实践
本文作者:郭雨杰,阿里云智能技术专家. Prometheus 集成的 50 多款云产品中,RocketMQ 在可观测方面实现了非常完善的功能,是一个特别具有代表性的云产品. 01 RocketMQ如何 ...
- 手把手,完整的从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios
项目同步git:https://gitee.com/lixin_ajax/vue3-vite-ts-pinia-vant-less.git 为避免赘述,过于基础的点会直接省略或贴图,比如创建文件夹/文 ...
- 【云原生 · Kubernetes】部署zookeeper
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 部署zookeeper 1.1 zookeeper概述 1.2 ZooKeeper服务中操作 ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- Day19:属性封装详解
属性封装详解 封装即隐藏一些数据,让外部不能直接访问,而是需要通过一些方法才能设置或者访问. 首先我们来看未封装的属性被外部调用的情况 public class Students{//创建一个学生类 ...
- 解决win7连接蓝牙耳机播放设备找不到的问题
前言 这个问题其实就是蓝牙驱动问题, 而用第三方软件安装驱动,如驱动精灵安装蓝牙驱动,可能会不出现缺失驱动问题,但是一些功能会受到限制(win7系统与其蓝牙驱动不兼容). 解决办法 去 Inter官网 ...
- vivo大数据日志采集Agent设计实践
作者:vivo 互联网存储技术团队- Qiu Sidi 在企业大数据体系建设过程中,数据采集是其中的首要环节.然而,当前行业内的相关开源数据采集组件,并无法满足企业大规模数据采集的需求与有效的数据采集 ...
- SSH(五)spring整合hibernate
一.创建hibernate实体映射文件. 在实体所在包创建映射文件product.hbm.xml,引入hibernate的映射约束.(该约束位于hibernate3.jar里面hibernate-ma ...
- 螺旋矩阵II-LeetCode59 考验代码能力
力扣链接:https://leetcode.cn/problems/spiral-matrix-ii/ 题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 ...
- 整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天数、时间戳等,以及常用的日期时间处理方法
在 javascript 中内置了一个 Date 对象,可用于实现一些日期和时间的操作. 本文整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期.昨天.今天.明天.每月天数.时间戳等,以 ...