在java web开发中,数据存储介质有如下几种数据库(rdms,nosql)
缓存系统(redis,memcached,ehcache)
java内部数据结构(map,list)
文件存储(fastdfs)
所以如果同一数据在这几种介质中同时存在的话就需要同时更新保持一致,否则有一个没更新,某一个业务拿错误的数据去做操作自然会引发一系列数据错误问题。
最代码在开发的过程中,遇到过这类的问题,总结分享下给牛牛。
出错描述:
1.某个用户登录状态下,管理员在后台修改了他的级别,更新了对应mysql中的数据,但是没有更新session中用户数据
2.该登录用户下载其他用户代码时被扣牛币,但是因为session中的用户级别是老数据,此时save用户到mysql就导致了用户级别出错
解决方案:
方案1
通过拦截器每次在请求前将session中的user数据从mysql中load到然后将session的user指向mysql的user数据,保证session登录用户的数据是和mysql的用户一致
相关代码片段
方案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开发中数据一致性的情况大同小异,希望能抛砖引玉给牛牛们的开发带来帮助