当数据库成为瓶颈,比如高并发、读多写少等,我们首先想到的就是利用缓存来提升性能整个系统。虽然缓存可以大大提高整个系统的性能,但同时也引入了更多的复杂性。如果缓存处理不当,在某些场景下甚至会导致整个系统崩溃。这次我们要讲的是:缓存热点缓存热点缓存热点是指大部分甚至所有的业务请求都命中同一个缓存数据。虽然缓存本身的性能比较高,但是对于一些特别热的数据,如果大部分甚至所有的请求都命中同一个缓存数据,那么数据所在的缓存服务器的压力也会很大。例如,某电商闪购活动在短时间内吸引了数千万用户访问。解决方案缓存热点常见的解决方案有两种:多缓存副本和本地内存缓存。下面我们来详细了解一下这两种方式:复制多个缓存副本复制多个缓存副本就是将请求分发到多个缓存服务器上,减少缓存热点对单个缓存服务器的压力。以闪购活动为例。爆品数据可以生成100个缓存数据。缓存的数据是一样的,在缓存的key上加上数字来区分。每次读取缓存时,随机读取其中一个缓存。.在设计缓存副本时,有一个细节需要注意:不要为不同的缓存副本设置统一的过期时间,否则所有的缓存副本会同时生成和失效,造成雪崩效应缓存。正确的做法是设置一个过期时间范围,不同缓存副本的过期时间为指定范围内的随机值。本地内存缓存将热点数据缓存在客户端本地内存中,并设置过期时间。对于每一个读请求,它会先检查数据是否存在于本地缓存中,如果存在则直接返回,如果不存在则去分布式缓存服务器。与复制多个缓存副本相比,本地内存缓存完全“解放”了缓存服务器,不会给缓存服务器带来任何压力。但是,本地内存缓存也有其自身的缺点。如果更新了缓存服务器中的数据,没有及时更新本地内存缓存,就会造成数据不一致。因此本地内存缓存的过期时间需要设置的越短越好。热点缓存的发现在前面的讨论中,我们预设了知道哪些是热点缓存,但在大多数情况下,我们无法知道哪些是热点缓存。但是,我们可以通过以下方法及时发现热缓存:客户端统计。读取缓存时,加入数据统计逻辑。当读取次数达到一定阈值时,判断为热点缓存。统计在Proxy层进行。当读取缓存时有代理层时,可以在代理层加入数据统计的逻辑。使用缓存系统的内置工具。比如Redis性能分析工具redis-faina和redis-cli的hotkeys参数。小结缓存热点是指大部分甚至所有的业务请求都会命中同一个缓存数据。常用的方案有两种:复制多个缓存副本,并将每个副本的过期时间设置为指定范围内的随机值;本地内存缓存,设置缓存过期时间越短越好。最后谢谢大家的喜欢和关注,帅气又漂亮。
