(1)对于预读和全表扫描加载进来的一堆缓存页
?
在优化后的LRU链表方案下,这一堆缓存页会放在LRU链表的冷数据区域的头部,此时,冷数据区域里的数据跟热数据区域里频繁访问的缓存页是没关系的。
(2)预读机制和全表扫描加载进来的缓存页,能进热数据区域的嘛?
基于全表扫描进来冷数据区域的缓存页,通常一秒内操作就结束了,这些缓存页是不会进入热数据区域的,除非一秒后还被人访问了,此时他们会被判定为可能会被频繁访问的缓存页,
然后移动到热数据区域的链表头部。
(3)如果缓存页不够了,需要淘汰一些缓存页,会先淘汰哪些?
直接找到LRU链表中冷数据区域的尾部的缓存页,他们肯定是之前被加载进来的,而且加载进来1秒后都没人访问过,此时直接淘汰冷数据区域尾部的缓存页,刷入磁盘。
问题1:
对于这种缓存中同时包含冷热数据的场景,如果在Redis中放了很多业务中的缓存数据,其中也是冷热数据都有的,此时会有什么问题?是否可以使用冷热分离的思想来优化重构?
解答:
常见的一个场景就是电商系统里的商品缓存数据,假设有一亿个商品,然后只要查询商品的时候发现商品不在缓存里,就给他放到缓存,这么做必然导致大量的不经常访问的商品被放到
Redis缓存里。
所以在设计缓存机制的时候,可以考虑使用热数据的缓存预加载,也就是说每天统计出哪些商品被访问的次数最多,然后晚上时候系统启动一个定时任务,把热门商品的数据,预加载到
Redis里,那么第二天对热门商品的访问就自然会优先走Redis缓存了。
问题2:
数据库在设计的时候,加入了缓存,为什么还在用数据库的时候,加入redis缓存?
解答:
因为数据库的缓存还不够快,数据库的缓存机制还需要经常从磁盘读取数据到缓存页里。Redis时纯内存的,不会涉及到跟磁盘交互,性能和并发力上是数据库的10倍以上。
知识点:
淘汰冷数据时,需要将flush链表和lru链表对比,如果缓存页在flush链表中就刷新到磁盘,如果不在直接执行删除操作。