redis的一个缓存问题,怎样才能做到设计最优?

huimeimei 发布于 2013/08/28 17:14
阅读 4K+
收藏 2
mysql的A库里有一个user表,B库里面有根据每个用户相对应的表,表名前缀为user_*,用于记录用户每一天的行为(比如发表文章数),星号为每个用户的id,有多少用户就有多少个user_*表。现在有个需求,查出所有用户在最近30天内有没有发表过文章。如果今天查询,那么最近30天是(2013-7-28,2013-8-28),明天查询,最近30天是(2013-7-29,2013-8-29)。有多少用户就要查询多少次数据库。做缓存的目的就是为了减少查询次数,由于以前的数据是不会变的,所以我缓存的是以前的数据。现在遇到一个问题,就是到底是缓存每一天发表过文章的用户数量还是缓存每个用户发表过文章的时间?大家有什么建议?还有就是使用redis的什么数据结构比较好,目前我是用集合。还有一个问题,怎样设计才能不用再去查数据库?
加载中
0
吐槽的达达仔
吐槽的达达仔

这,居然有这种设计!!

“有多少用户就有多少个user_*表。”
吐槽的达达仔
吐槽的达达仔
@李少宏 不行,一定得改!!你项目延期也得改。你可以建一个视图来调整数据库的接口。。但是这个不改,以后维护绝对是大坑!
huimeimei
huimeimei
回复 @吐槽的达达仔 : 刚才仔细研究了一下,确实可以设计成一个表,但现在项目已经基本完成了,想改也来不及。
吐槽的达达仔
吐槽的达达仔
@李少宏 表大有什么关系?我们这边一个表7000W的数据,还是这么弄的。。你定期把数据归档就好了
huimeimei
huimeimei
一年365天,一天1000个用户。这些表将会很大。要记录每个用户每天的操作,更难维护。
吐槽的达达仔
吐槽的达达仔
@李少宏 把用户的操作归一下类,然后用一个用户ID,加上日期,加上对应的操作类型,插入到不同的表里面。这样好管理多了。。
下一页
0
Dray
Dray
setex 一个字段,然后设置过期时间为30天不就可以了?
Dray
Dray
回复 @李少宏 : 为什么还要再查数据库。你都放在 redis 里面了。还查数据库做什么。 方法: 1. setex 存 last30days:user_id:page_id,过期时间设为30天 2. keys last30days:user_id:* 得到最近30天的文章列表 3. 打印出来
huimeimei
huimeimei
如果我几天没使用这个查询功能,3天后再查,这3天的数据不是又得重查,而且,有多少个用户我就得查多少次数据库!
Dray
Dray
回复 @李少宏 : 是你想多了嘛。这个场景就 setex 一个 user_post:user_id:post_id value 为文章发表时间,设置过期时间为1个月。然后都的时候 根据 user_post:user_id: 读取这一批的 string 个数,不就可以拿到文章个数了?
huimeimei
huimeimei
擦,如果真这么简单我就不提问了。
0
华兹格
华兹格
星号为每个用户的id,有多少用户就有多少个user_*表?? 这个设计怎么理解?是一个用户发帖统计表,还是每个用户都有这个表?
0
huimeimei
huimeimei

引用来自“hanzhankang”的答案

星号为每个用户的id,有多少用户就有多少个user_*表?? 这个设计怎么理解?是一个用户发帖统计表,还是每个用户都有这个表?
每个用户都拥有这个表
0
华兹格
华兹格
缓存此用户最后一次发表文章的时间
华兹格
华兹格
回复 @李少宏 : 你什么意思啊,我的思路有问题?
huimeimei
huimeimei
擦,article 与 1366992000之间有换行。
huimeimei
huimeimei
那张user_*表结构是这样的: time | article 1366992000 | 3 这个时间格式化后变是“2013-04-27”,article表示发表文章数量,只要那一天发表了文章,article就会增加。
0
fzxu_05
fzxu_05
真牛,一个用户一个表,那1000w用户就1000w张表了
fzxu_05
fzxu_05
回复 @李少宏 : 啥项目连用户数量都能控制
huimeimei
huimeimei
用户数量能预计是在1000以下的。
0
jiuyueshouyi
jiuyueshouyi

单单就这个场景而言,用最简单的string类型的数据结构就可以了,key为user_xxx,value可以自定义,为方便扩展,最好把目前能考虑到的信息都放进去,不单单是“有没有发表过文章”这样的信息了,自定义一个类型,然后做一下序列化存进去。

如果目前的效率瓶颈是在查询关系数据库上,那改成redis还是可以的,数据有更新的时候两边同步更新;如果打算抛弃mysql了,那做好redis定时备份就ok了

huimeimei
huimeimei
是的,目前瓶颈在mysql上。我已经把数据结构改成了hash,方便扩展。
0
甘薯
甘薯

用字符串,key为Use,数据可以做成jason串.jason解析应该比查询数据库快很多,结构可以根据需求,定义成若干字段和值,保存所有必要的信息,比如发贴时间,设置另外一个分级索引,保存用户发帖总数,每个月的帖数等等。更新数据库的同时更新nosql.

另外可以根据情况加一层本地cache.

说起来容易做起来难,摸索吧。

huimeimei
huimeimei
想过这样做,但这个功能是只有管理员才用得着。
0
阿里狼
阿里狼

每一个帖子做一个key-value,每一个用户有一个sorted set,用时间做权重,帖子的key做member,查几天之内的很方便

huimeimei
huimeimei
已经改成hash了
0
kuafoo
kuafoo
 这么多表怎么维护
返回顶部
顶部