十堰城市建设网站,睢县做网站,张雪峰谈广告学专业,企业网站建设兴田德润地址今天突然想起来这个#xff0c;就是那么突然#xff0c;上次项目上用过redis#xff0c;是一个消息已读未读的问题#xff0c;由于消息挺多的#xff0c;如果每次都去查数据库#xff0c;那岂不是裂开#xff0c;所以就存缓存了。 现在想想#xff0c;还是不大行#… 今天突然想起来这个就是那么突然上次项目上用过redis是一个消息已读未读的问题由于消息挺多的如果每次都去查数据库那岂不是裂开所以就存缓存了。 现在想想还是不大行我看表里已经十万数据了而且都不怎么用如果火力全开可能一天就得1w的数据。 所以我认为更具不同的区域进行分表然后在存入redis通过不同的区域key。(没有什么事情是加一层解决不了的如果有就再加一层) 回归正题哈扯了一会淡反正也就我自己复习的时候看看博客无所吊谓
既然是同步redis和数据库以下以修改数据为例子就有两个情况
到底是先修改数据库还是先改redis 我认为不管是先更新哪一个都会出现问题(没加锁前提下) 先更新数据库会出现数据库刚更新完还没更新redis就有访问导致取redis的旧数据。 先更新redis会出现redis更新成功一个线程在更新数据库之前去到了redis拿去用了可是更新数据库时报错了这个数据就是错数据玩球了 最好的方法还是先改数据库然后删掉缓存之所以删掉缓存而不是修改缓存是因为有些缓存不会经常用所以用到它的时候去除存入缓存。
所以直接加锁性能降低一些保证数据安全性只要我的两个操作没有完就不能访问。
还可以用版本号乐观锁来解决redis和数据库两边的版本号是否相同一旦不相同就不读取还在更新redis缓存。
另外一种就是利用消息队列来解决也就是成了异步更新一旦更新数据库成功就向消息队列中发送一条更新消息消费者拿到后进行更新redis如果失败就重试。