Redis(day 2)

news2024/11/25 3:07:35

一、常用指令

哈希Hash   kv模式不变,但v是一个键值对

(1)hset、hget命令用于为哈希表中的字段赋值 。

(2)hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。

(3)hgetall 用于返回哈希表中,所有的字段和值。

(4)hdel 用于删除哈希表 key 中的一个或多个指定字段

(5)hlen 获取哈希表中字段的数量

(6)hexists 查看哈希表的指定字段是否存在。

(7)hkeys 获取哈希表中的所有域(field)。

(8)hvals 返回哈希表所有域(field)的值。

(9)hincrby 为哈希表中的字段值加上指定增量值。

(10)hsetnx 为哈希表中不存在的的字段赋值

有序集合Zset

在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2

(1)zadd 将一个或多个成员元素及其分数值加入到有序集当中。

(2)zrange 返回有序集中,指定区间内的成员

(3)zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。

(4)zrem 移除有序集中的一个或多个成员

(5)zcard 命令用于计算集合中元素的数量

(6)zcount 计算有序集合中指定分数区间的成员数量

(7)zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。

(8)zrevrank 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普通消息的score为 1 ,重要消息的score为 2 ,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

二、Redis事务

1.概念

redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。 Redis事务没有隔离级别的概念

Redis不保证原子性

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务的三个阶段:

(1)开始事务

(2)命令入队

(3)执行事务

2.Redis事务相关命令

(1)multi # 标记一个事务块的开始( queued )

(2)exec # 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )

(3)discard # 取消事务,放弃事务块中的所有命令

若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行

若在事务队列中存在运行时性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

(4)Watch 监控

watch key1 key2... #监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 ( 类似乐观锁 )

watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

三、持久化

1.RDB快照形式

在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里

(1)Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

(2)RDB的缺点是最后一次持久化后的数据可能丢失。

(3)rdb 保存的是dump.rdb文件

如何触发RDB快照

2.AOF日志形式

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

优势:每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

劣势:相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

四、缓存穿透

1.概念

用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

2.解决方案

缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

3.存在问题

(1)如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;

(2)即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

五、缓存击穿

1.概念:

当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。

2.解决方案

(1)设置热点数据永不过期

从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。

(2)加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

六、缓存雪崩

1.概念

缓存雪崩,是指在某一个时间段,缓存集中过期失效。

因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。

2.解决方案

(1)redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

(2)限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

(3)数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

七、GC

JVM内存区域

方法区

是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。

线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。

它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还可以细分为新生代和老年代

程序计数器

虚拟机栈

本地方法栈(JVM执行本地方法)

判断垃圾/判断对象已死

1.引用计数算法

引用计数算法是在对象中加入一个计数器,当对象被引用,计数器+1,当引用失效,计数器-1,当计数器的值编程0,就是没有任何一个变量来引用这个对象,那么这个对象就是垃圾

会引起内存泄漏

2.可达性分析算法(Java使用的这一种)

Java中定义了一些起始点,称为GC Root[正在使用的对象或量],当有对象引用它的时候,就把对象挂载在它下面,形成一个树状结构,当一个对象处于一个这样的树里时,就认为此对象是可达的,反之是不可达

GC ROOT

虚拟机栈中引用的对象

方法区类的静态成员引用的对象

方法区常量引用的对象

本地方法栈中JNI(Java Native Interface的缩写)引用的对象

垃圾收集算法

(1)标记清除(Mark-Sweep)

算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象(引用计数法或者可达性分析),在标记完成后统一回收掉所有被标记的对象。它是最基础的收集算法,后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。

它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

(2)标记复制(Copying)

复制算法在标记清除算法的基础上,针对内存碎片问题做了一下优化,此算法把内存分为大小相同的两块,每次在使用的时候只使用其中的一块。当一块内存用完的时候。把存活对象复制到另外的一块中,然后清除当前这块中的所有的对象,如此反复。

解决了内存碎片化严重的问题,但是存在缺陷就是每次只使用一半的空间,空间利用率受到影响。同时对于存活周期长的对象,复制次数多。

(3)标记整理(Mark-Compact)

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

(4)分代收集算法(Generational Collection)

把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

新生代GC叫做 minorGC     伊甸园区满了
老年代GC叫做FullGC          老年代满了会触发fullGC   fullGC老年代和新生代一起GC

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

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

相关文章

AI在医学领域:通过声纹特征来预测血糖水平

糖尿病代谢紊乱&#xff08;DM&#xff09;是一种以血糖水平异常为特征的代谢性疾病&#xff0c;其表现为高血糖&#xff08;≥230 mg/dL&#xff09;或低血糖&#xff08;<65 mg/dL&#xff09;。该病导致胰岛素产生或作用受损&#xff0c;胰岛素作为调节葡萄糖稳态的关键激…

20 动态内存管理

目录 一、为什么要有动态内存管理 二、malloc 和 free &#xff08;一&#xff09;malloc &#xff08;二&#xff09;free 三、calloc 和 realloc &#xff08;一&#xff09;calloc &#xff08;二&#xff09;realloc 四、常见的动态内存错误 &#xff08;一&#…

【初阶数据结构】顺序表与链表的比较(附题)

目录 一、顺序表和链表的区别&#xff08;其他链表存在缺陷&#xff0c;比较意义不大&#xff0c;这里用带头双向循环链表与顺序表进行比较&#xff09; 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识&#xff08;本文仅为比较顺序表及链表&am…

照片怎么转jpg格式?这些照片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;面对多种多样的图片格式&#xff0c;如何高效地将它们转换为最常用的JPG格式&#xff0c;成为了许多人面临的难题。下面给大家分享常用的几种照片格式转换方法&#xff0c;一起来了解下吧。 方法一&#xff1…

数据结构之树体系:二叉树、平衡二叉树、红黑树、AVL树、B树、B+树、最小生成树、哈夫曼树、决策树、LSM树、后缀树、R树

概述 数据结构与算法 二叉树 其中每个结点都不能有多于两个子结点&#xff1a; 满二叉树&#xff1a;若设二叉树的高度为 h h h&#xff0c;除第 h h h层外&#xff0c;其它各层(1&#xff5e;h-1) 的结点数都达到最大个数&#xff0c;最后一层都是叶子结点&#xff0c;且叶…

CICD持续集成持续交付部署

一、CICD概念 1、什么是CI/CD&#xff1f; 通俗来说就是启动一个服务&#xff0c;能够监听代码变化&#xff0c;然后自动执行构建、测试、打包、发布等流程&#xff1b; 2、CI 持续集成 指在开发人员频繁地提交新代码&#xff0c;都会自动执行构建、测试。根据测试结果&…

WPS回应“崩了”:提供15天会员补偿,另有新羊毛,你还不来薅?

近期&#xff0c;“WPS崩了”这一话题在时隔两个月后&#xff0c;再次因多名用户反馈软件使用问题而登上微博热搜。 WPS官方微博随后发布消息称&#xff0c;经过工程师的紧急修复&#xff0c;WPS服务已经恢复正常。 为了补偿用户&#xff0c;在8月22日0点至24点期间&#xff…

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…

vm 虚拟机无法调用摄像头(亲测有效)

-- 前言1 报错说明1.1 opencv调用摄像头失败&#xff0c;画面窗口无法显示1.2 选择连接摄像头出现失败&#xff1a;桌面右下角出现【USB 设备“Acer Integrated RGB Camera"的连接失败】连接摄像头方法 2 解决方法步骤一步骤二步骤三 补充 前言 网上找的很多方法都是无效…

2024年游泳耳机哪个牌子好?四大热门游泳耳机多维测评盘点!

游泳不仅是夏日里最受欢迎的消暑方式&#xff0c;也是全年无休的一项全身性运动。在水中畅游时&#xff0c;若能伴随着喜爱的音乐&#xff0c;无疑能让体验更上一层楼。近年来&#xff0c;随着骨传导技术和防水材料的进步&#xff0c;游泳耳机已经成为许多游泳爱好者的必备装备…

网络编程,网络协议,UDP编程

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …

electron仿微信,新建贴合窗口

说明 在写electron项目时&#xff0c;只有一个主窗口不足以满足需求&#xff0c;我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样&#xff0c;全贴合在一起&#xff0c;看起来像一个整体呢&#xff1a; 分析 这个窗口有点像element ui中的抽屉(drawe…

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出

回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 文章目录 前言回归预测|基于北方苍鹰优化NGO-Transformer-BiLSTM组合模型的数据预测Matlab程序多特征输入单输出 一、NGO-Transformer-BiLSTM模型回归预测&#xff1a;NGO-Trans…

VUE学习笔记 2

条件渲染 v-if : 若不频繁切换&#xff0c;会删除DOM节点&#xff0c;再重复添加&#xff1b; template只能配合v-if v-show: 适用于频繁切换&#xff0c;动态变换但不删除DOM节点 列表渲染 方式&#xff1a; v-for"p in person" :key"yyy" 遍历数组…

详讲C#中如何存储当前项目的设置-超级简单省事

我们在编写软件的时候总有一些配置数据需要保存&#xff0c;比如用户选择的偏好设置&#xff0c;又如软件所用到的数据库文件等。我们有很多中方式都可以保存&#xff0c;比如直接保存在某个文本文件&#xff0c;或者ini文件中&#xff0c;其实最简单的办法是保存在项目的资源文…

File的常见成员方法(创建,删除)

一.File的常见成员方法&#xff08;创建&#xff0c;删除&#xff09;&#xff1a; 二.方法的代码实现&#xff1a; 1.createNewFile方法->创建一个新的空的文件&#xff1a; 如上图直接调用createNewFile方法会报错&#xff0c;处理方案如下&#xff1a; 本例选择第一个&a…

Kotlin OpenCV 图像图像51图片轮廓获取

Kotlin OpenCV 图像图像51图片轮廓获取 在OpenCV库中&#xff0c;Imgproc.adaptiveThreshold、Imgproc.findContours 和 Imgproc.boundingRect 这三个方法在图像处理和分析中非常有用。以下是它们的详细作用&#xff1a; Imgproc.adaptiveThreshold解释作用该方法用于将灰度图…

工业排污检测算法的算法样本及工业排污检测的源码展示

工业排污检测算法是一种结合了先进人工智能、图像识别、声音识别、数据分析等技术的解决方案&#xff0c;专门用于实时监测和评估工业排放的污染物。这种算法在环境保护、合规管理、数据支持等方面具有显著的优势&#xff0c;并且可以广泛应用于各种工业场景。 主要作用 1、实…

宝塔面板本地搭建Typecho博客结合内网穿透实现远程访问本地站点

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 本文主要介绍如何通过Linux centOS8宝塔面板工具&#xff0c;本地搭建一个Typecho个人博客网站。并结合cpolar内网穿透工具配置公网…

关于Arrays.asList返回List无法新增和删除?

这个是在写项目的时候发现的&#xff0c;然后就分析了一下源码&#xff0c;得其内部原理 复现代码示例&#xff1a; public class ArraysAsList {public static void main(String[] args) {Integer[] array {1, 2, 3, 4, 5};List<Integer> list Arrays.asList(array);…