统计数据持久化

1. 统计存储类的设计

"""
用户作品数量的统计类
属性
key redis的键
方法
get 获取数据
update 更新数据
"""
class UserArticleCountStorage:
    """用户作品数量的统计类 count : user : arts    zset   [{ value : 用户id, score:作品数}]"""
    key = 'count:user:arts'
    
    @classmethod
    def get(cls,user_id):
        pass

    @classmethod
    def update(cls, user_id):
        pass

2. 获取和增加数据 (重点)

class BaseCountStorage:
    @classmethod
    def get(cls, user_id):
        """
        获取统计数量
        :param user_id: 用户id
        :return: 统计数量
        """
        # 从redis中取出数据
        redis_slave = current_app.redis_slave  # type: StrictRedis
        try:
            count = redis_slave.zscore(cls.key, user_id)  # 如果有值,返回float类型, 没有返回None
        except RedisError as e:
            current_app.logger.error(e)
            raise e
        # 返回数据
        if count:
            return int(count)
        else:
            return 0

    @classmethod
    def update(cls, user_id, count=1):
        """
        更新统计数量
        :param user_id: 用户id
        :param count: 数量变化 如果要减少 count=-1
        """
        # 对redis数据进行更新
        redis_master = current_app.redis_master  # type: StrictRedis
        try:
            redis_master.zincrby(cls.key, user_id, count)
        except RedisError as e:  # 不处理, 结果mysql和redis的数据不一致
            current_app.logger.error(e)

Redis Zscore 命令返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

Redis Zincrby命令对有序集合中指定成员的分数加上增量 increment
可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。

3. 统计基类的设计

原文地址:https://www.cnblogs.com/oklizz/p/11431569.html