Redis-1

Redis 理论部分

redis 速度快的原因

1、纯内存操作

2、单线程操作,避免了频繁的上下文切换和资源争用问题,多线程需要占用更多的 CPU 资源

3、采用了非阻塞 I/O 多路复用机制

4、提供了非常高效的数据结构,例如双向链表、压缩页表和跳跃表等,可以根据实际数据类型选择合理的数据编码

Redis 是基于内存的操作,CPU 一般不会是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络宽带。既然单线程容易实现,而且 CPU 不会成为瓶颈,那么采用单线程的方案。

注意:本质上 Redis 并不是单纯的单线程服务模型,一些辅助工作比如持久化刷盘、惰性删除等任务是由 BIO线程来完成的,这里说的单线程主要是说与客户端交互完成命令请求和回复的工作线程。重点:执行命令的核心模块是单线程的。新的命令并不会立即被执行,而是统一的放到了队列中,一条一条的执行。

单线程还有一个问题:就是对于每个命令的执行时间是有要求的,如果其中的某一个命令执行过长,会造成其他命令的阻塞,这对于 Redis 这种高性能的服务来说是致命的,记住 Redis 是面向快速执行场景的数据库

充当缓存的 Redis 和 Memcached

1、存储方式上:Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。

2、数据支持类型上:Memcache 对数据类型的支持简单,只支持简单 key-value,而 Redis 最基本都要支持五种数据类型。

3、使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4、值大小:Redis 可以达到 1GB,而 Memcache 只有 1MB。

Redis 缓存使用场景

1、降低后端负载

2、加速请求响应

3、大量写合并为批量写

Redis 缓存策略

1、LRU、LFU、FIFO

2、超时剔除

3、主动更新

内存淘汰策略:

1、volatile-lru 从已设置过期时间的数据集中挑选最近最少使⽤的数据淘汰

2、volatile-random 从已设置过期时间的数据集中任意选择数据淘汰

3、allkeys-lru 当内存不⾜以容纳新写⼊数据时,在键空间中,移除最近最少使⽤的 key,常用

4、allkeys-random 从数据集中任意选择数据淘汰

5、volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰

6、no-eviction 禁止驱逐数据,也就是说当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错 OOM。

4.0 版本后增加两种:

7、volatile-lfu 从已设置过期时间的数据集中挑选最不经常使⽤的数据淘汰

8、allkeys-lfu 当内存不⾜以容纳新写⼊数据时,在键空间中,移除最不经常使⽤的 key。

常见选择:

  • allkeys-lru 用于应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者不太清楚应用的缓存访问分布状况,可以选择 allkeys-lru 策略。

  • allkeys-random 应用对于缓存 key 的访问概率相等,则可以使用这个策略。

  • volatile-ttl 策略使得可以向 Redis 提示哪些 key 更适合被移除

Redis 删除策略:

redis 开辟了一个空间用来存放值的地址和其过期时间,删除策略是为了在内存和 cpu 之间找到一个平衡,过期数据通常是在 cpu 闲暇之余被删除的。

Redis 中的过期数据删除情况:redis 服务器当中有很多的操作需要被执行,执行会导致 CPU 的工作大大的增加,当内存的空间还足够时,已被删除的数据的内存空间并未直接释放,而是对客户端的指令先执行,redis 中的数据删除策略包括定时删除、惰性删除、定期删除。

内存占用CPU 占用特征
定时删除节约内存,无占用不分时段占用 CPU 资源,频度高时间换空间,适用于小内存,强 CPU
惰性删除内存占用严重延时执行,CPU 利用率高空间换时间,适用于大内存,弱 CPU
定期删除内存定期随机清理每秒花费固定的 CPU 资源维护内存随机抽查,重点抽查

定时删除是对 CPU 和内存消耗取得一个折中方案,通过每隔一段时间执行一次删除过期 key 的操作,并且通过限制删除操作执行的时长和频率来减少删除操作对 CPU 造成的影响;周期性轮询 redis 库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。一般在 redis 应用中会使用惰性删除和定期删除两种方式

Redis 缓存问题:

1、缓存穿透:大量请求缓存中数据库并不存在的数据。

解决方案:1、布隆过滤器。2、缓存空对象

2、缓存击穿:大量请求缓存中同时访问一个过期数据。

解决方案:1、设置 key 永不过期和随机时间失效。2、互斥锁使访问有序

3、缓存雪崩:大量请求缓存中大面积失效的缓存数据。

解决方案:

1、缓存数据设置随机的过期时间,防止同一时间大量数据集合失效。

2、集群,将数据分布在不同的缓存数据库中。

3、限流,通过加锁或队列来控制读数据库写缓存的线程数量

redis 编程客户端

1、Jedis 是 Redis 的 Java 实现客户端,提供了比较全面的 Redis 命令的支持。

  • 优点:提供了比较全面的 Redis 操作特性的 API;API 基本与 Redis 的指令一一对应,使用简单易理解。

  • 缺点:同步阻塞 IO、不支持异步、线程不安全

2、Lettuce 支持同步、异步通信的方式 API 调用,也支持响应式编程 API,包括发布/订阅消息、高可用性服务部署架构。Lettuce 高级 Redis 客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

  • 优点:线程安全;基于 Netty 框架的事件驱动的通信,可异步调用;适用于分布式缓存

  • 缺点:API 更抽象,学习使用成本高

使用 Jedis 和 lettuce 总结

1、调大连接池大小能够提高 jedis 的吞吐量,但是不能避免出现超时错误和长时间等待。jedis 连接方式最大连接数和最小、最大空闲连接数设置为一样有利于减少上下文切换时间,提升效率。

2、lettuce 调大连接池大小反而会影响性能,最佳个数=CPU 核数+1,lettuce 整体稳定性和性能优于 jedis 方式。

常见 value 的数据类型

在这里插入图片描述
在这里插入图片描述

典型工具类编程

@Slf4j
@Component
public class RedisUtil {@Autowiredprivate RedisTemplate redisTemplate;public boolean set(final String key, Object value){ //写入缓存boolean res=false;try{this.set(key,value,new Random().nextInt(60)+10); 1070 秒的随机数res=true;} catch (Exception e){log.debug("问题:"+e.getMessage()); }return res;}public boolean set(String key,Object value,int timeout){ 写入缓存设置时效时间boolean res=false;try{redisTemplate.opsForValue().set(key,value);redisTemplate.expire(key, Duration.ofSeconds(timeout));res=true;} catch (Exception e){log.debug("问题:"+e.getMessage()); }return res;}public Object get(String key){ //读取缓存Object res=null;try {res = redisTemplate.opsForValue().get(key);} catch (Exception e){log.debug("问题:"+e.getMessage()); }return res;}public void remove(String key){ //删除 key,也删除对应的 valueif(exists(key)) redisTemplate.delete(key);}public boolean exists(String key){// 判断缓存中是否有对应的 valuereturn redisTemplate.hasKey(key); }public long getExpire(String key) { //根据 key 获取过期时间,单位为秒return redisTemplate.getExpire(key, TimeUnit.SECONDS); }public boolean expire(String key, long time) { //指定缓存失效时间try {if (time > 0) redisTemplate.expire(key, time, TimeUnit.SECONDS);return true;} catch (Exception e) {log.debug("问题:"+e.getMessage());return false; }}public Set<String> keys(String keyPattern){ 获取指定对应 pattern 模板的所有 keyreturn redisTemplate.keys(keyPattern); }
}

Redis 序列化器

针对数据的序列化/反序列化提供了多种可选择策略 RedisSerializer

1、JdkSerializationRedisSerializer 用于 POJO 对象的存取场景,使用 JDK 本身序列化机制,将 pojo 类通过ObjectInputStream/ObjectOutputStream 进行序列化操作,最终 redis-server 中将存储字节序列。是目前最常用的序列化策略。

2、StringRedisSerializer用于Key和value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是 new String(bytes, charset)和 string.getBytes(charset)的直接封装,是最轻量级和高效的策略。

3、JacksonJsonRedisSerializer 是 jackson-json 工具提供的 javabean 与 json 之间的转换能力,可以将 pojo 实例序列化成 json 格式存储在 redis 中,也可以将 json 格式的数据转换成 pojo 实例。因为 jackson 工具在序列

化和反序列化时,需要明确指定 Class 类型,因此此策略封装起来稍微复杂。

缓存与数据库双写不一致

缓存可以提升性能、缓解数据库压力,但是使用缓存也会导致数据不一致性的问题。一般写数据操作使用缓存有三种经典的缓存模式 Cache-Aside Pattern、Read-Through/Write through 和 Write behind,这三种常见的更

新策略实际上都是保证数据的最终一致性的方法,可以总结为

1、先更新数据库再更新缓存,后续线程会读取旧数据

2、先删除缓存再新数据库,并发线程读取旧数据并写到缓存

3、先更新数据库再删除缓存,后续线程会读取旧数据

常见解决方案是延时双删,但是延时的时长不好控制

总结:

1、并发几率很小的数据,几乎不用考虑,加上缓存过期时间,缓存失效后查询主动更新

2、业务上是否能容忍一定时间的不一致,如能容忍的话,加上缓存过期时间;如果不能容忍缓存数据不一致,可以通过加分布式读写锁保证并发读写或写写的时候按顺序排好队,读读的时候相当于无锁。

3、可以用阿里开源的 canal 通过监听数据库的 binlog 日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度。

Cache-Aside Pattern 即旁路缓存模式,读操作:读的时候,先读缓存,缓存命中的话,直接返回数据;缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应。写操作:更新的时候,先更新

数据库,然后再删除缓存。

Read-Through/Write-Through 读写穿透模式中,读操作:从缓存读取数据,读到直接返回;如果读取不到的话,从数据库加载,写入缓存后,再返回响应。写操作:Write-Through 模式下,当发生写请求时,也是由缓

存抽象层完成数据源和缓存数据的更新Write behind 异步缓存,一般写入是同步更新缓存和数据,Write Behind 则是只更新缓存,不直接更新数据库,

通过批量异步的方式来更新数据库。适合频繁写的场景,MySQL 的 InnoDB Buffer Pool 机制就使用到这种模式。

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

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

相关文章

idea模块的pom.xml被划横线,不识别的解决办法

目录 问题&#xff1a; 解决办法&#xff1a; 1.打开设置 2. 取消勾选 3.点击确认 4.解决 问题提出&#xff1a; 写shi山的过程中&#xff0c;给模块取错名字了&#xff0c;改名的时候不知道点到了什么&#xff0c;一个模块的pom.xml变成灰色了&#xff0…

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了

isp调试工具环境搭建及其介绍!

一、isp调试环境搭建&#xff1a; 后期调试isp&#xff0c;是在rv1126提供的RKISP2.x Tuner工具上进行调试&#xff0c;所以我们大前提必须要把这个环境和一些操作先搞熟悉来&#xff0c;后面有一些专用术语&#xff0c;我们遇到了再去看&#xff0c;现在专门看一些专用术语&am…

冠达管理:光伏巨头大反弹!业绩环比提升+低市盈率+超跌股仅14只

今年以来&#xff0c;部分公司得益于职业景气量提高、上游成本下滑、财物处置等原因&#xff0c;连续两个季度净利润继续改进。 光伏巨子成绩环比大幅增加&#xff0c;股价底部大涨 8月3日&#xff0c;光伏龙头隆基绿能股价大涨6.05%&#xff0c;全天成交额到达89.85亿元&…

Stable Diffusion AI绘画初学者指南【概述、云端环境搭建】

概述、云端环境搭建 Stable Diffusion 是什么、能干啥&#xff1f; 是一种基于深度学习的图像处理技术&#xff0c;可以生成高质量的图像。它可以在不需要真实图像的情况下&#xff0c;通过文字描述来生成逼真的图像。 可以对图像进行修复、超分辨率转换&#xff0c;将低分辨…

【BASH】回顾与知识点梳理(一)

【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell&#xff1f;1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令&#xff1a; type1.6 指令的下达与快速编辑按…

[openCV]基于拟合中线的智能车巡线方案V4V5

V4: import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""…

Cpp9 — map和set

map和set STL分为序列式容器&#xff08;vector、list、deque&#xff09;和关联式容器&#xff08;map、set&#xff09; 序列式容器&#xff1a;数据与数据之间没有很强的联系。&#xff08;各个数据之间没什么关联&#xff09;。底层为线性序列的数据结构&#xff0c;里面…

C语言每日一题:13《数据结构》环形链表。

题目链接&#xff1a; 一.环形链表运动基础。 使用快慢指针利用相对移动的思想&#xff1a; 1.第一种情况&#xff1a; 1,令快指针&#xff08;fast&#xff09;速度为2. 2.慢指针&#xff08;slow&#xff09;速度为1. 3.以慢指针进入环中开始。 4。假设slow刚刚进入环中fast…

如何把pdf转成cad版本?这种转换方法非常简单

将PDF转换成CAD格式的优势在于&#xff0c;CAD格式通常是用于工程设计和绘图的标准格式。这种格式的文件可以在计算机上进行编辑和修改&#xff0c;而不需要纸质副本。此外&#xff0c;CAD文件通常可以与其他CAD软件进行交互&#xff0c;从而使得工程设计和绘图过程更加高效和精…

CSS 滚动条

一、滚动条样式属性 ::-webkit-scrollbar {width: 6px; /* 竖向滚动条宽度 */height: 6px; /* 横向滚动条高度 */ }::-webkit-scrollbar-thumb {border-radius: 10px; /* 滚动条样式 */-webkit-box-shadow: inset 0 0 3px red; /* 内阴影 */background-color: blue; /* 滚动条…

卷积神经网络

目录 注意&#xff1a;有参数计算的才叫层 1.应用 1.1分类和检索 1.2超分辨率重构 1.3医学任务 1.4无人驾驶 1.5人脸识别 2.卷积 2.1卷积神经网络和传统网络的区别 2.2整体框架 2.3理解卷积&#xff08;重点&#xff09; 2.4为何要进行多层卷积 2.5卷积核的参数 2.6…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 详细建模方案解析及参考文献 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要…

时间复杂度和空间复杂度

目录 一. 时间复杂度 有循环的时间复杂度例子&#xff1a; 1. 求冒泡排序的时间复杂度&#xff1f;O(n^2) 2. 求二分查找的时间复杂度&#xff1f;O(logn) 3. 求斐波那契数的时间复杂度&#xff1f;O(n) ​编辑 递归的时间复杂度例子&#xff1a; 1. 递归求阶乘&#…

Vue2(初识vue)

目录 一&#xff0c;Vue2简介1.1&#xff0c;什么是vue1.2&#xff0c;初始vue1.3&#xff0c;搭建vue环境1.4&#xff0c;第一个hello world 二&#xff0c;基础知识2.1 指令2.2-1 指令v-text2.2-2 指令v-html2.2-3 指令v-if2.2-4 指令v-else2.2-5 指令v-show2.2-6 v-if指令与…

华为数通HCIA-网络参考模型(TCP/IP)

网络通信模式 作用&#xff1a;指导网络设备的通信&#xff1b; OSI七层模型&#xff1a; 7.应用层&#xff1a;由应用层协议&#xff08;http、FTP、Telnet.&#xff09;为应用程序产生对应的数据&#xff1b; 6.表示层&#xff1a;将应用层产生的数据转换成网络设备看得懂…

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…

从感知到理解-融合语言模型的多模态大模型研究

©PaperWeekly 原创 作者 | 张燚钧 单位 | 中国移动云能力中心 研究方向 | 预训练大模型 引言 近年来&#xff0c;大语言模型&#xff08;Large language model, LLM&#xff09;取得了显著进展。以 ChatGPT 为代表的 LLM 在自然语言任务上展现出惊人的智能涌现能力。尽管…

JVM面试题--实践

目录 JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置 jar包部署在启动参数设置 JVM 调优的参数都有哪些&#xff1f; 设置堆空间大小 虚拟机栈的设置 年轻代中Eden区和两个Survivor区的大小比例 年轻代晋升老年代阈值 设置垃圾回收收集器 JVM 调优的工…