编程知识 cdmana.com

【11月10日】Redis 缓存系统常见问题及解决方案

缓存穿透

缓存穿透就是指当用户在 Redis 缓存系统查询一条数据时,而 MySQL 数据库和 Redis 缓存里却没有关于这条数据的任何记录。这条数据在 Redis 缓存中查询不到自然会向 MySQL 数据库请求获取数据,MySQL 数据库也获取不到数据,导致 Redis 缓存会一直查询 MySQL 数据库,这样会对 MySQL 数据库的访问造成很大的压力

缓存穿透


缓存穿透解决方案一: 缓存空对象

缓存空对象

缓存空对象是指用户请求查询 Redis 缓存和 MySQL 数据库中不存在的数据时,MySQL 数据库会返回一个空对象,并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

  • 优点

    使用缓存空对象机制原理和实现比较简单(代码维护容易)

  • 缺点

    使用缓存空对象长时间会导致 Redis 缓存中存在大量空对象,不仅会占用许多的内存空间,还会浪费许多资源(推荐设置缓存空对象过期时间)

    redisCache.put(Integer.toString(id),null,60); //过期时间为60s

缓存穿透缓存空对象解决方案


缓存穿透解决方案二: 布隆过滤器(推荐)

布隆过滤器

布隆过滤器是一种过滤器,它的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,会有小小的误判概率,只要参数设置合理,它的精确度可以控制的相对足够精确


解决方案

采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层数据库的查询压力

布隆过.........

版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4714994

Scroll to Top