资讯专栏INFORMATION COLUMN

略谈服务端缓存设计

liuyix / 2751人阅读

摘要:另载于大略谈一下,各位轻拍哦服务端性能优化,除了重构,最常用的手段就是缓存。本地缓存是应用程序在同一内的缓存,通常是或。某台更新了一条数据,就通知缓存把这条更新或丢弃,确保其他能拿到最新结果。

另载于 http://www.qingjingjie.com/blogs/13

大略谈一下,各位轻拍哦!

服务端性能优化,除了重构,最常用的手段就是缓存。缓存主要分为本地缓存和分布式缓存两种。

根据我们每日千万次访问的经验来看,缓存不是必须的。优化充足的情况下,SQL平均耗时1ms。这是因为命中了索引,并且命中了MySQL缓冲池(内存中)。如果命中索引但不命中缓冲池,且查询数据量不大,磁盘并发量不高,则大约耗时10ms(磁盘寻道)。如果这些都不满足,耗时就大了。

所以首先要建设的是索引,一切供查询的字段能索引就索引。有的字段取值多样性很小,比如布尔值、枚举值,就不适合索引(就算命中索引也可能要全盘扫描),查询时要联合其他字段过滤下,才会快。Replication, Sharding也是好办法,能用就用上。

本地缓存是应用程序在同一JVM内的缓存,通常是ConcurrentHashMap或Guava Cache。优点是耗时低得忽略不计,缺点是占用本地内存、多机会冗余、数据不同步。当集群里每个App Server都有个缓存,会有很多数据是重复的,而且某台机器更新了一条数据,别的机器不知道啊,只能等缓存过期。

同步问题可以用消息队列来解决,一台有更新,广播消息给其他机器,准实时同步

Guava Cache有expire或refresh两种过期方式,expire是过期就丢弃,refresh是过期先留着旧值,取到新值再更新。expire会有点性能波动,为了响应性可以选择refresh方式。另外建议设个上限,量太多会影响GC的。

根据Jim Gray的经验数字,过期时间通常以5分钟为宜(主要还是看你业务哦)。

分布式缓存是Memcached/Couchbase, Redis这类,访问要经过网络,多少会有一点点开销。Memcached或Redis本身就要有集群,否则一旦扛不住并发,还不如数据库呢。某台App Server更新了一条数据,就通知缓存把这条更新或丢弃,确保其他Server能拿到最新结果。

查询操作要有超时设置。注意耗时,如果超过10ms就有点不好了。

缓存服务用来存复杂查询的结果倒是极合适的,这时候比数据库快得多。

缓存除了加快访问以外,也能提高负载能力。因为数据库连接是有限的资源——不支持NIO,每个连接同时只能服务一个线程,有多少连接就有多少并发。如果有慢查询占住了连接,系统性能会急剧下降!缓存就能减轻对数据库连接的依赖。

本地缓存和分布式缓存各有千秋,一般建议用一致性更高的分布式缓存,当性能需要极端调优时,使用本地缓存。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64671.html

相关文章

  • 缓存架构的理论分析

    摘要:但实际情况是缓存是大型网站的标配。以上分析告诉我们缓存架构要满足冷热分离的特征不满足,因为冷数据可能挤走热数据。另外,众所周知,缓存架构还要满足读写分离的特征也不满足,因为写操作会争抢读操作的资源。这种风格需要缓存系统的支持。 问题背景 略谈服务端缓存设计 一文说到缓存不是必须的,因为数据库本身就利用了内存。但实际情况是缓存是大型网站的标配。 虽然经验显示RDBMS最快时只需0~1ms...

    jeffrey_up 评论0 收藏0
  • 缓存架构的理论分析

    摘要:但实际情况是缓存是大型网站的标配。以上分析告诉我们缓存架构要满足冷热分离的特征不满足,因为冷数据可能挤走热数据。另外,众所周知,缓存架构还要满足读写分离的特征也不满足,因为写操作会争抢读操作的资源。这种风格需要缓存系统的支持。 问题背景 略谈服务端缓存设计 一文说到缓存不是必须的,因为数据库本身就利用了内存。但实际情况是缓存是大型网站的标配。 虽然经验显示RDBMS最快时只需0~1ms...

    APICloud 评论0 收藏0
  • 缓存架构的理论分析

    摘要:但实际情况是缓存是大型网站的标配。以上分析告诉我们缓存架构要满足冷热分离的特征不满足,因为冷数据可能挤走热数据。另外,众所周知,缓存架构还要满足读写分离的特征也不满足,因为写操作会争抢读操作的资源。这种风格需要缓存系统的支持。 问题背景 略谈服务端缓存设计 一文说到缓存不是必须的,因为数据库本身就利用了内存。但实际情况是缓存是大型网站的标配。 虽然经验显示RDBMS最快时只需0~1ms...

    Leck1e 评论0 收藏0
  • 缓存穿透、雪崩、热点与Redis

    摘要:关于缓存热点重建原文说到在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃,并给出互斥锁和永远不过期两种候选方案。即使绕过互斥锁,也不会产生什么不好的后果,因为更新缓存是一个幂等操作。 向大家推荐这篇文章——Redis架构之防雪崩设计:网站不宕机背后的兵法 (另外推荐我去年的短文作为餐前点心——略谈服务端缓存设计) 《Redis架构之防雪崩设计》这篇文章(下...

    oujie 评论0 收藏0

发表评论

0条评论

liuyix

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<