最代码官方的gravatar头像
最代码官方2017-09-30 10:24:15
java web开发中数据一致性的问题

在java web开发中,数据存储介质有如下几种

  1. 数据库(rdms,nosql)
  2. 缓存系统(redis,memcached,ehcache)
  3. java内部数据结构(map,list)
  4. 文件存储(fastdfs)

所以如果同一数据在这几种介质中同时存在的话就需要同时更新保持一致,否则有一个没更新,某一个业务拿错误的数据去做操作自然会引发一系列数据错误问题。

最代码在开发的过程中,遇到过这类的问题,总结分享下给牛牛。

出错描述:

1.某个用户登录状态下,管理员在后台修改了他的级别,更新了对应mysql中的数据,但是没有更新session中用户数据

2.该登录用户下载其他用户代码时被扣牛币,但是因为session中的用户级别是老数据,此时save用户到mysql就导致了用户级别出错

解决方案:

方案1

通过拦截器每次在请求前将session中的user数据从mysql中load到然后将session的user指向mysql的user数据,保证session登录用户的数据是和mysql的用户一致

相关代码片段

java web开发中数据一致性的问题

方案2

session中只保存登录用户id,在需要获取登录用户的数据时,得到该用户id再从mysql中load  user,保证session数据和mysql一致

相关代码片段

登录成功后

session.setAttribute(GlobalConstants.SESSION_LOGIN_USER_ID, userId);

需要登录用户信息的时候

Long userId=session.getAttribute(GlobalConstants.SESSION_LOGIN_USER_ID);
User user=userService.findById(userId);

其他web开发中数据一致性的情况大同小异,希望能抛砖引玉给牛牛们的开发带来帮助


打赏

已有3人打赏

最代码客服的gravatar头像最不屑一顾是相思的gravatar头像kaka的gravatar头像

分享到:

最近浏览
微微上翘 LV232月24日
太阳月亮星星星星星星
Shemar LV112017年12月27日
月亮月亮星星星星星星
851405506 LV72017年12月12日
月亮星星星星星星
HTZone LV12017年12月12日
星星
哈根达斯思密达 LV32017年12月5日
星星星星星星
leizeonban LV82017年11月27日
月亮月亮
醉带蚂 LV32017年11月25日
星星星星星星
奋青员 LV122017年11月20日
月亮月亮月亮
东北人 LV112017年11月16日
月亮月亮星星星星星星
zk25796 LV112017年11月10日
月亮月亮星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友