redis面试题——项目中怎么用的

一:项目中缓存是如何使用的?

项目中使用缓存保存医疗机构信息数据,将对象进行序列化是将对象转换成二进制流,从而可以将这个二进制流存储到Redis中,读取Redis中存储的数据并反序列化对象

二:为什么要用缓存?直接用 mysql也可以啊

用缓存,主要是高性能、高并发。
高性能:内存的读写速度远快于磁盘的读写速度,后面数据不怎么变化,并且有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。
高并发:操作缓存能承受的请求是远远大于访问数据库的,redis单机承载并发量是mysql 单机的几十倍。

三:读线程和写线程流程

读线程在查询数据的过程是这样的:
(1)查询缓存,如果缓存中有值,则直接返回
(2)查询数据库
(3)把数据库的查询结果更新到缓存中
写线程:是先删除缓存在更新数据库,还是先更新数据库在删除缓存

四:什么情况下会出现数据库和缓存不一致的问题?

  1. 在非并发的场景中:
    因为缓存的操作和数据库的操作是存在一定的时间差的,而且这两个操作是没办法保证原子性的,有可能一个操作成功,一个操作失败。所以,这必然会存在不一致的情况。
  2. 在并发的场景中:
    (1)如果两个线程,同时进行先写数据库,后更新缓存的操作,就可能会出现不一致
    在这里插入图片描述
    (2)如果两个线程,同时进行先更新缓存,后写数据库的操作,也可能会出现不一致
    在这里插入图片描述
    (3)读写并发,假如一个读线程,在读缓存的时候没查到值,他就会去数据库中查询,但是如果查询到结果之后,更新缓存之前,数据库被更新了,但是这个读线程是完全不知道的,那么缓存会重新用一个”旧值”覆盖掉。
    在这里插入图片描述

五:如何解决Redis和数据库的一致性问题?

  1. 优先考虑删除缓存而不是更新缓存,我们放到缓存中的数据,可能是一个大的JSON串,更新缓存需要从缓存中取出数据,把他进行反序列化之后,把他修改掉,然后再序列化,最后再更新到缓存中。更新缓存相比较直接删除缓存复杂。如果是删除缓存的话,在写写并发的情况下,缓存中的数据都是要被清除,所以就不会出现数据不一致的问题。
  2. 先写数据库,后删除缓存,如果第二步失败了,会导致数据库中的数据已经更新,但是缓存还是旧数据,导致数据不一致。
  3. 先删除缓存后写数据库,那么第二步的失败是可以接受的,不会有脏数据,只需要重试就好了。但是先删除缓存后写数据库的这种方式,会无形中放大”读写并发"导致的数据不一致的问题。
    最终解决办法:建议考虑延迟双删的策略,就是说在先删除缓存,再更新数据库,然后过个几秒再删一把缓存,避免因为并发出现脏数据。

六:延时双删的细节问题

  1. 写线程更新数据库之后休眠时间(写线程 sleep的时间需要大于读线程读取数据再写入缓存的时间)
  2. 第二次删除同步删除,吞吐量降低怎么办,第二次删除缓存使用异步删除在这里插入图片描述

七:为什么需要延迟双删,两次删除的原因是什么?

所谓延迟双删,其实是:1、先删除缓存 2、更新数据库 3、删除缓存
第一次删除缓存的原因:为了避免两个操作无法作为一个原子操作而导致的不一致问题,我们选择先删除缓存,再更新数据库。
第二次删除缓存的原因:第一步先把缓存给清了,缓存中的数据被读线程写进去脏数据,那么就需要写线程第二次删除了

八:先更新数据库,再删除缓存方案优化

先操作数据库,然后数据库操作完,发一个异步消息出来。由一个监听者在接到消息之后,异步把缓存中的数据删除掉。或者借助数据库的binlog,订阅到数据库变更之后,异步的清除缓存。这两种方式的延时通常在毫秒级别,一般用于可接受秒级延迟的业务场景中。

九:删除缓存相比更新缓存的缺点?

删除缓存后,下一次查询无法命中缓存,需要查询一下数据库。在某种程度上可能会导致缓存击穿,也就是刚好缓存被删除之后,同一个Key有大量的请求过来,大量请求访问到数据库。但是,通过加锁的方式是可以解决缓存击穿的问题。

/*** 加强补充,避免突然key失效了,打爆mysql,做一下预防,尽量不出现击穿的情况* @param id* @return*/
public User findUserById2(Long id){User user = null;String key = CACHE_KEY_USER + id;// 1.先从redis里面查询,如果有直接返回结果,如果没有再去查询mysql// 第一次查询redis,加锁前user = (User) redisTemplate.opsForValue().get(key);if (user == null){// 2.对于高QPS的优化,进来就先加锁,保证一个请求操作,让外面的redis等待一下,避免击穿mysqlsynchronized (UserServiceImpl.class){// 第二次查询redis,加锁后user = (User) redisTemplate.opsForValue().get(key);// 3. 二次查redis还是null,可以去查mysql了(mysql默认有数据)if (user == null) {//4 查询mysql拿数据(mysql默认有数据)user = userMapper.selectById(id);if (user == null) {return null;} else {// 5. mysql里面有数据的,需要回写redis,完成数据一致性的同步工作redisTemplate.opsForValue().setIfAbsent(key, user, 7L, TimeUnit.DAYS);}}}}return user;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640273.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker学习第一步:基于Linux安装docker

要求Linux下的CentOS 7.0 以上的版本 01、安装docker版本仓库 1、设置仓库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2、稳定仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 02、安装及使用…

每日OJ题_其它背包问题④_力扣96. 不同的二叉搜索树(卡特兰数)

目录 力扣96. 不同的二叉搜索树 解析代码 力扣96. 不同的二叉搜索树 96. 不同的二叉搜索树 难度 中等 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1&#xff1…

GitOps 和 DevOps 有什么区别?

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

IP地址定位:揭秘精准定位的技术与应用

在数字化时代,IP地址已成为连接互联网世界的关键标识之一。但是,很多人对于IP地址的精准定位能力存在疑虑。本文将深入探讨IP地址定位的技术原理以及其在实际应用中的精确度。 IP地址查询:IP数据云 - 免费IP地址查询 - 全球IP地址定位平台 …

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址…

Linux--uboot移植(二)

修改uboot以匹配开发板的方式有两种,一种是在NXP原厂开发板i.MX 6ULL EVK的文件上进行修改,另一种仿造NXP的开发板文件,添加自己的开发板文件。 为了能更多的了解uboot,我们使用代码改动较大的第二种方式进行uboot的移植。 在修…

Python环境找不到解决方法

Python环境找不到 打开设置:Ctrl Alt S 添加Local Interpreter... 打开System Interpreter,找到本地安装的Python.exe路径,然后一路点OK Trust Project 如果打开工程时,出现如下对话框,请勾选 Trust projects in ...&…

MyBatis 框架学习(I)

MyBatis 框架学习(I) 文章目录 MyBatis 框架学习(I)1. 介绍2. 准备&测试3. MyBatis 注解基础操作3.1 日志输出3.2 Insert 操作3.3 Delete 操作3.4 Update 操作3.5 Select 操作 总结 1. 介绍 之前我们学习过利用JDBC操作数据库进行项目开发,但我们发现它操作起来…

ubuntu快捷更pip源

py安装: apt-get install python3-pip终端输入: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

跨语言大模型最新综述

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

基于docker搭建瀚高数据库HighGo6.0.1【图文】

基于docker搭建瀚高数据库HighGo6.0.1 拉取镜像启动验证进入容器 登录数据库查看数据库加密方式修改加密方式为sm3进入数据库修改密码重启容器 数据库验证数据库密码到期参考 docker部署 https://blog.csdn.net/weixin_44385419/article/details/127738868 拉取镜像 docker p…

Ubuntu-18.04本地化部署Rustdesk服务器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…