一文搞懂JVM架构:跳槽面试大厂被拒

正文

在实际的工作项目中, 缓存成为高并发、高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征:

  • 在分层系统中处于内存/CPU具有访问性能良好,
  • 缓存数据饱和,有良好的数据淘汰机制

由于Redis 天然就具有这两个特征,Redis基于内存操作的,且其具有完善的数据淘汰机制,十分适合作为缓存组件。

其中,基于内存操作,容量可以为32-96GB,且操作时间平均为100ns,操作效率高。而且数据淘汰机制众多,在Redis 4.0 后就有8种了促使Redis作为缓存可以适用很多场景。

那Redis缓存为什么需要数据淘汰机制呢?有哪8种数据淘汰机制呢?

数据淘汰机制

Redis缓存基于内存实现的,则其缓存其容量是有限的,当出现缓存被写满的情况,那么这时Redis该如何处理呢?

Redis对于缓存被写满的情况,Redis就需要缓存数据淘汰机制,通过一定淘汰规则将一些数据刷选出来删除,让缓存服务可再使用。那么Redis使用哪些淘汰策略进行刷选删除数据?

在Redis 4.0 之后,Redis 缓存淘汰策略6+2种,包括分成三大类:

  • 不淘汰数据

    • noeviction ,不进行数据淘汰,当缓存被写满后,Redis不提供服务直接返回错误。
  • 在设置过期时间的键值对中,

    • volatile-random ,在设置过期时间的键值对中随机删除
    • volatile-ttl ,在设置过期时间的键值对,基于过期时间的先后进行删除,越早过期的越先被删除。
    • volatile-lru , 基于LRU(Least Recently Used) 算法筛选设置了过期时间的键值对, 最近最少使用的原则来筛选数据
    • volatile-lfu ,使用 LFU( Least Frequently Used ) 算法选择设置了过期时间的键值对, 使用频率最少的键值对,来筛选数据。
  • 在所有的键值对中,

    • allkeys-random, 从所有键值对中随机选择并删除数据
    • allkeys-lru, 使用 LRU 算法在所有数据中进行筛选
    • allkeys-lfu, 使用 LFU 算法在所有数据中进行筛选

Note: LRU( 最近最少使用,Least Recently Used)算法, LRU维护一个双向链表 ,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据。

LRU 算法在实际实现时,需要用链表管理所有的缓存数据,这会带来额外的空间开销。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。

其中,LRU和LFU 基于Redis的对象结构redisObject的lru和refcount属性实现的:

typedef struct redisObject {unsigned type:4;unsigned encoding:4;// 对象最后一次被访问的时间unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency// 引用计数                        * and most significant 16 bits access time). */int refcount;void *ptr;
} robj;

Redis的LRU会使用redisObject的lru记录最近一次被访问的时间,随机选取参数maxmemory-samples 配置的数量作为候选集合,在其中选择 lru 属性值最小的数据淘汰出去。

在实际项目中,那么该如何选择数据淘汰机制呢?

  • 优先选择 allkeys-lru算法,将最近最常访问的数据留在缓存中,提升应用的访问性能。
  • 有顶置数据使用 volatile-lru算法 ,顶置数据不设置缓存过期时间,其他数据设置过期时间,基于LRU 规则进行筛选 。

在理解了Redis缓存淘汰机制后,来看看Redis作为缓存其有多少种模式呢?

Redis缓存模式

Redis缓存模式基于是否接收写请求,可以分成只读缓存和读写缓存:

只读缓存:只处理读操作,所有的更新操作都在数据库中,这样数据不会有丢失的风险。

  • Cache Aside模式

读写缓存,读写操作都在缓存中执行,出现宕机故障,会导致数据丢失。缓存回写数据到数据库有分成两种同步和异步:

  • 同步:访问性能偏低,其更加侧重于保证数据可靠性

    • Read-Throug模式
    • Write-Through模式
  • 异步:有数据丢失风险,其侧重于提供低延迟访问

    • Write-Behind模式

Cache Aside模式

查询数据先从缓存读取数据,如果缓存中不存在,则再到数据库中读取数据,获取到数据之后更新到缓存Cache中,但更新数据操作,会先去更新数据库种的数据,然后将缓存种的数据失效。

而且Cache Aside模式会存在并发风险:执行读操作未命中缓存,然后查询数据库中取数据,数据已经查询到还没放入缓存,同时一个更新写操作让缓存失效,然后读操作再把查询到数据加载缓存,导致缓存的脏数据。

Read/Write-Throug模式

查询数据和更新数据都直接访问缓存服务,缓存服务同步方式地将数据更新到数据库。出现脏数据的概率较低,但是就强依赖缓存,对缓存服务的稳定性有较大要求,但同步更新会导致其性能不好。

Write Behind模式

查询数据和更新数据都直接访问缓存服务,但缓存服务使用异步方式地将数据更新到数据库(通过异步任务) 速度快,效率会非常高,但是数据的一致性比较差,还可能会有数据的丢失情况,实现逻辑也较为复杂。

在实际项目开发中根据实际的业务场景需求来进行选择缓存模式。那了解上述后,我们的应用中为什么需要使用到redis缓存呢?

在应用使用Redis缓存可以提高系统性能和并发,主要体现在

  • 高性能:基于内存查询,KV结构,简单逻辑运算
  • 高并发: Mysql 每秒只能支持2000左右的请求,Redis轻松每秒1W以上。让80%以上查询走缓存,20%以下查询走数据库,能让系统吞吐量有很大的提高

虽然使用Redis缓存可以大大提升系统的性能,但是使用了缓存,会出现一些问题,比如,缓存与数据库双向不一致、缓存雪崩等,对于出现的这些问题该怎么解决呢?

使用缓存常见的问题

使用了缓存,会出现一些问题,主要体现在:

  • 缓存与数据库双写不一致
  • 缓存雪崩: Redis 缓存无法处理大量的应用请求,转移到数据库层导致数据库层的压力激增;
  • 缓存穿透:访问数据不存在在Redis缓存中和数据库中,导致大量访问穿透缓存直接转移到数据库导致数据库层的压力激增;
  • 缓存击穿:缓存无法处理高频热点数据,导致直接高频访问数据库导致数据库层的压力激增;

缓存与数据库数据不一致

只读缓存(Cache Aside模式)

对于只读缓存(Cache Aside模式), 读操作都发生在缓存中,数据不一致只会发生在删改操作上(新增操作不会,因为新增只会在数据库处理),当发生删改操作时,缓存将数据中标志为无效和更新数据库 。因此在更新数据库和删除缓存值的过程中,无论这两个操作的执行顺序谁先谁后,只要有一个操作失败了就会出现数据不一致的情况。

面试准备+复习资料分享:

为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦,有需要的可以来找我获取哈

获取方式:点击蓝色字体即可免费获取

秋招|美团java一面二面HR面面经,分享攒攒人品

出来一部分哦,有需要的可以来找我获取哈

获取方式:点击蓝色字体即可免费获取

[外链图片转存中…(img-bzuPKX53-1624225454343)]

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

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

相关文章

全局变量_Python函数中的全局变量与局部变量

# a,b变量是全局变量,在整个py文件中都可以访问a 11b 12# 定义一个函数def first():# 这个变量是函数内部定义的变量,属于局部变量,只能在函数中使用c "Hello"# 大括号{} 是format()函数的用法,格式化print("c {}".format(c))# 如果局部变量定义的名称…

一文详解:字节面试官必问的Mysql锁机制

一面 1 自我介绍和项目 2 Java的内存分区 3 Java对象的回收方式,回收算法。 4 CMS和G1了解么,CMS解决什么问题,说一下回收的过程。 5 CMS回收停顿了几次,为什么要停顿两次。 6 Java栈什么时候会发生内存溢出,Jav…

install npm 到某个文件下执行_你可能不知道的 npm 依赖管理那些事

点击上方蓝字关注我们npm 是 Node.js 默认的、以 JavaScript 编写的包管理工具,如今,它已经成为世界上最大的包管理工具,是每个前端开发者必备的工具。不知你是否遇到过下面问题:哎?我本地明明是好的,线上的…

万字总结!腾讯、字节跳动面经已发

二、常见的并发问题 1、脏读 一个事务读取了另一个事务未提交的数据 2、不可重复读 一个事务对同一数据的读取结果前后不一致。两次读取中间被其他事务修改了 3、幻读 幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读…

ncbi查找目的基因序列_NCBI大搜索之目的基因寻踪

NCBI大搜索之目的基因寻踪最近经常碰到查找目的基因的问题,那今天就讲一下如何利用NCBI数据库查找目的基因!NCBI(National Center For Biotechnology Information),美国国家生物技术信息中心,分子生物学,生物化学及遗传学领域常用…

万字长文!2020-2021京东Java面试真题解析

我整理的spring学习笔记: 像spring这种知识点我们不能盲目的学习,首先我们得有一套学习路线,我总结了一套spring的学习思维导图,今天通过我整理的Spring学习路线.xmind给大家分析spring需要掌握的一些核心知识点。 spring的特点&…

echarts label固定位置_ECharts+百度地图网络拓扑应用

前一篇谈及到了ECharts整合HT for Web的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图、ECharts和HT for Web三者结合起来也做一个类似空气质量报告的报表拓扑图应用,于是有了下面的Demo&#xff1a…

三年Java开发,你连基础的JVM运行时内存布局都忘了

面:为什么要使用双亲委派机制去加载类? 答:避免多份同样字节码的加载,浪费内存。 类的加载方式 隐式加载:new显示加载:loadClass、forName等 类的装载过程如下图: 面:loadClass和…

vue实现可编辑的文字_苹果还自带文字转语音,只要一键按下便可实现,今天分享给大家...

如果想将文字转成语音,那大家平时都是怎么操作?下面小编就为大家介绍手机,电脑上都可以使用的方法,让我们一起来看看吧!一、手机端操作1、苹果手机其实苹果手机就自带了文字转语音功能,只要打开手机&#x…

三面美团Java岗,面试竟然被这31道Java基础题难倒了

01 分布式限流:NginxZooKeeper 1.1 分布式限流之Nginx 请解释一下什么是 Nginx? 请列举 x Nginx 的一些特性。 请列举 x Nginx 和 和 Apache 之间的不同点 请解释 x Nginx 如何处理 P HTTP 请求。 在 x Nginx 中,如何使用未定义的服务器名称来阻止…

海龟绘图小动物_震惊!被塑料绳勒成两半的海龟

海洋,其实离人类很近,我们在追逐沙滩和日落,享受美味的海鲜的时候,可曾想到我们平时的一些很随意的行为,会给一些海洋生物带来无法恢复的伤害,甚至夺取它们的生命。或许人们的冷漠无知尚未得到惩罚&#xf…

上海大厂Java面试经历:初步理解类加载运行机制和类加载过程

volatile相关经典面试题 谈谈volatile的特性volatile的内存语义说说并发编程的3大特性什么是内存可见性,什么是指令重排序?volatile是如何解决java并发中可见性的问题volatile如何防止指令重排volatile可以解决原子性嘛?为什么?v…

mysql数据库优化面试

前言 现在Java程序员面试都是因为没有丰富的工作经验和自己过硬的技术,所有都不知道一般互联网应该会问什么技术问题,加上自己可能去面试的时候没有准备的太充分,一面试刚跟面试官扯几个面试题就不知道自己在哪里了,被怼的体无完…

mysql数据库备份方式,跳槽大厂必看!

NO1:说说zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点…

mysql数据库安装教程32位,看这一篇就够了!

字节跳动 ⾯试前⼀⾯⼆⾯⼩结 ⾯试前 头条的⾯试是三家⾥最专业的,每次⾯试前有专⻔的HR和你约时间,确定OK后再进⾏⾯试。每次都是通过视频⾯试,因为都是之前都是电话⾯或现场⾯,所以视频⾯试还是有点不⾃然。也有⼈觉得视频⾯试…

java cron工具类_Java工具类之:包装类

我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工具类,你会发现它能很大…

mysql数据库安装,真香!

Spring Security观后感——手绘思维脑(供参考) 手绘的思维导图,是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的,相当于是一个知识的总结与梳理,我将其分为“核心组件”与“工作原理/认证流程”。 Spring Se…

mysql数据库实用教程答案

前言 数据库相关的面试题早已成为了一线互联网大厂面试的家常菜,如果你对数据库不太熟悉,我劝你不要轻易面试大厂。那么,为什么数据库成了大厂面试的家常菜呢?主要原因当然还是海量数据。 无论对于刚入行的小白还是有几年Java开…

在idea中新建的text文件_开发属于自己的第一款 IDEA 插件!

往期热门文章:1、《往期精选优秀博文都在这里了!》2、又一个程序员跑路删库跑路被抓了,导致服务器瘫痪 36 个小时!3、恕我直言,有了这款 IDEA 插件,你可能只需要写 30% 的代码。。。4、Java8 的 Stream API 的确牛X&am…

mysql数据库开发的36条军规

前言 一般的小项目,比如几百人左右访问的项目,访问量几万的项目,如果想用缓存,单机实例完全够用。小黄图就是用的阿里云256MB配置的Redis缓存,日几千的访问量是妥妥够用的了。Redis号称可以支撑10wqps,当然…