wittyResry / myIssue

My issue mark down^_^ 欢迎吐槽,讨论~~
https://github.com/wittyResry/myIssue/issues
The Unlicense
5 stars 1 forks source link

分布式缓存(distributed catch system) #85

Open wittyResry opened 6 years ago

wittyResry commented 6 years ago

引言

缓存思路,空间换时间。(空间换时间还在,数据查询索引、利用某种数据结构缓存数据 服务端三大法宝:MemCache+反向代理+分库分表,可见缓存的地位 缓存是为了解决查询扫描磁盘IO和页面访问速度的矛盾。

使用场景

数据的访问频率:频率高适合,低则不适合 数据的读写比例:比例高适合,低则不适合 数据一致性要求:一致性要求低适合,高则不适合

更新策略

  1. 方案一:
    数据写入-update->DB-update->Tair/Redis
    数据查询-->Tair/Redis-没有命中查询数据库->DB->写DB成功后再更新缓存
                     |                               |
                    hit                               |
                     V                               |
                   返回<------------------------------|
    • 思考:如2个线程同时先后执行更新操作,线程1更新数据库后,线程2也更新了数据库。然后都并发写缓存,但线程2先执行了更新缓存的操作,而线程1在执行更新缓存的时候就把线程2更新的数据给覆盖掉了,导致缓存脏掉。
    • 解决:有没有解决的方法呢?当然有的,就是讲数据写入的时候,写DB成功后,是将缓存失效掉,这样就不会出现缓存脏的情况。但要消耗一次用户查DB的损耗,新的方案如下:
      数据写入-update->DB-失效缓存->Tair/Redis
      数据查询-->Tair/Redis-没有命中查询数据库->DB->写DB成功后再更新缓存
                   |                               |
                  hit                               |
                   V                               |
                 返回<------------------------------|

缓存分类

根据规模和部署分类:分布式缓存、单机缓存、集群缓存 根据在软件系统中的位置分类:浏览器缓存、服务端缓存、网络中的缓存

用户体验和系统性能