# my-eshop-cache **Repository Path**: pans_studio/my-eshop-cache ## Basic Information - **Project Name**: my-eshop-cache - **Description**: 儒猿架构班-实时性高的高性能库存读写服务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-09-23 - **Last Updated**: 2022-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##### 缓存不一致问题 ```java 先修改数据,再删除缓存,如果修改数据成功了,但是删除缓存失败了,那么就会导致缓存中是旧数据 解决思路:先删除缓存,再修改数据库,如果删除缓存成功了,修改数据库失败了,那么数据不会不一致, 因为读的时候缓存没有,则回去读取数据库中的数据,然后再更新到缓存中 ``` ```java 比较复杂的情况,先删除了缓存,然后去查询数据库,此时还没修改, 此时一个请求过来,去读缓存,此时缓存未空,查到了修改前的就数据,放到了缓存中,此时发生了数据不一致 在高并发的情况下,会出现这种问题,如果并发量很低,每天访问量就1万次,那么很少的情况下,会出现刚才描述的那种 不一致的场景,但是问题是,如果每天是上亿的流量,每秒读并发是几万,每秒只要有数据更新的请求,就可能会出现上述的数据库+缓存不一致的问题。 ``` ###### 数据的更新与读取操作 进行异步串行化 ```java 更新数据的时候,根据数据的唯一码标识,将操作路由之后,发送到一个jvm内部的队列中 读取数据的时候,首先如果=在缓存中读取到了数据,就直接返回了。 如果没有读取到数据,那么就会 把刷新缓存的操作,通过路由也发送到一个jvm内部的队列中去。 然后一个队列对应一个工作线程,每个工作线程串行的拿到对应的擦着,然后一条一条的执行, 这样带来的好处就是,此时如果一个读请求过滤,读到了空的缓存,那么可以将缓存更新的请求发送 到队列中,此时会在队列中积压,然后同步完成等待缓存的更新完成。 ```