java源代码保存在扩展名为,看完跪了

正文

在实际的工作项目中, 缓存成为高并发、高性能架构的关键组件 ,那么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模式), 读操作都发生在缓存中,数据不一致只会发生在删改操作上(新增操作不会,因为新增只会在数据库处理),当发生删改操作时,缓存将数据中标志为无效和更新数据库 。因此在更新数据库和删除缓存值的过程中,无论这两个操作的执行顺序谁先谁后,只要有一个操作失败了就会出现数据不一致的情况。

Spring全套教学资料

Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

资料领取方式:点击这里前往蓝色传送门

目录:

部分内容:

Spring源码

  • 第一部分 Spring 概述
  • 第二部分 核心思想
  • 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
  • 第四部分 Spring IOC 高级应用
    基础特性
    高级特性
  • 第五部分 Spring IOC源码深度剖析
    设计优雅
    设计模式
    注意:原则、方法和技巧
  • 第六部分 Spring AOP 应用
    声明事务控制
  • 第七部分 Spring AOP源码深度剖析
    必要的笔记、必要的图、通俗易懂的语言化解知识难点

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

  • SpringBoot入门
  • 配置文件
  • 日志
  • Web开发
  • Docker
  • SpringBoot与数据访问
  • 启动配置原理
  • 自定义starter

微服务架构:Spring Cloud Alibaba

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

  • 微服务架构介绍
  • Spring Cloud Alibaba介绍
  • 微服务环境搭建
  • 服务治理
  • 服务容错
  • 服务网关
  • 链路追踪
  • ZipKin集成及数据持久化
  • 消息驱动
  • 短信服务
  • Nacos Confifig—服务配置
  • Seata—分布式事务
  • Dubbo—rpc通信

Spring MVC

目录:

部分内容:

…(img-fZvUVvw6-1624780270225)]

[外链图片转存中…(img-q9kNYJVX-1624780270225)]

[外链图片转存中…(img-b7mAsXDg-1624780270226)]

部分内容:

[外链图片转存中…(img-HNjUgWlq-1624780270226)]

[外链图片转存中…(img-hrT4FAFv-1624780270227)]

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

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

相关文章

java源码文件丢恢复需要多少钱,上岸蚂蚁金服!

京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 Autowired的实现原理 Bean的默认作用范围是什么?其他的作用范围? 索引是什么概念有什么作用&am…

php 静态方法特点,浅析php静态方法与非静态方法的用法区别

在php编程中,static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”…

java特性多态,90%的人看完都说好

01.第一份资料是图解网络 根据读者阅读偏好不同,共出了两个版本风格的 PDF,分别是亮白版本和暗黑版本。 02.第二份资料是计算机的相关知识 看完能让你对计算机有一个基础的了解和入门,是培养你 内核 的基础,我们看下目录大纲 基…

php session 释放,php中删除Session和销毁Session的方法

删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。session_start();$_SESSION[name] jobs;unset($_SESSION[name]);echo $_SESSION[name]; //提示name不存在如果要删除所有的session,可以使用sessio…

java环境变量怎么配置,详解系列文章

Git是什么 在回忆Git是什么的话,我们先来复习这几个概念哈~ 什么是版本控制? 百度百科定义是酱紫的~ 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 那些年,…

php数据接口api安全,API接口数据安全之授权码sign

**API接口数据安全之授权码sign**>[success] 1. ASE加密方式加密~~~class Aes{private $key null;/***param String $key 密钥*return String*/public funciton __construct(){//配置文件中的asekey 服务端及客户端必须保持一致 且加密key必须为16 、32、64位$this->key…

java环境变量的配置与详解,这些知识你必须拿下

1.三重心智模型 先给大家科普一个概念,“三重心智模型”。 认知科学家斯坦诺维奇,将人的心智模式,分成了三个部分。 第一层是自主心智,自主心智是我们通过进化与内隐学习获得。比如,我们看到蛇就会害怕,情…

centos php安装redis扩展,Centos7编译安装redis、php安装phpredis扩展

解压 进入 make:# tar zxvf redis-4.0.9.tar.gz# cd redis-4.0.9/# make# cd src# make install为了方便管理,将Redis文件中的配置文件和常用命令移动到统一文件中:# mkdir –p /usr/local/redis/bin# mkdir –p /usr/local/redis/etc# cp /t…

java环境变量的配置步骤,实现原理分析

1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有。我只提几点: 写SQL:写SQL很常考察group by、内连接和外连接。手写代码:手写代码一般考单例、排序、线程、消费者生产者。我建议排序算法除了冒泡排序,…

php 方法参数传递,在PHP中将实例方法作为参数传递

我想创建一个Listener类class Listener {var $listeners array();public function add(callable $function) {$this->listeners[] $function;}public function fire() {foreach($this->listeners as $function) {call_user_func($function);}}}class Foo {public funct…

java环境安装包出现覆盖,请查收

正文 先问小伙伴们一个问题,登录难吗?“登录有什么难得?输入用户名和密码,后台检索出来,校验一下不就行了。”凡是这样回答的小伙伴,你明显就是产品思维,登录看似简单,用户名和密码…

java生成json字符串,威力加强版

策略 1——停止挖掘 Law of Holes 是说当自己进洞就应该停止挖掘。对于单体式应用不可管理时这是最佳建议。换句话说,应该停止让单体式应用继续变大,也就是说当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微…

MATLAB小波软硬阈值去噪代码,matlab编程小波变换进行图像去噪处理,包括各种软硬阈值的选取函数...

内容:matlab编程小波变换进行图像去噪处理,包括各种软硬阈值的选取函数,%小波阈值去噪clear allclc;fimread(graylena.bmp);fdouble(f);ssize(f);rimnoise2(gaussian,s(1),s(2),0,20);%填加高斯白噪声fnoisyfr;%对图像进行三层小波分解[c,s]w…

java生成二维码读取二维码,面试真题解析

拼多多一面 首先自我介绍 参加过哪些项目 并发编程三要素? 实现可见性的方法有哪些? 多线程的价值? 创建线程的三种方式的对比? 画出线程的状态流转图 常用的并发工具类有哪些? CyclicBarrier 和 CountDownLatch 的区…

iis 7.5 php 防止跨站,iis安全---防范XSS跨站式脚本攻击

iis安全---防范XSS跨站式脚本攻击网站要怎么防范常见的XSS跨站式脚本攻击呢,我们先从XSS跨站式脚本攻击的原理来说起。网站遭受XSS跨站式脚本攻击的基本原理1.本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:A给B发送…

Java春招实习面试经验汇总,面试篇

Part1 SpringIOC 学习Spring最重要的无非是Spring IOC以及Spring AOP,首先咱们把Spring IOC吃透,以下内容将截图展示。 Spring IOC主要学习内容分为以下7点: ①Spring框架 ②Spring lOC容器Bean对象实例化模拟实现 ③Spring IOC容器Bean对象…

Java最新大厂面试真题总结,瞬间高大上了!

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个…

php列表框怎么用,PHP+Mysql+jQuery查询和列表框选择操作实例讲解

这篇文章主要介绍了PHPMysqljQuery查询和列表框选择操作实现过程,需要的朋友可以参考下本文讲解如何通过ajax查询mysql数据,并将返回的数据显示在待选列表中,再通过选择最终将选项加入到已选区,可以用在许多后台管理系统中。本文列…

Java未来路在何方?图文详解!

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

matlab怎让3d旋转,如何在MATLAB中平滑旋转3D绘图?

我会说这是你正在绘制的大量积分导致经济放缓.一个选项是缩减采样..也可以使用较低级别的功能进行绘制(检查this related post以获得plot3 / scatter3 / line性能的比较).考虑以下针对速度优化的动画:[X Y Z] sphere(64);X X(:); Y Y(:); Z Z(:);%# set-up figu…