【Redis】String的介绍与应用详解

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪

在这里插入图片描述

文章目录

  • Redis数据类型之String
    • 介绍
    • 常用指令
      • 设置/获取单个键值
      • 设置/获取多个键值
      • 设置/获取指定区域范围内的值
      • 数值增减
      • 获取字符串长度
      • 内容追加
      • set命令的更多扩展
        • setex
        • setnx
        • [EX seconds]
        • [NX]
        • [XX]
        • [KEEPTTL]
      • getset
    • 常用指令汇总
      • String常用命令汇总
      • set命令参数汇总
    • 应用场景
      • 缓存
      • 计数器
      • 分布式锁
      • Session共享
  • 总结
      • 特性
      • 常用指令
      • set命令的扩展参数
      • 应用场景

Redis数据类型之String


介绍


String是Redis最基本的类型,一个key对应一个value。key为标识符,valuekey对应的值。

String是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列化的对象 。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

image-20240514151952654


常用指令


设置/获取单个键值


# 设置指定 key 的值
127.0.0.1:6379> set name baichen
OK
# 获取指定 key 的值
127.0.0.1:6379> get name
"baichen"

设置/获取多个键值


# 同时设置一个或多个 key-value 对
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
# 获取所有(一个或多个)给定 key 的值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

设置/获取指定区域范围内的值


# 返回 key 中字符串值从下标 start 到下标 end 的子字符串
127.0.0.1:6379> getrange name 0 -1 # 0 -1表示从字符串开头到字符串结尾
"baichen12345"
127.0.0.1:6379> getrange name 7 -1
"12345"
127.0.0.1:6379> getrange name 0 6
"baichen"
# 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
127.0.0.1:6379> setrange name 7 6789 # 从offset=7的位置设置字符串6789
(integer) 12
127.0.0.1:6379> get name
"baichen67895"

数值增减


127.0.0.1:6379> set number 1
OK
# 将 key 中储存的数字值增一
127.0.0.1:6379> incr number
(integer) 2
127.0.0.1:6379> get number
"2"
# 将 key 所储存的值加上给定的增量值(increment)
127.0.0.1:6379> incrby number 3
(integer) 5
127.0.0.1:6379> get number
"5"
# 将 key 中储存的数字值减一
127.0.0.1:6379> decr number
(integer) 4
127.0.0.1:6379> get number
"4"
# key 所储存的值减去给定的减量值(decrement)
127.0.0.1:6379> decrby number 3
(integer) 1
127.0.0.1:6379> get number
"1"

获取字符串长度


127.0.0.1:6379> set name baichen
OK
# 返回 key 所储存的字符串值的长度
127.0.0.1:6379> strlen name
(integer) 7

内容追加


# 如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾
127.0.0.1:6379> set name baichen
OK
127.0.0.1:6379> append name 12345
(integer) 12
127.0.0.1:6379> get name
"baichen12345"

set命令的更多扩展


setex
# 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
127.0.0.1:6379> setex k1 10 v1 # 设置 10 秒过期时间
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1 # 获取剩余过期时间
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1 # k1 已过期
(nil)
setnx
# 只有在 key 不存在时设置 key 的值
127.0.0.1:6379> setnx k2 v2
(integer) 0
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> setnx k2 baichen
(integer) 0
127.0.0.1:6379> get k2 # 值没有发生变化
"v2"
[EX seconds]
# 设置 key 的生存时间为指定的秒数,等价于setex
127.0.0.1:6379> set k1 v1 ex 10
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1
(nil)
[NX]
# 只有在 key 不存在时,才设置(SET if Not eXists),等价于setnx
127.0.0.1:6379> set k1 v1 nx
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k1 baichen nx
(nil)
127.0.0.1:6379> get k1
"v1"
[XX]
# 只有在 key 已经存在时,才设置(SET if eXists)
127.0.0.1:6379> set k1 v1 xx # k1 没有设置时,设置不了 k1 的值
(nil)
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k1 baichen xx # 只有 k1 有值时,才能设置value
OK
127.0.0.1:6379> get k1
"baichen"
[KEEPTTL]
# 在使用 NX 或 XX 选项时,保持原有的过期时间(Keep Time To Live)
127.0.0.1:6379> set k1 v1 ex 20
OK
127.0.0.1:6379> ttl k1
(integer) 19
127.0.0.1:6379> set k1 baichen keepttl
OK
127.0.0.1:6379> get k1
"baichen"
127.0.0.1:6379> ttl k1 # 继承了旧 k1 的过期时间,如果不使用keepttl参数,过期时间会按照新 k1 的设置重置
(integer) 9
127.0.0.1:6379> ttl k1
(integer) -2

getset


# 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> getset k1 baichen
"v1"
127.0.0.1:6379> get k1
"baichen"

常用指令汇总


String常用命令汇总

命令描述
SET key value设置指定 key 的值
GET key获取指定 key 的值
GETRANGE key start end返回 key 中字符串值从下标 start 到下标 end 的子字符串
GETSET key value将给定 key 的值设为 value ,并返回 key 的旧值(old value)
GETBIT key offset对 key 所储存的字符串值,获取指定偏移量上的位(bit)
MGET key1 [key2..]获取所有(一个或多个)给定 key 的值
SETBIT key offset value对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
SETEX key seconds value将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
SETNX key value只有在 key 不存在时设置 key 的值
SETRANGE key offset value用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
STRLEN key返回 key 所储存的字符串值的长度
MSET key value [key value ...]同时设置一个或多个 key-value 对
MSETNX key value [key value ...]同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
PSETEX key milliseconds value这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
INCR key将 key 中储存的数字值增一
INCRBY key increment将 key 所储存的值加上给定的增量值(increment)
INCRBYFLOAT key increment将 key 储存的值加上给定的浮点增量值(increment)
DECR key将 key 中储存的数字值减一
DECRBY key decrementkey 所储存的值减去给定的减量值(decrement)
APPEND key value如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾

set命令参数汇总

命令全称及参数描述
SET key value设置指定 key 的值
[NX]只有在 key 不存在时,才设置(SET if Not eXists)
[XX]只有在 key 已经存在时,才设置(SET if eXists)
[EX seconds]设置 key 的生存时间为指定的秒数
[PX milliseconds]设置 key 的生存时间为指定的毫秒数
[EXAT unix-time-seconds]设置 key 从给定的 Unix 时间戳开始生存,单位为秒
[PXAT unix-time-milliseconds]设置 key 从给定的 Unix 时间戳开始生存,单位为毫秒
[KEEPTTL]在使用 NX 或 XX 选项时,保持原有的过期时间(Keep Time To Live)

应用场景


缓存


在用 Redis 作为缓存时,String 类型通常用于存储会频繁被读取但更新不是非常频繁的数据。

比如,

  1. 缓存用户会话
    • 当用户登录系统后,其会话信息可以存储在 Redis 中,以便于快速验证用户状态。
  2. 缓存网页内容
    • 对于不经常变动的网页内容,如网站的静态页面,可以缓存在 Redis 中以减少数据库的访问次数。
# 将用户会话信息缓存起来
127.0.0.1:6379> SET session:12345 '{"username":"kimi","permissions":"admin"}' EX 3600
OK
# 读取缓存的用户会话信息
127.0.0.1:6379> GET session:12345
"{\"username\":\"kimi\",\"permissions\":\"admin\"}"
# 缓存某个商品的详情页内容
127.0.0.1:6379> SET product:54321 "<html>商品详情页的内容</html>" EX 300
OK
# 读取缓存的商品详情页内容
127.0.0.1:6379> GET product:54321
"<html>商品详情页的内容</html>"

计数器


Redis 的 String 类型除了可以存储简单的字符串外,还可以用作计数器。这是因为 Redis 的 String 在内部是二进制安全的,所以不仅可以存储文本数据,还可以存储任何格式的二进制数据,包括整数。

比如,统计某个帖子的点赞数:

# 假设有一个帖子的ID为1234,初始化点赞计数器
127.0.0.1:6379> SET post:likes:1234 0
OK
# 用户A点赞,增加点赞数
127.0.0.1:6379> INCR post:likes:1234
(integer) 1
# 用户B点赞,继续增加点赞数
127.0.0.1:6379> INCR post:likes:1234
(integer) 2
# 获取当前的点赞数以展示
127.0.0.1:6379> GET post:likes:1234
"2"
# 用户A取消点赞,减少点赞数
127.0.0.1:6379> DECR post:likes:1234
(integer) 1
# 如果需要给点赞数增加一个特定的数值,比如一次性增加10个赞
127.0.0.1:6379> INCRBY post:likes:1234 10
(integer) 11
# 再次获取当前的点赞数
127.0.0.1:6379> GET post:likes:1234
"11"

分布式锁


Redis 的 String 类型可以被用作实现分布式锁,这在分布式系统中用于确保资源在多个进程或多个服务器之间被同步访问。分布式锁的关键在于能够安全地获取和释放锁,并且能够在持有锁的进程崩溃时能够安全地释放锁。

image-20240516215028531

以下是使用 Redis String 类型实现分布式锁的一个基本示例:

  1. 获取锁: 使用 SET 命令结合 NX(Not eXists)和 PX(毫秒为单位设置超时时间)选项来获取锁。
  2. 释放锁: 执行完临界区的操作后,通过 DEL 命令删除锁。
  3. 锁超时: 使用 SET 命令设置锁的同时,可以设置一个过期时间,这样即使持有锁的进程崩溃,锁也会在一定时间后自动释放。
  4. 锁续约: 如果锁持有者仍然需要这个锁,它可以在锁即将过期前续约。
# 尝试获取锁,'lock:key' 是锁的键,'lockvalue' 是锁的值,用于后续识别和释放锁,10000 是锁的超时时间,单位为毫秒
SET lock:key lockvalue NX PX 10000# 如果 SET 命令成功,那么获取到了锁,可以执行临界区的代码
# 执行临界区操作...# 释放锁,通过 DEL 命令删除锁
DEL lock:key

在实际应用中,为了确保锁的安全性,还需要考虑以下几个因素:

  • 锁超时:如果进程在持有锁期间崩溃,需要锁能够自动释放。这可以通过 SET 命令的 PX 选项实现。
  • 锁续约:如果临界区的操作还没有完成,但是锁快要过期,持有锁的进程应该能够续约这个锁。
  • 锁识别:在释放锁时,需要确保是同一个进程释放了锁。这可以通过检查锁的值(lockvalue)来实现。
  • 避免锁的错位:使用 GETSET 命令来原子地替换锁的值,如果当前锁的值与预期的锁值匹配,则可以安全地删除锁。
  • 原子性:使用lua脚本可以用来确保一系列命令的原子性执行。

分布式锁的请求流程如下图所示:

image-20240516215137308

用Redis实现分布式锁有以下几种形式:

image-20240516213624333

一个实现良好的分布式锁流程图如下:

image-20240516214348334


Session共享


在开发后台管理系统或任何Web应用程序时,Session通常用于跟踪用户的登录状态和会话信息。在传统的单体应用架构中,Session信息存储在服务器的内存中,与用户的会话直接关联。这种模式下,用户的所有请求通常都会发送到同一个服务器,因此服务器能够识别并维护用户的会话状态。

然而,在分布式系统中,应用被部署在多个服务器上,并且用户的请求可能会被负载均衡器随机分配到不同的服务器。这种架构下,每个服务器都是独立的,并且可能没有其他服务器上的Session信息。这就导致了一个问题:如果用户的Session信息存储在特定的服务器上,当用户下一次请求被分配到不同的服务器时,该服务器将无法识别用户的会话,从而导致用户需要重新登录。

为了解决这个问题,可以采用Session共享策略

  • Session共享策略

通过某种机制,如使用一个共享的Session存储(例如Redis、Memcached等),使得所有服务器都能够访问相同的Session信息。这样,无论用户的请求被分配到哪台服务器,服务器都能够识别用户的会话状态。

image-20240516220857800


总结


特性

  • String是Redis中最基本的数据类型,采用key-value形式存储。
  • 它是二进制安全的,可以存储任何类型的数据,如图片或序列化的对象。
  • 一个String类型的value最多可以存储512M的数据。

常用指令

  • SET / GET:设置和获取单个键值。
  • MSET / MGET:同时设置或获取多个键值。
  • GETRANGE / SETRANGE:获取或设置字符串的指定区域。
  • INCR / DECR:数值增减操作。
  • STRLEN:获取字符串长度。
  • APPEND:追加内容到现有字符串。
  • SETEX / PSETEX:设置键值并指定过期时间(秒/毫秒)。
  • SETNX:仅当键不存在时设置值。
  • GETSET:设置新值并获取旧值。
  • 其他位操作指令:SETBIT / GETBIT

set命令的扩展参数

  • NX:仅当键不存在时设置。
  • XX:仅当键已存在时设置。
  • EX / PX:设置键的过期时间(秒/毫秒)。
  • KEEPTTL:保持原有的过期时间。

应用场景

  1. 缓存:用于存储频繁读取且更新不频繁的数据,如用户会话和网页内容。
  2. 计数器:用于统计数据,如帖子的点赞数。
  3. 分布式锁:用于在分布式系统中同步资源访问,确保安全地获取和释放锁。
  4. Session共享:在分布式Web应用中共享Session信息,以维持用户状态。

如果讲解有不对之处还请指正,我会尽快修改,多谢大家的包容。

如果大家喜欢这个系列,还请大家多多支持啦😋!

如果这篇文章有帮到你,还请给我一个大拇指 👍和小星星 ⭐️支持一下白晨吧!喜欢白晨【Redis】系列的话,不如关注👀白晨,以便看到最新更新哟!!!

我是不太能熬夜的白晨,我们下篇文章见。

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

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

相关文章

操作系统总结(2)

目录 2.1 进程的概念、组成、特征 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;进程的概念 &#xff08;3&#xff09;进程的组成—PCB &#xff08;4&#xff09;进程的组成---程序段和数据段 &#xff08;5&#xff09;程序是如何运行的呢&#xff1f…

《中国企业报》集团数字产业发展研究院介绍

《中国企业报》集团数字产业发展研究院&#xff08;以下简称“中企数研院”&#xff09;&#xff0c;隶属于《中国企业报》集团管理。“中企数研院”致力于“数字经济产业化发展战略”大背景下&#xff0c;以“县域数字经济”、“企业数字化转型”及“数字人民币”推广等发展方…

串口服务器在工业控制领域的应用:深度解析与前沿实践

在工业控制领域&#xff0c;随着技术的不断发展&#xff0c;传统的串口通信方式已经难以满足现代工业系统对高效、稳定、安全通信的需求。此时&#xff0c;串口服务器作为一种先进的通信技术解决方案&#xff0c;正在逐步改变工业控制领域的通信格局。本文将深度解析串口服务器…

Timeline

SignalTrack信号轨道和自定义带参数的Marker信号和轨道 MySignalReceiver using System; using System.ComponentModel; using UnityEngine.Playables; using UnityEngine.Events;namespace UnityEngine.Timeline { public class BaseSignalReceiver<T, Q> : MonoBeha…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了&#xff0c;你就逃过一劫了&#xff1f;那不是还有分手呢&#xff0c;那不是还得再找对象呢&#xff0c;那不是还有七夕节呢&#xff0c;那不是还有纪念日呢&#xff0c;那不是还有各种各样的节日呢&#xff0c;所以呀&#xff0c;这8种HTML5 CSS3打造8种心形…

Python100个库分享第23个—wordcloud(词云图)

目录 专栏导读库的介绍库的安装基础使用1&#xff1a;将TXT文本转为词云图基础使用2&#xff1a;使用自定义字体和形状基础使用3&#xff1a;中文词云图停用词(中英文版)-代码是中文版总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

10个企业用的wordpress中文模板

移民wordpress主题 移民代办wordpress主题&#xff0c;适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 模特演出wordpress主题 暗黑风格的wordpress主题模板&#xff0c;适用于模特演出公司或艺人经纪公司搭建wordpre…

YOLOv8原理详解

Yolov8是2023年1月份开源的。与yolov5一样&#xff0c;支持目标检测、分类、分割任务。 Yolov8主要改进之处有以下几个方面&#xff1a; Backbone&#xff1a;依旧采用的CSP的思想&#xff0c;不过将Yolov5中的C3模块替换为C2F模块&#xff0c;进一步降低了参数量&#xff0c…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

RabbitMQ 交换机类型

常用交换机 发布订阅&#xff08;Publish/Subscribe&#xff09;交换机 一个生产者给多个队列发送消息&#xff0c;X 代表交换机。 交换机的作用&#xff1a;类似网络路由器&#xff0c;主要提供转发功能&#xff0c;解决怎么把消息转发到不同的队列中&#xff0c;让消费者从不…

第十八篇:探索非关系型数据库:从入门到实践

探索非关系型数据库&#xff1a;从入门到实践 1. 引言 1.1 非关系型数据库的崛起&#xff1a;背景与重要性 在过去的几十年里&#xff0c;关系型数据库&#xff08;RDBMS&#xff09;一直在数据存储和管理领域占据主导地位。其严谨的结构化数据模型以及强大的事务处理能力&am…

Mysql触发器优化大数据表

背景 数据库的订单数量过多&#xff0c;需要分出热表用于快速查询&#xff0c;热表仅保存10天的订单数据。 解决思路 每次数据库订单表触发增删改时&#xff0c;同步操作到trigger_order_mul_info表&#xff0c;然后trigger_order_mul_info会定期删除超过10天的数据。 增删…

家政项目day1 配置说明前端

目录 1.配置1.1 开发环境1.2 配置虚拟机1.3 编写nacos配置中心1.4 配置OSS存储1.5 配置高德地图api 2 设计前端并且进行部署2.1 开发环境2.2 安装类库2.3 修改代码2.4 试运行前端2.4.1 OSS配置验证 1.配置 1.1 开发环境 由于个人资金问题&#xff0c;可能担负不起8h8g的服务器…

React-JSX基础

什么是JSX 概念&#xff1a;JSX是JavaScript和XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在JS代码中编写HTML模板结构&#xff0c;它是React中编写UI模板的方式 优势&#xff1a;1.HTML的声明式模板写法 2.JS的可编程能力 JSX的本质 JSX并不是标准的JS语法&…

学习现货黄金分析技术前 有3点注意

投资者要做现货黄金交易&#xff0c;就需要懂得分析技术&#xff0c;通过分析投资者能找到市场的交易机会。其实分析也是对现货黄金市场进行思考的过程&#xff0c;未经分析而得到的入场机会&#xff0c;失败的可能性是较大的。但是我们在学习现货黄金分析技术之前&#xff0c;…

在做题在学习(60):和可被K整除的子数组

974. 和可被 K 整除的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前缀和 哈希表 同余定理 同余定理&#xff1a; 而此题要求返回能被k整除(%k 0)的子数组的个数&#xff0c;如下图&#xff1a; 把问题转化为——> 有多少个前缀和的余数 sum%k &a…

D60SB60-ASEMI整流桥D60SB60参数、封装、尺寸

编辑&#xff1a;ll D60SB60-ASEMI整流桥D60SB60参数、封装、尺寸 型号&#xff1a;D60SB60 品牌&#xff1a;ASEMI 封装&#xff1a;D-SB 批号&#xff1a;2024 特性&#xff1a;插件、整流桥 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;60A 最大反向击穿…

C++---运算符重载

运算符重载介绍 在类中重新定义运算符&#xff0c;赋予运算符新的功能以适应类的运算&#xff0c;就称为运算符重载。 运算符重载是一种形式的C多态,它使得对象操作更直观,本质上也是属于函数重载。 实际上&#xff0c;我们已经在不知不觉之中使用了运算符重载。例如&#xff…

编一个自己的万年历

编一个自己的万年历 前阶段突然想查一下某一天是星期几&#xff0c;于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm1001.2014.3001.5501]&#xff0c;但是功能很单一&#xff0c;就是单纯的查是星期几。&#xff08;虽然用网…