学习小记-一些Redis小知识

目录

虚拟内存

事务机制

Pipeline

Lua

乐观锁


虚拟内存

Redis 的虚拟内存(VM, Virtual Memory)是一种数据存储技术,它允许 Redis 在物理内存不足时,将部分数据临时存储到磁盘上。这项技术主要用于处理大量数据时减少内存的使用,以及提高数据的持久性。

但是:这种设计带来了一些问题:

  1. 性能开销::虚拟内存的使用增加了额外的磁盘I/O操作,这会显著降低Redis的性能,因为磁盘访问速度远不如内存访问速度。
  2. 复杂性::虚拟内存功能的管理增加了Redis运行的复杂性,尤其是在数据管理和性能调优方面。

Redis 4.0 以后的版本中,虚拟内存功能不再是默认启用的,因为现代服务器通常有足够的物理内存来存储所有数据。然而,如果你的应用程序需要处理大量数据,并且希望减少内存使用,你可以考虑手动启用虚拟内存功能。

事务机制

Redis 的事务机制是一种将多个命令打包执行的能力,确保这些命令要么全部执行,要么全部不执行,从而保持操作的原子性。事务在 Redis 中通过 MULTIEXECWATCH DISCARD 等命令实现。

缺点:

  1. 不支持回滚:如果事务执行过程中发生错误,Redis会继续执行剩余的命令而不是回滚整个事务。
  2. 不保证隔离性:即在事务执行期间,其他客户端可能可以读取到事务部分执行的结果。

相信有很多小伙伴到这里会问了:不支持回滚怎么保证原子性?其实你犯了一个错误,错误的将数据库ACID的原子性理解成了并发编程的原子性。数据库中事务是指“要么都执行,要么都回滚”。而并发并编程的原子性是指“操作不可拆分,不被中断”。

Pipeline

Redis 的 Pipeline(管道)是一种技术,它允许客户端将多个 Redis 命令打包在一起,然后一次性发送到服务器。使用 Pipeline 可以显著提高客户端和 Redis 服务器之间的通信效率,因为它减少了往返次数(即减少了网络延迟的影响)。

优点

  1. 减少网络往返:通过将多个命令一次性发送,而不是发送一个命令后等待响应再发送下一个命令,可以减少网络往返次数。

  2. 提高性能:Pipeline 可以显著提高执行多个命令的性能,因为它减少了等待时间。

  3. 原子性:在同一个 Pipeline 中发送的所有命令会作为一个整体一起执行,这意味着它们是原子性的。不过,请注意,这并不保证跨多个 Pipeline 的原子性。

  4. 脚本执行:Pipeline 可以用于执行 Lua 脚本,这可以进一步减少网络往返,因为 Lua 脚本可以包含多个命令。

缺点:

  1. 不保证原子性:他的多个命令都是独立执行的,Redis并不保证这些命令可以以不可分割的原子操作进行执行。这是Pipeline和Redis的事务的最大的区别。
  2. 你不能使用那些需要在命令执行前知道上一个命令结果的命令(如 WATCH 和事务命令)。

使用场景:

  • 当你需要执行多个键值操作,如 SETGETINCRLPUSH 等。
  • 当你需要批量获取或设置多个键的值。
  • 当你需要执行一系列命令,而这些命令可以一次性发送以提高效率。

使用Jedis可以实现Redis的事务和Pipeline

// ---------事务-----------
Jedis jedis = new Jedis("localhost", 6379)
// 开始事务
jedis.multi();// 在事务中执行多个命令
jedis.set("key1", "value1");
jedis.set("key2", "value2");
jedis.incr("counter"); // 假设 counter 是一个已经存在的计数器键// 执行事务,并获取所有命令的响应结果
List<Object> results = jedis.exec();
if (results != null) {
// 遍历结果for (Object result : results) {System.out.println(result);}
} else {// 如果事务因为某些原因被中断(如 Watch 失败),则结果将为 nullSystem.out.println("事务执行被中断");
}
// 关闭 Jedis 连接
jedis.close();// ---------Pipeline-----------
Jedis jedis = new Jedis("localhost", 6379); // 创建 Jedis 实例连接到 Redis
Pipeline pipeline = jedis.pipelined(); // 开启 Pipeline// 向 Pipeline 添加命令
pipeline.set("key1", "value1");
pipeline.get("key1");
pipeline.incr("counter");// 执行 Pipeline 并获取所有响应
List<Object> results = pipeline.syncAndReturnAll();// 处理结果
String value1 = (String) results.get(0); // key1 的值
String value2 = (String) results.get(1); // key1 的值(通过 get 命令获取)
Long counter = (Long) results.get(2); // counter 的新值// 关闭 Jedis 连接
jedis.close();// Redission也可以实现事务和pipeline
// 假设redissonClient已经创建并配置好连接
RedissonClient redisson = Redisson.create()
RTransaction transaction = redisson.getTransaction();
RPipeline pipeline = redisson.pipeline();

Lua

Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放。Redis 的 Lua 脚本是一种在 Redis 服务器上执行 Lua 代码的能力。Redis 从 2.6 版本开始内置了对 Lua 脚本的支持。使用 Lua 脚本,你可以实现以下目标:

  1. 原子性:Lua 脚本作为一个单独的命令执行,保证了脚本中的命令序列是原子性的。这意味着脚本中的所有命令要么全部执行,要么全部不执行,中间不会有其他命令插入。(也就是说,Redis保证以原子方式执行Lua脚本,但是不保证脚本中所有操作要么都执行或者都回滚。)

Lua脚本可以保证原子性,因为Redis会将Lua脚本封装成一个单独的事务,而这个单独的事务会在Redis客户端运行时,由Redis服务器自行处理并完成整个事务,如果在这个进程中有其他客户端请求的时候,Redis将会把它暂存起来,等到 Lua 脚本处理完毕后,才会再把被暂存的请求恢复。

  1. 减少网络开销:通过将多个命令打包在 Lua 脚本中一次性发送到服务器,可以减少客户端和服务器之间的网络往返次数。

  2. 复用性:客户端发送的 Lua 脚本会被缓存在 Redis 中,其他客户端可以复用这一脚本而不需要重新发送相同的逻辑代码。

  3. 执行复杂逻辑:Lua 脚本允许在 Redis 服务器上执行复杂的业务逻辑,而不需要在客户端进行多重逻辑处理。

Lua与事务的区别:Redis的事务在执行过程中,如果有某一个命令失败了,是不影响后续命令的执行的;而Lua脚本中,如果执行过程中某个命令执行失败了,是会影响后续命令执行的。

乐观锁

用WATCH命令可以实现乐观锁:这个命令一旦运行,他会确保只有在 WATCH 监视的键在调用 EXEC 之前没有改变时,后续的事务才会执行。

WATCH cainiao
GET cainiao
MULTI
set cainiao <从GET获得的值 + 任务增量>
EXEC

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

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

相关文章

【机器学习理论基础】回归模型定义和分类

定义 回归分析是研究自变量与因变量之间数量变化关系的一种分析方法&#xff0c;它主要是通过因变量 Y Y Y与影响它的自变量 X i X_i Xi​ 之间的回归模型&#xff0c;衡量自变量 X i X_i Xi​ 对因变量 Y Y Y 的影响能力的&#xff0c;进而可以用来预测因变量Y的发展趋势。…

中国AI已遥遥领先

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 种种迹象表明&#xff0c;中国的AI产业是仅次于美国的存在&#xff0c;中国的AI已经遥遥领先&#xff0c;其他国家。 根据中国信息通信研究院发布的报告称&#xff1a; 根据中国信息通信研究院近日发布的《全球…

【C++深度探索】全面解析多态性机制(一)

hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1…

万物皆可嵌入--embedding在GPU中的实现

摘要 Embedding技术自从谷歌推出word2vec的工作后得到迅速的应用&#xff0c;典型应用之一是在广告推荐场景中&#xff0c;从word2vec演进到item2vec&#xff0c;embedding技术的出现也使深度学习进入广告推荐的场景成为可能。广告推荐模型动辄几十GB甚至TB的模型大小&#xf…

数据结构(Java):集合类LinkedList集合类Stack

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构&#xff08;故不支持随机访问&#xff09;&#xff1a; 在LinkedList中&#xff0c;定义了first和last&#xff0c;分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…

京准电钟|ptp精密时钟服务器在网络内作用是什么?

京准电钟&#xff5c;ptp精密时钟服务器在网络内作用是什么&#xff1f; 京准电钟&#xff5c;ptp精密时钟服务器在网络内作用是什么&#xff1f; PTP精密时钟服务器在计算机网络中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。 PTP能够提供纳秒级的时间同…

TikTok短视频矩阵管理系统源码

在数字化浪潮汹涌的今天&#xff0c;短视频已成为人们生活中不可或缺的一部分。TikTok作为短视频领域的佼佼者&#xff0c;其用户基数庞大&#xff0c;影响力深远。然而&#xff0c;对于众多内容创作者和营销人员来说&#xff0c;如何高效管理多个TikTok账号&#xff0c;实现批…

one-hot-zhu案例

# 导入用于对象保存与加载的joblib # from sklearn.externals import joblib import joblib # 导入keras中的词汇映射器Tokenizer from keras.preprocessing.text import Tokenizer def one_hot_01(): # 1 准备语料 vocabs # vocabs {“周杰伦”, “陈奕迅”, “王力宏”, “…

分布式训练

一、分布式计算 跟多GPU不同是&#xff1a;数据不是从主存拿的&#xff0c;是在分布式文件系统拿的&#xff0c;有多个工作站&#xff0c;工作站中有多个GPU&#xff0c;通过网络读取数据到GPU中&#xff0c;GPU通过网络接收到来自参数服务器的参数进行运算计算梯度&#xff0c…

Biotinylated L-Thyroxine (T4) ;生物素 L-甲状腺素(T4)

一、基本信息 常用名&#xff1a;Biotinylated L-Thyroxine (T4) 生物素 L-甲状腺素(T4) 英文名称&#xff1a;Biotinylated L-Thyroxine (T4) 中文名称&#xff1a;生物素 L-甲状腺素(T4) 二、组成与性质 生物素&#xff1a;一种水溶性维生素&#xff0c;也称为维生素B7&#…

Photoshop批量处理图片分辨率

整理一些文件的时候&#xff0c;发现需要处理大量图片的尺寸和分辨率。如果一张一张的处理就会很慢&#xff0c;搜了下&#xff0c;Photoshop提供自动批量处理的方法。在此记录一下。 一、说说批量处理图片 1.打开PS软件并导入图片&#xff0c;我用的是比较老的版本cs4&#…

在创建jsp项目中解决无法连接数据库以及junit问题

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

使用semgrep做代码规范扫描

semgrep 简介 semgrep 是一种静态代码分析工具&#xff0c;用于发现和修复软件代码中的安全漏洞、Bug 和编码风格问题。它可以帮助开发人员和安全团队在早期发现和解决潜在的代码问题&#xff0c;提高软件质量和安全性。 以下是 semgrep 的一些主要功能和特点&#xff1a; 静…

将 Vision Transformer 用于医学图像的语义分割

关于ViT的关键点如下&#xff1a; ViT架构基于将图像表示为一组补丁。图像补丁是图像的非重叠块。每个块最初都有一个由该块中的图像像素形成的嵌入向量。Transformer编码器是ViT的主要部分&#xff0c;它根据它们的类别归属来训练补丁之间的相似度。它包含一系列线性、归一化…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口&#xff0c; 那么你项目一定充斥着大量的对接逻辑和代码&#xff0c; 并且针对不同的对接渠道方需要每次封装一次调用的简化&#xff0c; 一旦封装不好系统将会变得难以维护&am…

SprintBoot创建遇到的问题

最近使用IDEA版本为2022.3.1&#xff0c;java版本为21.0.3&#xff0c;现在做一个创建SprintBoot3的一个大体流程 1.先下载Maven&#xff0c;解压到一个位置 maven下载 2.配置setting.xml文件 这路径自己配置&#xff0c;这里不多演示 代码如下&#xff1a; <mirror>&…

基于物联网设计的人体健康监护系统(STM32+ESP8266+华为云IOT)(182)

基于物联网设计的人体健康监护系统(STM32+ESP8266+华为云IOT)(182) 一、前言 1.1 项目介绍 【1】项目功能介绍 随着人们生活水平的提高和健康意识的增强,对个人健康状况的关注也越来越高。传统的健康监测方式往往需要到医院或诊所进行体检,费时费力且不够便捷。本项目设计…

0124__Linux和Unix的Access.conf安全配置

Linux和Unix的Access.conf安全配置-CSDN博客

iptables 详解

在 Buildroot 系统中&#xff0c;iptables 是一个用户空间实用程序程序&#xff0c;它允许管理员配置 Linux 内核中的 IP 包过滤规则。以下是一些关于 iptables 的基本用法和常见示例&#xff1a; 基本用法 iptables 使用规则链来处理数据包。主要的链包括&#xff1a; INPUT…

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…