redis数据结构-02(INCR、DECR、APPEND)

字符串操作:INCR、DECR、APPEND

Redis 字符串不仅仅是简单的文本,它们还可以表示数字。此功能使我们能够直接对存储在 Redis 中的字符串值执行原子的递增和递减操作。此外,Redis 还提供了一种附加到现有字符串的方法,从而可以轻松构建更大的文本值。这些操作对于计数器、速率限制和动态字符串构造等任务至关重要。

增加字符串:INCR 命令

Redis 中的 INCR 命令用于递增字符串键的整数值。如果该键不存在,则在执行递增操作之前将其设置为“0”。如果键包含错误类型的值(例如,无法解释为整数的字符串)或表示非整数的字符串,则会返回错误。递增操作是原子的,这意味着即使多个客户端同时尝试递增同一个键,该操作也将正确执行,而不会出现任何竞争条件。

INCR 的基本用法

最简单的用例是增加计数器。想象一下,你正在跟踪某个网页的访问次数。

> SET page_views 10
OK
> INCR page_views
(integer) 11
> GET page_views
"11"

在此示例中,我们首先将 page_views 键设置为“10”。然后,我们使用 INCR 命令递增其值。该命令返回新值 (11),后续的 GET 命令确认该值已在 Redis 中更新。

如果键不存在, INCR 会将其初始化为 0,然后将其增加为 1:

> DEL new_key
(integer) 0
> INCR new_key
(integer) 1
> GET new_key
"1"

使用 INCR 进行错误处理

如果您尝试增加包含非数字字符串的键,Redis 将返回错误:

> SET my_string "hello"
OK
> INCR my_string
(error) ERR value is not an integer or out of range

类似地,尝试增加以字符串形式存储的浮点数也会导致错误:

> SET float_value "3.14"
OK
> INCR float_value
(error) ERR value is not an integer or out of range

INCRBY:按特定值递增

Redis 还提供了 INCRBY 命令,允许你将键的值增加特定的整数值。当你需要增加的数值大于 1 时,这个命令非常有用。

> SET score 50
OK
> INCRBY score 25
(integer) 75
> GET score
"75"

在这里,我们将 score 键增加 25,得到新值 75。

实际示例:速率限制

INCR 的一个常见用例是速率限制。您可以使用它来限制用户在特定时间范围内对 API 发出的请求数量。

  1. 为每个用户设置一个密钥,例如 user:123:requests 。
  2. 当用户提出请求时,对密钥 INCR 。
  3. 使用 EXPIRE 在键上设置生存时间 (TTL),代表时间窗口。
  4. 如果密钥的值超过某个阈值,则拒绝请求。
> SET user:123:requests 0
OK
> INCR user:123:requests
(integer) 1
> EXPIRE user:123:requests 60  # Expire in 60 seconds
(integer) 1
> INCR user:123:requests
(integer) 2

如果 INCR 命令返回的值大于您的限制,您可以拒绝该请求。密钥将在 60 秒后自动过期,并重置计数器。

减少字符串:DECR 命令

DECR 命令与 INCR 相对应。它将字符串键的整数值减一。与 INCR 类似,如果键不存在,则在减一之前将其设置为 0。如果键包含错误类型的值,它也会返回错误。

DECR 的基本用法

> SET items_left 100
OK
> DECR items_left
(integer) 99
> GET items_left
"99"

在这个例子中,我们从 100 个项目开始,然后使用 DECR 减少计数。

如果键不存在, DECR 会将其初始化为 0,然后将其递减为 -1:

> DEL another_key
(integer) 0
> DECR another_key
(integer) -1
> GET another_key
"-1"

使用 DECR 进行错误处理

DECR 在错误处理方面与 INCR 类似。如果值不是整数,它将返回错误。

> SET my_string "world"
OK
> DECR my_string
(error) ERR value is not an integer or out of range

DECRBY:按特定值递减

DECRBY 命令允许您将键减少特定的整数值,类似于 INCRBY 。

> SET energy 80
OK
> DECRBY energy 30
(integer) 50
> GET energy
"50"

在这里,我们将 energy 键减少 30,得到新值 50。

实际示例:库存管理

DECR 可用于库存管理系统。每次售出一件商品时,您可以减少库存数量。

> SET product:123:stock 500
OK
> DECRBY product:123:stock 1  # One item sold
(integer) 499
> GET product:123:stock
"499"

您还可以检查库存水平是否低于某个阈值并触发重新订购流程。

附加到字符串:APPEND 命令

APPEND 命令用于将字符串附加到键所存储的值的末尾。如果该键不存在,则在附加操作之前将其创建为空字符串。

APPEND 的基本用法

> SET greeting "Hello"
OK
> APPEND greeting ", world!"
(integer) 13
> GET greeting
"Hello, world!"

在此示例中,我们以字符串“Hello”开头,并在其后附加“world!”。 APPEND 命令返回字符串的新长度 (13)。

如果键不存在, APPEND 会将其创建为空字符串,然后附加值:

> DEL non_existent_key
(integer) 0
> APPEND non_existent_key "Redis"
(integer) 5
> GET non_existent_key
"Redis"

实际示例:构建日志消息

APPEND 对于构建日志消息或随时间累积数据很有用。

> APPEND log:2024-01-26 "Request received at 10:00:00\n"
(integer) 27
> APPEND log:2024-01-26 "Request processed at 10:00:01\n"
(integer) 54
> GET log:2024-01-26
"Request received at 10:00:00\nRequest processed at 10:00:01\n"

每次发生事件时,您都可以在日志消息中附加一个新行。

将 APPEND 与其他命令结合使用

你可以将 APPEND 与其他字符串命令结合使用,以执行更复杂的操作。例如,你可以使用 GETRANGE (将在后续模块中介绍,但为了完整性起见,在此仅提及)来提取附加字符串的一部分。

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

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

相关文章

Spring MVC 中Model, ModelMap, ModelAndView 之间有什么关系和区别?

在 Spring MVC 中,Model, ModelMap, 和 ModelAndView 都是用来在 Controller 和 View 之间传递数据的,但它们在使用方式和功能上有所不同。 它们的核心在于:Spring MVC 需要知道两件事来渲染视图:① 数据 (Model) ② 视图名称 (V…

配置Hadoop集群-免密登录

在 Hadoop 集群中配置免密登录是确保各节点间高效通信的关键步骤。以下是基于 SSH 密钥认证的免密登录配置方案,支持主节点(NameNode)到所有从节点(DataNode)的无密码访问: 1. 环境准备 集群规划&#xff…

C++类与对象(二):六个默认构造函数(一)

在学C语言时,实现栈和队列时容易忘记初始化和销毁,就会造成内存泄漏。而在C的类中我们忘记写初始化和销毁函数时,编译器会自动生成构造函数和析构函数,对应的初始化和在对象生命周期结束时清理资源。那是什么是默认构造函数呢&…

嵌入式培训之数据结构学习(一)数据结构的基础概念、线性表

一、基础概念 1、数据结构:相互之间存在一种或多种特定关系的数据元素的集合。(特定关系有逻辑关系与线性关系) (1)逻辑结构 集合,所有数据在同一个集合中,关系平等(数组&#xff…

Android Exoplayer 实现多个音视频文件混合播放以及音轨切换

在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景,这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有:视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…

推特逆向算法,推特爬虫,数据分析,推特关键词搜索

祝大家五一假期快乐! 最近推特加了逆向,频繁出现404,无法正常抓取数据,这里给出推特逆向的思路及代码,供大家参考学习! 本文将介绍如何使用 Python 模拟请求 Twitter 的 GraphQL 接口,结合 re…

图形化编程平台的破局之道:从工具同质化到生态差异化

一、同质化困局的底层逻辑剖析 在全球图形化编程市场中,工具功能趋同已成为行业共识。据 Statista 2024 年数据显示,主流平台的基础功能重合度高达 78%,核心模块(如条件判断、循环结构)的实现方式高度相似。这种现象的…

【Rust】枚举和模式匹配

目录 枚举和模式匹配枚举的定义Option 枚举控制流运算符 match简洁控制流 if let 枚举和模式匹配 枚举的定义 结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。…

应急响应靶机——WhereIS?

用户名及密码:zgsf/zgsf 下载资源还有个解题.exe: 1、攻击者的两个ip地址 2、flag1和flag2 3、后门程序进程名称 4、攻击者的提权方式(输入程序名称即可) 之前的命令: 1、攻击者的两个ip地址 先获得root权限,查看一下历史命令记录&#x…

变量函数实战:高保真APP原型“发票页面”动态交互教程

变量函数是高保真交互原型设计中常见的高级交互功能,能够避免重复复制与手动修改页面元素和逻辑标注,让演示更有真实体验感。本文分享一个高保真APP交互原型页面的实操案例,结合原型设计工具中的变量函数与逻辑判断功能,手把手教你…

量子加密通信:守护信息安全的未来之盾

摘要 在数字化时代,信息安全成为全球关注的焦点。传统加密技术面临着被量子计算破解的风险,而量子加密通信作为一种基于量子力学原理的新型加密技术,提供了理论上无条件安全的通信保障。本文将详细介绍量子加密通信的基本原理、技术实现、应用…

《Vue.js》阅读之响应式数据与副作用函数

Vue.js 《Vue.js设计与实现》(霍春阳) 适合:从零手写Vue3响应式系统,大厂面试源码题直接覆盖。重点章节:第4章(响应式)、第5章(渲染器)、第8章(编译器&…

数据处理专题(十三)

学会基本的图像处理技术。‍ OpenCV 基础 实践:使用 OpenCV 进行图像读取、显示和基本处理‍ 03 代码示例 1. 导入必要的库 import cv2import numpy as npimport matplotlib.pyplot as plt 2. 图像读取 # 读取图像image_path path_to_your_image.jpg # 替换…

springboot旅游小程序-计算机毕业设计源码76696

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序旅游网站系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统…

P1874 快速求和

目录 题目算法标签: 动态规划, 线性 d p dp dp思路代码 题目 P1874 快速求和 算法标签: 动态规划, 线性 d p dp dp 思路 求的是最少组成 n n n的加法次数, 对于当前数字序列可以设计状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示考虑前 i i i个字符, 并且和是 j j j的所有方…

知名人工智能AI培训公开课内训课程培训师培训老师专家咨询顾问唐兴通AI在金融零售制造业医药服务业创新实践应用

AI赋能未来工作:引爆效率与价值创造的实战营 AI驱动的工作革命:从效率提升到价值共创 培训时长: 本课程不仅是AI工具的操作指南,更是面向未来的工作方式升级罗盘。旨在帮助学员系统掌握AI(特别是生成式AI/大语言模型…

Linux 内核参数

文章目录 什么是内核参数参数种类配置方式1. 编译内核时配置2. 内核启动时配置3. 内核运行时配置4. 加载内核模块时配置总结 什么是内核参数 内核参数是 Linux 系统中用于控制和调整内核行为的可配置选项。这些参数影响系统的性能、安全性和各种功能特性。 参数种类 大部分参…

pythonocc 拉伸特征

micromamba install -c conda-forge pythonocc-core opencascade.js安装不起来,ai用pythonocc练个手 拉伸线框 线成面 from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Vec from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire f…

Vue.js 页面切换空白与刷新 404 问题深度解析

在使用 Vue.js 开发单页应用 (SPA) 的过程中,开发者经常会遇到两个常见问题:页面切换时出现短暂的空白屏幕,以及刷新页面时返回 404 错误。这两个问题不仅影响用户体验,还可能阻碍项目的正常上线。本文将深入探讨这两个问题的成因…

Go 语言 slice(切片) 的使用

序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…