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 所储存的字符串值,设置或清除指定偏移 ...
随机推荐
- MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选
1 .MySQL数据库的性能监控 1.1.如何查看MySQL数据库的连接数 连接数是指用户已经创建多少个连接,也就是MySQL中通过执行 SHOW PROCESSLIST命令输出结果中运行着的线程 ...
- 嵌入式-C语言基础:字符串拼接函数strcat
#include<stdio.h> #include <string.h> //实现字符串拼接 char * mystrcat(char * dest,char * src) ...
- perl之grep函数的用法
转载至 perl中grep的详细用法 grep有2种表达方式: 1 grep BLOCK LIST 2 grep EXPR, LIST BLOCK表示一个code块,通常用{}表示:EXPR表示一个表 ...
- Go语言核心36讲04
我们已经知道,环境变量GOPATH指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件. 这里的源码文件又分为三种,即:命令源码文件.库源码文件和测试源码文件,它们都有着不同的 ...
- Axios 类似于for循环发送批量请求{:axios.all axios.spread}。
Axios的请求都是异步的!不能用for循环遍历去批量发送请求 那如果我们需要类似与这样的请求怎么办呢 for(let i =0;i<array.length;i++){ axios.post( ...
- 关于linux mint更改资源管理器的快捷键
前言 首先要知道 linux mint 的默认资源管理器是 nemo 我很不习惯 ctrl+d 在nemo里面是 收藏到侧边栏 我习惯 ctrl+d 在windows上是删除文件 所以下面我就修改这个 ...
- 快速绘制流程图「GitHub 热点速览 v.22.47」
画流程图一直是研发的一个难题,如何画得通俗易懂已经够让人头疼了,还要美观大方.用 d2 的语法描述下流程,d2 会自动帮你生成一张配色极佳的流程图.说到研发的选择,本周特推的 choiceof.dev ...
- 为什么推荐Kestrel作为网络开发框架
为什么推荐Kestrel 网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestr ...
- RFN-Nest_ An end-to-end residual fusion network for infrared and visible images 论文解读
RFN-Nest 2021 研究 图像融合分为三步:特征提取,融合策略,图像重建. 当前端到端的图像融合方法:基于GAN的.还有本文提出的 研究背景:当前设计的融合策略在为特定任务生成融合图像方面是比 ...
- 《HTTP权威指南》– 6.代理
代理的概念: Web代理服务器是网络的中间实体.位于客户端和服务器之间,扮演"中间人"的角色,在各端点之间来回传送HTTP报文. 私有和共享代理: 代理服务器可以是某个客户端专用的 ...