示例#1
0
文件: logics.py 项目: nhnba/nhnba_one
def rewind_last_swipe(uid):
    '''反悔上一次滑动 (每天允许反悔 3 次,反悔的记录只能是五分钟之内的)'''
    now = datetime.datetime.now()

    # 检查今天是否已经反悔 3 次
    rewind_key = keys.REWIND_TIMES_K % (now.date(), uid)
    rewind_times = rds.get(rewind_key, 0)
    if rewind_times >= config.REWIND_TIMES:
        raise errors.RewindLimit

    # 找到最后一次的滑动
    # select * from swiped where uid=1001 order by stime desc limit 1;
    last_swipe = Swiped.objects.filter(uid=uid).latest('stime')

    # 检查最后一次滑动是否在 5 分钟内
    time_past = (now - last_swipe.stime).total_seconds()
    if time_past >= config.REWIND_TIMEOUT:
        raise errors.RewindTimeout

    with atomic():  # 将多次数据修改在事务中执行
        if last_swipe.stype in ['like', 'superlike']:
            # 如果之前匹配成了好友,则删除好友关系
            Friend.breakoff(uid, last_swipe.sid)

            # 如果上一次是超级喜欢,则从对方的优先推荐队列中删除自己的 UID
            if last_swipe.stype == 'superlike':
                rds.lrem(keys.FIRST_RCMD_Q % last_swipe.sid, 0, uid)

        # 删除最后一次的滑动
        last_swipe.delete()

        # 今日反悔次数加一
        rds.set(rewind_key, rewind_times + 1, 86460)  # 缓存过期时间为一天零60秒
示例#2
0
文件: logics.py 项目: PyOldboy/swiper
def rewind_last_swipe(uid):
    '''反悔上一次滑动 (每天允许反悔 3 次, 反悔的记录只能是五分钟之内的)'''
    now = datetime.datetime.now()

    # 检查今天是否已经反悔 3 次
    rewind_key = keys.REWIND_TIMES_K % (now.date(), uid)
    rewind_times = rds.get(rewind_key, 0)
    if rewind_times >= config.REWIND_TIMES:
        raise errors.RewindLimit

    # 找到最后一次滑动
    last_swipe = Swiped.objects.filter(uid=uid).latest('stime')

    # 检查最后一次滑动是否在 5 分钟之内
    time_past = (now - last_swipe.stime).total_seconds()
    if time_past >= config.REWIND_TIMEOUT:
        raise errors.RewindTimeout

    with atomic():  # 将多次数据修改在事务中执行
        if last_swipe.stype in ['like', 'superlike']:
            # 如果之前匹配成了好友,则删除好友关系
            Friend.breakoff(uid, last_swipe.sid)
            # 如果上一次是超级喜欢,则删除优先推荐队列中的数据
            if last_swipe.stype == 'superlike':
                rds.lrem(keys.FIRST_RCMD_Q % last_swipe.sid, 0, uid)

        # 撤销被滑动者改变的积分
        score = config.SWIPE_SCORE[last_swipe.stype]
        rds.zincrby(keys.HOT_RANK, -score, last_swipe.sid)

        # 删除最后一次的滑动
        last_swipe.delete()

        # 今日反悔次数加一
        rds.set(rewind_key, rewind_times + 1, 86460)  # 缓存过期时间为一天零60秒
示例#3
0
def rewind_last_slide(uid):
    '''返回上一次滑动(每天允许返回三次,返回的记录只能是五分钟以内的)'''
    now = datetime.datetime.now()
    # 检查今天是否已经反悔3次 ---> 适合缓存
    rewind_key = keys.REWIND_LIMIT_K % (now.date(), uid)  # now.date() 是日期
    rewind_limit = rds.get(rewind_key, 0)
    '''
        每日更新三次
        # 错误方式
        1.过期时间 
        2.定时任务 ---> 人数多了,异步任务太多处理不了 
        3.建立redis库 ---> 保存key,到时间清空,在清空的时候也会出现临界点问题
        # 正确方式
        将日期拼接在用户的key上面
        
        ※时间临界点:
            23:59:59.123 使用了2次反悔,现在要准备用第三次
            当用了之后时间变成 00:00:00.321了,此时变成了3
            用户一天都不能用返回了,这就是临界点可能出现的问题
    '''
    if rewind_limit >= config.REWIND_LIMIT:
        raise errors.RewindLimit

    # 找当最后一次的滑动
    # 对应的SQL语句 select * from slider where uid=1001 order by stime desc limit 1;
    last_slide = Slider.objects.filter(uid=uid).latest('stime')  # 不分对方和方向
    # latest() ---> 最新的(按照时间最新的),这个latest强调时间

    # 检查最后一次滑动是否在5分钟以内
    # (now - last_slide.stime)两个相减的值是datetime.timedelta(天,秒,毫秒),是一个特殊的对象
    # (now - last_slide.stime).seconds 忽略了天和毫秒,单位是秒
    # (now - last_slide.stime).total_seconds() 天秒毫秒全加起来,单位是秒
    time_past = (now - last_slide.stime).total_seconds()  # 已经过去的时间
    if time_past >= config.REWIND_TIMEOUT:
        raise errors.RewindTimeout

    with atomic():  # 将多次数据修改在事务中执行
        # 衍生的功能 +
        #          ↓
        # 1.如果之前匹配成了好友,则删除好友关系
        if last_slide.stype in ['like', 'superlike']:
            Friend.breakoff(uid, last_slide.sid)

            # 2.如果之前是超级喜欢,则找到对方的优先推荐队列把我的数据删除
            if last_slide.stype == 'superlike':
                rds.lrem(keys.FIRST_RCMD_Q % last_slide.sid, 0, uid)

        # 3.删除最后一次的滑动
        last_slide.delete()

        # 4.今日返回次数加一,缓存过期时间一天(86400秒),+ N秒 是为了避免时间临界点问题
        rds.set(rewind_key, rewind_limit + 1, 86400 + 1)