V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qiayue
V2EX  ›  问与答

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

  •  
  •   qiayue · 2013-02-27 10:55:54 +08:00 · 2884 次点击
    这是一个创建于 4288 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为我的表中,余额是用户表的其中一个字段,我之前的做法是用户登录的时候取出来放session里,然后主动操作的时候既更新数据库中的余额,也更新session里的。

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

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

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

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

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

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

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

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

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

    function 读取余额()
    ....如果有缓存:
    .......返回缓存
    ....如果没有缓存:
    .......读取数据库,并写入缓存
    .......返回缓存
    treo
        17
    treo  
       2013-02-27 15:39:58 +08:00
    查看帖子列表和查看帖子的sql查询耗时比查询余额的耗时多得多吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1462 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:01 · PVG 01:01 · LAX 09:01 · JFK 12:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.