一、场景需求

适用场景如签到送积分、签到领取奖励等,大致需求如下:

  • 比如签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等。
  • 如果连续签到中断,则重置计数,每月初重置计数。
  • 显示用户某个月的签到次数和首次签到时间。
  • 在日历控件上展示用户每月签到情况,可以切换年月显示……等等。

二、代码

以下代码没有积分逻辑,只有签到

import datetime
import redis class Redis(object):
def __init__(self):
self.redis_store = redis.Redis(
host="127.0.0.1",
port="",
db=""
) class RedisSignIn(Redis):
@staticmethod
def GetDaliySignKey(time=datetime.datetime.now()):
# 拼接redis的key
bitmap_key_daily_sign = "daily_sign_{date}"
return bitmap_key_daily_sign.format(date=time.date()) def UserDailySign(self, session):
user_id = session.get("user")
if not user_id:
print( "验证失败")
return
if self.UserDaliySignByUserId(user_id):
rec = self.GetSignRecordByUserId(user_id, 7)
l = len(rec.split('')[0])
print(l)
# 连续签到
if l > 1:
pass
if l > 6:
pass
return
# 获取每月的签到记录
def GetUserDailySignRecordMonthly(self, session):
user_id = session.get("user")
if not user_id:
print( "验证失败")
return
res = self.GetSignRecordByUserId(user_id)
print(int(res, 2))
# 二进制数据转换为10进制,拿到的10进制数返回到前端,前端再解析成二进制数进行判断
return int(res, 2) def GetSignRecordByUserId(self, user_id, days=30):
# 开启管道模拟事务
with self.redis_store.pipeline(True) as p:
for i in range(days):
# 获取key对应值的二进制表示中的某位的值
p = p.getbit(self.GetDaliySignKey(datetime.datetime.now() - datetime.timedelta(days=i)), user_id)
# execute返回命令执行结果列表
res = p.execute()
# res是一个[1,0,0,0...]的列表
print(res)
# 转成字符串的二进制
return ''.join([str(x) for x in res]) # 通过user_id用户做每日签到
def UserDaliySignByUserId(self, user_id):
if self.GetDailySignByUserId(user_id):
print( "今天您已签到")
return
key = self.GetDaliySignKey()
# key就是签到日期,将该user_id在key对应的位置上设置为1,表示签到了
self.redis_store.setbit(key, user_id, 1)
# 设置key的过期时间
self.redis_store.expire(key, 60 * 60 * 24 * 30)
return True # 通过user_id获取用户每日签到信息
def GetDailySignByUserId(self, user_id):
return self.redis_store.getbit(self.GetDaliySignKey(), user_id) if __name__ == '__main__':
session={"user":1003}
sign=RedisSignIn()
sign.UserDailySign(session)
sign.GetUserDailySignRecordMonthly(session)

利用redis的bitmap实现用户签到功能的更多相关文章

  1. Redis实战篇(二)基于Bitmap实现用户签到功能

    很多应用上都有用户签到的功能,尤其是配合积分系统一起使用.现在有以下需求: 签到1天得1积分,连续签到2天得2积分,3天得3积分,3天以上均得3积分等. 如果连续签到中断,则重置计数,每月重置计数. ...

  2. Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...

  3. 基于Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满 ...

  4. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)

    利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...

  5. java redis 实现用户签到功能(很普通简单的签到功能)

    业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的 直接看代码吧如下 @Transactional @ ...

  6. 利用redis完成自动补全搜索功能(三)

    前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...

  7. 利用redis完成自动补全搜索功能(二)

    前面介绍了自动完成的大致思路,现在把搜索次数的功能也结合上去.我采用的是hash表来做的,当然也可以在生成分词的时候,另外一个有序集合来维护排序, 然后2个有序集合取交集即可.这里介绍hash的方式来 ...

  8. 利用redis完成自动补全搜索功能(一)

    最近要做一个搜索自动补全的功能(目前只要求做最前匹配),自动补全就是自动提示,类似于搜索引擎,再上面输入一个字符,下面会提示多个关键词供参考,比如你输入 nb 2字符, 会自动提示nba,nba录像, ...

  9. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)

    以HMAC密钥形式发放密钥令牌 功能如下 1:记录用户的登录的IP地址.时间 2:实现密码错误次数超限后锁定,并提示何时解锁 CREATE DEFINER=`root`@`%` FUNCTION `u ...

随机推荐

  1. Java oop 第13章_多线程

    第13章_多线程 一.   多线程相关的概念:  程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念.   进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...

  2. 2018-8-10-wpf-DoEvents-

    title author date CreateTime categories wpf DoEvents lindexi 2018-08-10 19:16:51 +0800 2018-2-13 17: ...

  3. 【FJWC2018】最大真因数

    题面 Description 一个合数的真因数是指这个数不包括其本身的所有因数, 例如 6 的正因数有1, 2, 3, 6,其中真因数有 1, 2, 3. 一个合数的最大真因数则是这个数的所有真因数中 ...

  4. webpack4.0高级

    环境变量 webpack --env.NODE_ENV=local --env.production --progress Tree Shaking 移除JS上下文字未被引用的代码 只支持ES6的im ...

  5. 泛型(Generic)类的使用原因和使用方式

    我们每个苹果都套个盒子,给每本书都套个盒子,但是苹果盒子和书盒子是不同的, 这样下去如果有更多的东西需要套盒子,1000种产品有1000种相应的盒子,造成类型极度膨胀非常难以维护. class Pro ...

  6. 关于使用vue-router的嵌套路由的命名路由时踩的坑

    今天在做我的模仿微博项目时,我想实现点击router-link后,跳转到微博正文页面,并渲染其嵌套视图-评论组件.但是在实际实现时,我发现页面可以正常跳转,但是在页面加载后,并不渲染该页面的嵌套视图, ...

  7. 【转载】查看Linux进程CPU过高具体的线程堆栈(不中断程序)

    具体的命令经常忘记,毕竟用的不是很多.为了避免去找备份一下 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45 up 850 days,  1:18,  3 users ...

  8. springcloud分布式事务TXLCN

    新增一个model,pom文件引入依赖 <dependency>     <groupId>org.springframework.boot</groupId>   ...

  9. JsJquery小技巧

    JS对URL编码 :encodeURI() .Net对URL解码:HttpUtility.UrlDecode() 格式化输出百分数 function formatePercent(data){     ...

  10. CApiHook__Api钩子类

    见过网上有很多ApiHook的类,但是都不尽入人意,要么就是写的不够好不够完善,要么就是跑不起来. 用别人写的代码总是有种不安心,所以自己就花了一晚上写了CApiHook类.已经尽量确保自己写的类是非 ...