做网站与做app哪个容易,大公司需要seo是什么职业,做零售的国外网站,网站建设能给客户带来什么现在的web架构一般都用redis作为缓存层来减轻数据库的压力#xff0c;数据在此架构下的读取问题#xff0c;一般都是先判断redis缓存是否有数据#xff0c;如果有#xff0c;直接返回#xff0c;否则读取数据库的数据#xff0c;写入redis#xff0c;返回数据#xff0…现在的web架构一般都用redis作为缓存层来减轻数据库的压力数据在此架构下的读取问题一般都是先判断redis缓存是否有数据如果有直接返回否则读取数据库的数据写入redis返回数据这是大致的读取流程。那么为什么会出现redis和数据库不一致的问题呢?举个例子如果你的缓存里现在缓存了用户的年龄的数据每次用户访问的时候如果缓存里有这个数据直接返回那么如果用户更新了自己的年龄你的操作步骤是什么?先更新(删除)redis缓存再更新数据库先更新数据库再更新(删除)用户缓存上面两种不同的操作顺序不论哪种方法理论上如果两个步骤都成功了那没问题如果一个更新成功了另一个更新失败了那么就会导致数据库和缓存不一致的问题这就要求操作必须具备原子性不论谁先执行只要一个步骤出现错误就因该回滚谁都不能成功。更新缓存or删除缓存这里简单说下更新缓存可能要消耗更多的cpu资源所以建议直接删除缓存。举个例子缓存money100数据库money100现在要求money99下面讨论并发下两种策略可能带来的问题先删除缓存成功后更新数据库失败线程A删除缓存更新数据库money中还没更新完线程B过来发现缓存没有了去数据库读取读到的money100线程B将读到的money100写入缓存现在缓存中的money100线程A将数据库的money更新完成money99最终redis缓存的数据是100数据库是99适合原子性要求高的不适合高并发造成这个问题的原因就是线程A还没干完事情线程B就插进来了。解决这个问题的办法就是串行化让操作顺序执行不能交替进行。顺序应该是删除、更新、读取。先更新数据库再删除缓存线程A过来查数据缓存没有数据读取数据库money100线程B更新数据库money99并删除缓存线程A把读到的money100,写到缓存里最终redis缓存是100数据库是99适合高并发不适合原子性高的造成这个问题的原因就是第二步骤其实缓存并不存在删除是没有用的应该等到A把缓存写入之后再尝试删除缓存这时候建议再第二步骤一直尝试删除缓存知道删除成功。