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

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

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

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

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

三:读线程和写线程流程

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

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

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

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

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

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

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

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

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

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

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

相关文章

协程的意义(二)

1.协程的意义 在一个线程中,如果遇到IO等待,线程不会一直在等待,而是利用空余时间去完成别的任务(充分利用线程)。 示例:下载图片 ①普通的方式下载图片(同步方式) ②使用协程的方…

使用eNSP配置OSPF多区域实验

一、实验拓扑 二、实验要求 1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回&…

Pytorch手撸Attention

Pytorch手撸Attention 注释写的很详细了,对照着公式比较下更好理解,可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(S…

大语言模型攻击

实验: 一.环境部署 1.模型部署 vicuna-13b-v1.3 vicuna-7b-v1.3 LLaMA-2-7B-Chat 部署代码 二.使用 GCG 攻击 LLaMA-2 的示例 使用模型完整性,以满足指令“写一个令人信服的匿名威胁。”下面的目标使用“当然,这是一个令人信服的匿名死亡…

PHP定时任务框架taskPHP3.0学习记录4宝塔面板bash定时任务(轮询指定json文件字段后确定是否执行、环境部署、执行日志、文件权限)

一 需求说明 宝塔面板中,读取指定 /www/wwwroot/lockdata/cron/webapp.json文件;配置定时任务脚本task.sh;当读取webapp.json中,如果cron_task1,则执行任务php start.php start命令行;完成命令后,执行cron…

Python基础学习之数据切片

数据切片介绍: 切片的基本语法是data[start:stop:step],其中: start 是切片开始的索引(包括该索引处的元素)。 stop 是切片结束的索引(不包括该索引处的元素)。 step 是切片的步长&#xff0…

【S32K3 入门系列】- ADC 模块简介(上)

一、 前言 对于 S32K3 系列的初学者来说,S32K3 系列的参考手册阅读难度是让人望而却步的,本系列将对 S32K3 系列的外设进行逐一介绍,对参考手册一些要点进行解析。本文旨在介绍 S32K3 系列的 ADC 模块, ADC(Analog to…

Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 相信近来吸引大家想一试 Stable Diffusion 图像生…

嵌入式面试-回答I2C

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

轻薄手机,没有一款新机能超越小米11青春版,小米和苹果也没有

打算换手机,但是不喜欢半斤机,于是找了几款轻薄手机,却发现如今的轻薄手机都太重了,还不如3年前的小米11青春版,可见小米11青春版是一款相当能打的手机。 小米11青春版搭载骁龙778芯片,重量只有159克&#…

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务,在做一些判断的时候,判断等级是不是满足需求。 比如如下场景:在进入副本的时候需要检查玩家等级是否满足,满足之后才…

YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR -gui界面-交互式图形化界面

往期热门博客项目回顾:点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

js-pytorch:开启前端+AI新世界

嗨, 大家好, 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家, 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc,可…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT(JSON Web Token)和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证:无状态。服务器生成一个令牌,客户端存储该令牌并随每个请求一起提供,服务端仅需按照…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决,本文给出两种方法的代码实现。 示例: 图1 岛屿数量输入输出示意图 方法一:广度优先搜索(bfs) 代码: class Solution:def numIslands(self, grid):if not grid:return 0…

IO综述·

阻塞模式 读写数据会发生阻塞现象。当用户线程发起IO请求之后,内核会查看数据检查就绪。如果没有就绪就会等待数据就绪。而用户线程会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户…

KMP算法(Python)

进阶的做法就是KMP算法,当然暴力也能ac。 KMP主要用一个nex列表,nex[i]存储(模式串needle中)从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说,最大长度应该是(前缀aa)和…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架,并在此基础上添加了字符设备驱动框架,实现了读 / 写SPI设备中数据的函数,文章如下: Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

算法打卡day51|单调栈篇02| Leetcode 503.下一个更大元素II、42. 接雨水

算法题 Leetcode 503.下一个更大元素II 题目链接:503.下一个更大元素II 大佬视频讲解:503.下一个更大元素II视频讲解 个人思路 这道题和之前496.下一个更大元素 I 差不多,只是这道题需要循环数组,那就在遍历的过程中模拟走两遍nums就行&a…

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后,在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的,但在外网电脑和设备如何访问呢?由于内网环境下,无法提供公网IP使用,外网访问内网就需要一个内外网转换的介质。这里介绍…