缓存

为了节省用户的时间,提高网站的响应,现在所有的大型项目无一例外的都使用了缓存技术。缓存技术在一定程度上提高网站的响应时间,但与此同时,使用缓存也有一些成本需要考虑。例如:

1,数据不一致:缓存层和数据层有时间窗口不一致,和更新策略有关。
2,代码维护成本:多了一层缓存逻辑。
3,运维成本:例如 Redis Cluster

使用场景

1,降低后端负载

  • 对高消耗的 SQL:join结果集/分组统计结果缓存

2,加速请求响应

  • 利用Redis/Memcache 优化 IO 响应时间

3,大量写合并批量写

  • 如计数器先 Redis 累加再批量写 DB

缓存的更新策略

  1. LRU/LFU/FIFO算法剔除:例如 maxmemory-policy
  2. 超时剔除:例如 expire
  3. 主动更新:开发控制生命周期

三种策略的优缺点

缓存穿透问题

缓存穿透问题就是大量请求不命中。具体情况如下图:

产生的原因

  1. 业务代码自身问题
  2. 恶意攻击、爬虫等等

解决办法

  1. 缓存空对象

    这个方法会造成两个问题:

    1. 需要更多的键
    2. 缓存层和存储层数据“短期”不一致
  2. 布隆过滤器拦截

无底洞问题

问题描述:

Facebook的工作人员反应2010年已达到3000个memcached节点,储存数千G的缓存。他们发现一个问题–memcached的连接效率下降了,于是添加memcached节点,添加完之后,并没有好转。称为“无底洞”现象。

产生原因

键值数据库或者缓存系统,由于通常采用hash函数将key映射到对应的实例,造成key的分布与业务无关,但是由于数据量、访问量的需求,需要使用分布式后(无论是客户端一致性哈性、redis-cluster、codis),批量操作比如批量获取多个key(例如redis的mget操作),通常需要从不同实例获取key值,相比于单机批量操作只涉及到一次网络操作,分布式批量操作会涉及到多次网络io。

优化方法

  1. 命令本身原因:例如慢查询 keys、hgetall bigkey
  2. 减少网络通信次数
  3. 降低接入成本:例如客户端长连接/连接池、NIO

参考资料

[1] 缓存系列文章–无底洞问题

说点什么

avatar
  Subscribe  
提醒

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部