技术php+mysql, 缓存用到redis,用户消费是流水的,在消费记录表里,,但是现在有个需求是,,用户每累积消费500元,送一个礼物(记录在另外一张表),网站用户量比较大。。。。求一个比较好的实现方式,只要讲大致的流程和设计即可,谢谢了!
我觉得直接给用户表加字段不是很好的选择,用户表操作太频繁了。不知道你们的数据库读写分离没,都用上redis了,建个关系表就好了啊
--直接新建一个用户消费关系表,字段包括用户id,今日消费,是否已送礼
crontab个把小时跑一次,达到要求送礼生成礼品订单,更新关系表。这个表每日凌晨可日志后清空。我没做过大系统,但是我觉得你们都分布缓存了,负载应该没多大压力了才是。
把操作拆分:
给用户表加一个字段,总消费额,每次用户消费把钱加上去,存起来;同时判断是否增加到新的500阶梯(这个很简单,对500整除,判断是否增加1)。
旧数据可以把整个库弄到本地,慢慢跑出结果。
看你的评论,似乎要看新增加的这500消费额到底买了什么东西?同理,每次用户消费直接统计,旧数据按照时间戳慢慢跑。
题主用到了 redis ,那我提供一个 redis 的思路吧。
用 sorted set 来存储用户的消费记录:
key 采用用户 id 和语义化的字符串,比如 user:$uid:purchase:logs
。
score 存储用户消费记录的时间戳。
member 存储用户每次消费的数额。
消费总额也可以记录在 redis 里面,比如 user:$uid:purchase:total
。
发放礼物次数保存在 user:$uid:purchase:recieved_gifts
。
做个脚本在服务器不繁忙的时候把消费记录从 MySQL 数据库 migrate 到 redis 。
放在 redis 里,可以对用户的消费记录做实时查询,比直接从数据库里读取要快。
用户每一笔消费的事务结束之后,就可以通过 total
和 recieved_gifts
来计算是否满足发放礼物的条件。
暂时先想到这么多,抛块小砖,希望引出更大的玉。
如有疑问,欢迎讨论。