1、概念
当client端对service端进行查询操作时,service端会根据key先查询缓存服务器,当缓存服务器不存在此key时,会进一步查询sql服务器。但通常查询sql服务器的时候相对查询缓存而言比较耗时。如果从client端发送的大量查询请求的key在缓存服务器中不存在,此时会进行大量的sql查询,会极大的增加sql服务器的压力,降低性能。此种现象称为缓存穿透。
2、解决方案
2.1、可以通过当client端的查询请求携带的key第一次在缓存服务器中不存在在,在sql数据库中也不存在时,此时在缓存服务器中存储此key,并将值设为null,同时设置一个此键值对的存活时间。如此,可避免大量达无效sql查询,提高服务器性能。
2.2、更近一步的方案,可在service端设置一个布隆过滤器,通过此过滤器判断,就可以知道查询该不该放行。此过滤器可以保证不存在的key一定返回正确结果,存在的key有一定概率返回错误结果。关于布隆过滤器的实现,简而言之,用的是双重hash,通过位图和多个hash函数计算多个hash值,并将计算出的hash值在位图的对应位置置为1,当一个key到达时,只需通过计算此key的所有hash值,并判断位图对应位置值是否为1,只要有一个位置为0,即说明此key不存在,如果位置位图对应位置全为1,并不能保证此key一定存在,可以通过设置hash函数的个数和位图的大小来控制失误率。通常失误率能控制到极小。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/271659.html