统计数据持久化
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 。