类似于V2EX的铜币余额显示功能,这个余额既有可能因用户主动操作而减少(如发帖、回帖、感谢),也有可能被动增加(如被回复、被感谢),为了让每一个页面显示的余额正确无误,难道是每次都从数据库中取吗?

2013-02-27 10:55:54 +08:00
 qiayue
因为我的表中,余额是用户表的其中一个字段,我之前的做法是用户登录的时候取出来放session里,然后主动操作的时候既更新数据库中的余额,也更新session里的。

但是被动增加的时候就很麻烦了,那是后端的操作,没法更新到对应的余额被增加的用户的session里。

第一次遇到这种情况的处理,求问大家有什么好方案?
2879 次点击
所在节点    问与答
17 条回复
qiayue
2013-02-27 11:13:07 +08:00
@Livid V2EX是怎么处理的呢?
希望其他朋友知道的也帮我一下,谢谢了。
Sunyanzi
2013-02-27 11:47:12 +08:00
我不太明白 LZ 的意思 ...

在我看来这不过就是一个触发器而已 ...

任何主动操作的步骤是从 session 获取用户 id 根据 id 执行修改 credit ...

被动操作的话 ... 比如被感谢 ... 根据帖子找到发帖人 id 根据 id 执行修改 credit ...

帖子被回复同理 ... 根据回帖找到楼主 id 根据 id 执行修改 credit ...

这种一目了然的问题你有什么不明白的 ..?
coolicer
2013-02-27 11:53:57 +08:00
@Sunyanzi 我不做开发我都懂了
qiayue
2013-02-27 11:58:55 +08:00
@Sunyanzi 被动操作的,更新到数据库,我知道。
我的疑问是session里的余额如何同步更新?

举个栗子,我现在被感谢了,数据库里我的铜币增加了10,假如页面上的余额每次页面刷新都从数据库里边取,那没有任何问题。
我是想能不能减少查询次数,把余额存在session里,这样我多次刷新页面,就不需要去多次查询数据库了。
iloveyou
2013-02-27 12:23:48 +08:00
session放余额干嘛 又不是购物车
sohoer
2013-02-27 12:28:00 +08:00
可以用一个余额缓存,而不是存入session,
iloveyou
2013-02-27 12:28:30 +08:00
用memcache redis
qiayue
2013-02-27 12:56:35 +08:00
@iloveyou
@sohoer
就像V2EX的页面,不管点开哪个页面,都能看到自己的余额,如果不存在session里,就需要每个页面都查询一次数据库。
但是我又不知道还有其他什么办法可以缓存数据,所以就用session了。
siw
2013-02-27 13:06:57 +08:00
@qiayue
session就放在memcached啊
rqrq
2013-02-27 13:10:52 +08:00
每次都读数据库也不会怎样,性能损耗相当小,数据库没有想象中那么脆弱。
当然也可以把用户信息存到memcache或者nosql数据库,用userid对应。

为什么要用session啊?下面的问题解决起来都得不偿失:
发帖/回帖提交的时候session已过期;
想要立即禁止某个在线用户的账号;
Cadina
2013-02-27 13:22:02 +08:00
放session里是否有利取决于你的session存储的设计。
不管是否缓存在session里,余额信息是必须用数据库做持久化的,session只是一个缓存。
qiayue
2013-02-27 13:27:38 +08:00
感谢以上各位,我知道了,不纠结了,每次直接取是最方便的。
sohoer
2013-02-27 13:36:44 +08:00
你用什么开发,java使用一个静态变量做数据缓存很简单的
mkeith
2013-02-27 13:40:53 +08:00
其实楼主纠结的是 缓存的更新问题
sohoer
2013-02-27 13:45:41 +08:00
比如用一个全局的静态MAP<userid, money>,不管是主动还是被动修改都去更新MAP的值(如果存在)。
查看余额的时候从MAP中读,如果存在返回,不存在从数据库读。
chuangbo
2013-02-27 15:00:14 +08:00
function 更新余额()
....更新数据库
....将当前值写入缓存

function 读取余额()
....如果有缓存:
.......返回缓存
....如果没有缓存:
.......读取数据库,并写入缓存
.......返回缓存
treo
2013-02-27 15:39:58 +08:00
查看帖子列表和查看帖子的sql查询耗时比查询余额的耗时多得多吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/61439

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX