java面试(缓存Redis)

为什么使用缓存

高性能,高可用,高并发。

什么是缓存击穿?缓存穿透?缓存雪崩?

击穿:redis中没有查询到数据。解决:设置热点数据永不过期。加载DB时防止并发。
穿透:redis和mysql中都没有查询到数据。解决:参数校验,将没有数据的情况也存入redis中,引入布隆过滤器
雪崩:redis中大量数据同时过期。解决:设置不同的过期时间。
布隆过滤器:

  1. 如果判断一个元素不在集合中则一定不在
  2. 如果判断一个元素在集合中则存在一定误判率
  3. 布隆过滤器只能加数据不能减数据

对数据进行修改时,如何保证Redis与数据库的数据一致?

  • 先删缓存,后写数据库。存在脏读。
    解决:
    1.先把缓存修改为特殊值(-999),客户端读到特殊值延时查询。
    2.延时双删,先删缓存,再写数据库,再删缓存。
  • 先写数据库,再删缓存。存在缓存删除失败,数据不一致。
    解决:
    1.缓存设置过期时间
    2.引入MQ,保证原子操作。mq设置两个消费者同时删除缓存和db,删除失败消息还在,MQ重试机制会删除。
    通用解决:
    将热点数据设置为永不过期,但再value中写入逻辑过期,另起线程扫描key,对于逻辑上过期的缓存进行删除。
    总结:始终只能保证一定时间内的最终一致性。

如何设计一个分布式锁?并优化

分布式锁:所有进程都能访问到的地方,设置一个锁资源,让进程来竞争。(数据库,zookeeper,Redis)
Redis实现分布式锁:
SETNX key value:当key不存在时,就将key设置为value。并返回1.如果key存在,就返回0.
EXPIRE key locktime:设置key的有效时长。
DEL key:删除
GETSET key value:先GET,在SET,先返回key对应的值,如果没有,将key设置成value。
1.最简单的分布式锁:SETNX 加锁,DEL解锁。
问题1:锁获取失败后不回主动解锁,这个锁就被锁死了。
解决1:给锁设置时长。
问题2:SETNX和EXPIRE不是原子性的,获取锁进程没到EXPIRE指令就挂了。
解决2:将锁的内容设置为过期时间(客户端时间+过期时长),SETNX获取失败时,拿这个时间和当前时间比对,如果过期,就先删除锁,再重新上锁。
问题3:在高并发场景下,会产生多个进程同时拿到锁的情况。
解决3:SETNX失败后,获取锁上时间戳,然后用GETSET,将自己的过期时间更新上去,并获取旧值,和之前获取的时间戳不一致,就表示这个锁被其他线程占用。

public boolean tryLock(RedisConnection conn) {long nowTIme = System.currentTimeMills();long expireTime = nowTime + 1000;if(conn.SETNX("myKey", "1") == 1) {conn.EXPIRE("myKey", 1000);return true;} else {long oldVal = conn.get("myTime");if(oldVal != null && oldVal < nowTime) {long currnetVal = conn.GETSET("myKey", expireTime);  //CAS,如果和之前获取的锁不一样,就失败if(oldVal == currentVal) {conn.SET("mykey", 1000);return true;}return false;}return false;}
}

注:上面优化根本问题是SETNX和EXPIRE指令无法保证原子性。Redis2.6提供了直接执行Lua脚本方式。通过Lua脚本保证原子性。Redission就是在此基础上实现公平锁,非公平锁等。

Redis如何设置Key的过期时间?

redis设置过期时间:1.EXPIRE 2.SETEX
实现原理:
1.定期删除:每隔一段时间执行一次删除过期key的操作。
2.懒汉式删除:当使用get,getset等指令获取数据时,判断key是否过期,过期先把key删除,在执行后面操作。
定期删除会遍历每个databasae(默认16个),检查当前库中指定个数的key(默认20个)。随机抽查这些key,过期就删除。

海量数据下,如何快速查找一条记录?

1.使用布隆过滤器,快速过滤不存在的记录。使用redis的bitmap结构来实现布隆过滤器。
2.在Redis中建立数据缓存。以普通字符串形式存储(userId->UserInfo)。以hash来存储(userId key -> Username field)。以整个hash来存储所有的数据。UserInfo -> field用userId,value就用user.json。一个hash最多支持2^32-1个键值对。
缓存击穿:对不存在的数据也建立key。
缓存过期:将热点数据设置成永不过期,定期重建缓存,使用分布式锁重建缓存。
3.查询优化:redis按槽位分配数据,自己实现槽位激素那,找到记录应分配的机器,直接去目标机器上去找。

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

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

相关文章

Java知识点之单例模式

1、单例模式&#xff08;Binary Search&#xff09; 单例模式确保某个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。在计算机系统中&#xff0c;线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资…

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题&#xff0c;那就是账号权重低&#xff0c;播放量在个位数徘徊&#xff0c;其实都是因为还没起号&#xff01;那么具体如何起号呢&#xff1f;下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

Day46| 139 单词拆分

目录 139 单词拆分 139 单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordset(wordDict.begin(), wordDict.end());//dp数组来判断i长度时能不能被字典里面的单词所组成vector<bool&g…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

深入理解JAVA异常(自定义异常)

目录 异常的概念与体系结构 异常的概念&#xff1a; 异常的体系结构&#xff1a; 异常的分类&#xff1a; 异常的处理 防御式编程 LBYL: EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 面试题&#xff1a; 异常的处理流程 异常处…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

sqllab第十三关通关笔记

知识点&#xff1a; 登录框处常见的语句(一般都是查询语句) where usernamewhere username""where usernam()where username("")错误注入知识回顾这里使用错误注入 通过admin admin登录发现没有任何回显信息&#xff1b;但是有成功登录的提示 通过bp抓包…

CSPM有必要换吗?目前持有PMP?

从事项目管理岗位的&#xff0c;尤其是国企工作的&#xff0c;建议换一个&#xff0c;但是有进一步发展打算的&#xff0c;可以直接考CSPM-3级更好&#xff0c;PMP持证增持的是CSPM-2级证书&#xff0c;相对来说是个初级证书&#xff0c;CSPM-3级含金量更高。 一、什么是 CSPM…

美众议院通过强制要求 TikTok 剥离的法案; 首个 AI 软件工程师上线丨 RTE 开发者日报 Vol.165

开发者朋友们大家好&#xff1a; 这里是**「RTE 开发者日报」**&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 …

交换机/路由器的存储介质-华为

交换机/路由器的存储介质-华为 本文主要介绍网络设备的存储介质组成。 SDRAM&#xff08;同步动态随机存取内存&#xff09; 系统运行内存&#xff0c;相当于电脑的内存&#xff1b; NVRAM&#xff08;Non-Volatile Random Access Memory&#xff0c;非易失性随机访问存储器…

【C++】vector的底层剖析以及模拟实现

一、vector的简单认识 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c…

高等数学相关知识点整理汇总

说明&#xff1a;由于工作原因可能更新不及时&#xff0c;内容逐步完善中… 一、空间解析几何与向量代数 二、多元函数的微分学 三、重积分 四、曲线积分与曲面积分 五、常微分方程 六、无穷级数

WPF中的ListBox样式(没被选择有点模糊,选中清晰,鼠标进入变大,移出变小)

<Style TargetType"ListBoxItem"><!-- 没有被选中就是有点模糊 --><Setter Property"Opacity" Value"0.5" /><Setter Property"MaxHeight" Value"75" /><Style.Triggers><!-- 触发器设…

基于HarmonyOS ArkTS中秋国庆祝福程序、以代码之名,写阖家团圆祝福

中秋、国庆双节将至&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于阖家团圆的祝福。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Image、Swiper等组件来实现节日祝福轮播程序。 规则要求具体要求如下&#xff1a; 1、根据主题&#xff0c;用…

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率&#xff0c;又能获得很好的性能。 这两年 Flutter 技术热度持续提高&#xff0c;整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0&#xff0c;现在已经支持移动端、Web端和PC端&#xff0c;通过Flutter 开发的…

sql注入重学

sql基本操作 基本查询语句 union (必须得是前面的列与后面的列相同才可以查询&#xff09; 看第二局uses表中的列有3列&#xff0c;而emails中的列只有两列&#xff0c;所有无法成功查询 这就相当于我们再加了一列 group by &#xff08;分组&#xff09; 相当于将其分为10列…

python-0004-django站点

站点 django自带站点用来操作增删改查 国际化&#xff08;汉化&#xff09; 项目setting.py # LANGUAGE_CODE en-us LANGUAGE_CODE zh-Hans # TIME_ZONE UTC TIME_ZONE Asia/Shanghai USE_I18N True USE_L10N True USE_TZ True创建模型 在子应用的models.py中创建&…

力扣大厂热门面试算法题 24-26

24. 两两交换链表中的节点&#xff0c;25. K 个一组翻转链表&#xff0c;26. 删除有序数组中的重复项&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.14 可通过leetcode所有测试用例。 目录 24. 两两交换链表中的节点 解题思路…

硬盘新建分区时选4096扇区 是4K对齐吗?

环境&#xff1a; 固态硬盘 问题描述&#xff1a; 硬盘新建分区时或者格式化选4096扇区 是4K对齐吗 解决方案&#xff1a; 1.选择4096扇区大小&#xff0c;实际上是进行了4K对齐。在传统硬盘格式化时&#xff0c;通常会选择以4096字节&#xff08;4K&#xff09;为单位的扇…

html--钢琴

代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>html钢琴</title> <script src"js/js.js"></script> <link href"…