我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis缓存中有哪些问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis缓存中有哪些问题

这篇文章给大家分享的是有关Redis缓存中有哪些问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起 id 为-1 的数据或者特别大的不存在的数据。有可能是黑客利用漏洞攻击从而去压垮应用的数据库。

1. 常见解决方案

对于缓存穿透问题,常见的解决方案有以下三种:

  • 验证拦截:接口层进行校验,如鉴定用户权限,对 ID 之类的字段做基础的校验,如 id<=0 的字段直接拦截;

  • 缓存空数据:当数据库查询到的数据为空时,也将这条数据进行缓存,但缓存的有效性设置得要较短,以免影响正常数据的缓存;

Copypublic Student getStudentsByID(Long id) {// 从Redis中获取学生信息Student student = redisTemplate.opsForValue()    .get(String.valueOf(id));if (student != null) {    return student;}// 从数据库查询学生信息,并存入Redisstudent = studentDao.selectByStudentId(id);if (student != null) {    redisTemplate.opsForValue()        .set(String.valueOf(id), student, 60, TimeUnit.MINUTES);} else {    // 即使不存在,也将其存入缓存中    redisTemplate.opsForValue()        .set(String.valueOf(id), null, 60, TimeUnit.SECONDS);}return student;}

使用布隆过滤器:布隆过滤器是一种比较独特数据结构,有一定的误差。当它指定一个数据存在时,它不一定存在,但是当它指定一个数据不存在时,那么它一定是不存在的。

2. 布隆过滤器

布隆过滤器是一种比较特殊的数据结构,有点类似与 HashMap,在业务中我们可能会通过使用 HashMap 来判断一个值是否存在,它可以在 O(1)时间复杂度内返回结果,效率极高,但是受限于存储容量,如果可能需要去判断的值超过亿级别,那么 HashMap 所占的内存就很可观了。

而 BloomFilter 解决这个问题的方案很简单。首先用多个 bit 位去代替 HashMap 中的数组,这样的话储存空间就下来了,之后就是对 Key 进行多次哈希,将 Key 哈希后的值所对应的 bit 位置为 1。

当判断一个元素是否存在时,就去判断这个值哈希出来的比特位是否都为 1,如果都为 1,那么可能存在,也可能不存在(如下图 F)。但是如果有一个 bit 位不为 1,那么这个 Key 就肯定不存在。

Redis缓存中有哪些问题

注意:BloomFilter 并不支持删除操作,只支持添加操作。这一点很容易理解,因为你如果要删除数据,就得将对应的 bit 位置为 0,但是你这个 Key 对应的 bit 位可能其他的 Key 也对应着。

3. 缓存空数据与布隆过滤器的比较

上面对这两种方案都进行了简单的介绍,缓存空数据与布隆过滤器都能有效解决缓存穿透问题,但使用场景有着些许不同;

  • 当一些恶意攻击查询查询的 key 各不相同,而且数量巨多,此时缓存空数据不是一个好的解决方案。因为它需要存储所有的 Key,内存空间占用高。并且在这种情况下,很多 key 可能只用一次,所以存储下来没有意义。所以对于这种情况而言,使用布隆过滤器是个不错的选择;

  • 而对与空数据的 Key 数量有限、Key 重复请求效率较高的场景而言,可以选择缓存空数据的方案。

二、缓存击穿

缓存击穿是指当前热点数据存储到期时,多个线程同时并发访问热点数据。因为缓存刚过期,所有并发请求都会到数据库中查询数据。

解决方案

  • 将热点数据设置为永不过期;

  • 加互斥锁:互斥锁可以控制查询数据库的线程访问,但这种方案会导致系统的吞吐量下降,需要根据实际情况使用。

Copypublic String get(key) {    String value = redis.get(key);    if (value == null)     {        // 代表缓存值过期 // 设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能        load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {            // 代表设置成功            value = db.get(key);            redis.set(key, value, expire_secs);            redis.del(key_mutex);        }        else {            // 这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可            sleep(50);            get(key);            // 重试        }    }    else {        return value;    }}

三、缓存雪崩

缓存雪崩发生有几种情况,比如大量缓存集中在或者缓存同时在大范围中失效,出现了大量请求去访问数据库,从而导致 CPU 和内存过载,甚至停机。

一个简单的雪崩过程:

  1. Redis 集群产生了大面积故障;

  2. 缓存失败,此时仍有大量请求去访问 Redis 缓存服务器

  3. 在大量 Redis 请求失败后,这些请求将会去访问数据库;

  4. 由于应用的设计依赖于数据库和 Redis 服务,很快就会造成服务器集群的雪崩,最终导致整个系统的瘫痪。

解决方案

  • 【事前】高可用缓存:高可用缓存是防止出现整个缓存故障。即使个别节点,机器甚至机房都关闭,系统仍然可以提供服务,Redis 哨兵(Sentinel) 和 Redis 集群(Cluster) 都可以做到高可用;

  • 【事中】缓存降级(临时支持):当访问次数急剧增加导致服务出现问题时,我们如何确保服务仍然可用。在国内使用比较多的是 Hystrix,它通过熔断、降级、限流三个手段来降低雪崩发生后的损失。只要确保数据库不死,系统总可以响应请求,每年的春节 12306 我们不都是这么过来的吗?只要还可以响应起码还有抢到票的机会;

  • 【事后】Redis 备份和快速预热:Redis 数据备份和恢复、快速缓存预热。

感谢各位的阅读!关于“Redis缓存中有哪些问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis缓存中有哪些问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis缓存中有哪些问题

这篇文章给大家分享的是有关Redis缓存中有哪些问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起 id 为-1 的数据或者特别大的不
2023-06-20

redis缓存机制有哪些

redis缓存机制有内存存储、数据过期、缓存淘汰策略、数据操作原子性、持久化、发布订阅模型、事务处理、Lua脚本执行、分布式缓存以及监控和管理工具等。详细介绍:1、内存存储,Redis使用内存存储数据,这使得读取和写入操作非常快速,它将数据
redis缓存机制有哪些
2023-11-16

java中Redis的缓存有哪些应用方式

小编给大家分享一下java中Redis的缓存有哪些应用方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型分为:1、
2023-06-14

redis缓存哪些数据

redis 的缓存数据类型包括:字符串、哈希、列表、集合、有序集合、地理位置、流、hyperloglog、bitmap、模块化数据类型(例如 redisjson、redisgraph、redistimeseries)。Redis 缓存的数据
redis缓存哪些数据
2024-04-19

redis缓存机制的好处有哪些

1. 提高系统性能:Redis缓存可以将热点数据存储在内存中,减少了数据库的访问次数,从而提高系统的响应速度和吞吐量。2. 减轻数据库压力:通过使用Redis缓存,可以将一部分常用的数据存储在内存中,减少了对数据库的读写压力,从而提高了数据
2023-08-30

Redis缓存失效的原因有哪些

Redis缓存失效的原因有以下几个:过期时间到期:Redis缓存可以设置一个过期时间,当缓存的过期时间到期时,缓存就会失效。这个是最常见的缓存失效原因。手动删除:使用Redis的客户端命令手动删除了缓存数据,导致缓存失效。内存不足:当Red
2023-10-27

Java缓存架构设计常见问题有哪些

本篇内容主要讲解“Java缓存架构设计常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java缓存架构设计常见问题有哪些”吧!1 分层缓存架构设计2 缓存带来的复杂度问题常见的问题主
2023-06-02

redis缓存的更新方法有哪些

Redis缓存的更新方法有以下几种:1. 更新缓存数据:直接更新缓存中的数据,可以使用`SET`命令或者其他适合的命令来更新缓存中的数据。2. 删除缓存数据:如果需要更新缓存中的数据,可以先删除旧缓存数据,再插入新的数据。可以使用`DEL`
2023-08-23

redis缓存用到的场景有哪些

Redis缓存可以应用于以下场景:1. 页面缓存:将经常访问的页面内容存储在Redis缓存中,减少数据库的访问压力,提高页面加载速度。2. 数据库查询缓存:将数据库查询结果存储在Redis缓存中,当下次查询相同数据时,直接从缓存中获取,减少
2023-09-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录