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

news2024/12/24 10:10:59

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

在这里插入图片描述

文章目录

  • 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.coloradmin.cn/o/1687437.html

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

相关文章

设置 sticky 不生效?会不会是你还是没懂 sticky?

官方描述 基本上可以看懂的就会知道。sticky 是相对于存在滚动条的内容的&#xff0c;啥意思&#xff1f; 就是不论你被谁包着&#xff0c;你只会往上找有 overflow 属性的盒子进行定位&#xff0c;包括&#xff1a;overflow:hidden; overflow:scroll; overflow:auto; overflo…

一键批量提取TXT文档前N行,高效处理海量文本数据,省时省力新方案!

大量的文本信息充斥着我们的工作与生活。无论是研究资料、项目文档还是市场报告&#xff0c;TXT文本文档都是我们获取和整理信息的重要来源。然而&#xff0c;面对成百上千个TXT文档&#xff0c;如何快速提取所需的关键信息&#xff0c;提高工作效率&#xff0c;成为了许多人头…

EI稳定检索--人文社科类会议(ICBAR 2024)

【ACM独立出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024) 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 【高录用•快检索&#xff0c;ACM独立出版-稳定快速EI检索 | 往届均已完成EI, Scopus检索】 【见…

运行vue2项目基本过程

目录 步骤1 步骤2 步骤3 补充&#xff1a; 解决方法&#xff1a; node-scss安装失败解决办法 步骤1 安装npm 步骤2 切换淘宝镜像 #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 步骤3 安装vue-cli npm install…

分布式中traceId链接服务间的日志

使用技术&#xff1a; 网关&#xff1a;SpringCloudGateway RPC调用&#xff1a;Feign 一&#xff1a;在网关入口处设置header&#xff1a;key-traceId&#xff0c;value-UUID import com.kw.framework.common.croe.constant.CommonConstant; import com.kw.framework.gateway…

机器学习高斯贝叶斯算法实战:判断肿瘤是良性还是恶性

概述 我们使用威斯康星乳腺肿瘤数据集&#xff0c;来构建一个机器学习模型&#xff0c;用来判断患者的肿瘤是良性还是恶性。 数据分析 威斯康星乳腺肿瘤数据集&#xff0c;包括569个病例的数据样本&#xff0c;每个样本具有30个特征值。 样本分为两类&#xff1a;恶性Malig…

SHA1获取

这里写目录标题 JDK获取uniapp开发Dcould获取 JDK获取 一、下载jdk 链接: http://www.oracle.com/ 二、安装直接下一步下一步 三、配置环境变量 先新增变量JAVA_HOME变量值为C:\devUtils\jdk (jdk安装路径位置)再配置Path(%JAVA_HOME%\bin) 四、创建SHA1安全证书 win r输入cmd…

常见应用流量特征分析

目录 1.sqlmap 1.常规GET请求 2.通过--os-shell写入shell 3.post请求 2.蚁剑 编码加密后 3.冰蝎 冰蝎_v4.1 冰蝎3.2.1 4.菜刀 5.哥斯拉 1.sqlmap 1.常规GET请求 使用的是sqli-labs的less7 &#xff08;1&#xff09;User-Agent由很明显的sqlmap的标志&#xff0c;展…

如何快速增加外链?

要快速增加外链并不难&#xff0c;相信各位都知道&#xff0c;难的是快速增加外链且没有风险&#xff0c;所以这时候GNB外链的重要性就出现了&#xff0c;这是一种自然的外链&#xff0c;何谓自然的外链&#xff0c;在谷歌的体系当中&#xff0c;自然外链指的就是其他网站资源给…

[Spring Boot]baomidou 多数据源

文章目录 简述本文涉及代码已开源 项目配置pom引入baomidouyml增加dynamic配置启动类增加注解配置结束 业务调用注解DS()TransactionalDSTransactional自定义数据源注解MySQL2 测试调用查询接口单数据源事务测试多数据源事务如果依然使用Transactional会怎样&#xff1f;测试正…

不同类型的区块链钱包有什么特点和适用场景?

区块链钱包是用于存储和管理加密货币的重要工具&#xff0c;市面上有许多不同类型的区块链钱包可供选择。以下是几种主要类型的区块链钱包及其特点和适用场景。 1.软件钱包&#xff1a; 特点&#xff1a;软件钱包是最常见的一种区块链钱包&#xff0c;通常作为软件应用程序提供…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

第17讲:C语言内存函数

目录 1.memcpy使用和模拟实现2.memmove使用和模拟实现3.memset函数的使用4.memcmp函数的使用 1.memcpy使用和模拟实现 void * memcpy (void * destination, const void * source, size_t num);• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存…

分析电脑上处理器的性能报告

这张图片给出了一份详细的第11代Intel(R) Core(TM) i7-1165G7 2.80GHz处理器的性能报告。 CPU型号&#xff1a;11th Gen Intel(R) Core(TM) i7-1165G7&#xff08;这是一个低功耗的移动处理器&#xff0c;常用于轻薄型笔记本电脑&#xff09; 基准速度&#xff1a;2.80 GHz&…

C语言-信号

信号 一、信号是什么东西 信号是事件发生时通知进程的一种机制&#xff0c;有时也称之为软件中断。 信号的到来会打断了程序执行的正常流程。 大多数情况下&#xff0c;无法预测信号到达的精确时间。 一个&#xff08;具有合适权限的&#xff09;进程能够向另一进程发送信…

python查找内容在文件中的第几行(利用了滑动窗口)

def find_multiline_content(file_path, multiline_content):with open(file_path, r) as file:# 文件内容file_lines file.readlines()# 待检测内容multiline_lines multiline_content.strip().split(\n)# 待检测内容总行数num_multiline_lines len(multiline_lines)matchi…

Postgresql源码(130)ExecInterpExpr转换为IR的流程

相关 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 《Postgresql源码&#xff08;129&#xff09;JIT函数中如何使用PG的类型llvmjit_types》 表达式计算…

计算机系统基础 8 循环程序

概要 两种实现方法——分支指令实现和专门的循环语句实现以及有关循环的优化。 分支指令实现 倒计数 …… MOV ECX&#xff0c;循环次数 LOOPA&#xff1a;…… …… DEC ECX JNE LOOPA 正计数 …… MOV ECX&#xff0c;0 LOOPA&#xff1a; …… INC ECX CMP …

Kafka-集群管理者(Controller)选举机制、任期(epoch)机制

Kafka概述 Kafka-集群管理者&#xff08;Controller&#xff09;选举机制 Kafka中的Controller是Kafka集群中的一个特殊角色&#xff0c;负责对整个集群进行管理和协调。Controller的主要职责包括分区分配、副本管理、Leader选举等。当当前的Controller节点失效或需要进行重新…

【CALayer-CALayer的transform属性 Objective-C语言】

一、接下来,我们来说的是这个,transform的属性 1.layer的transform属性, 把最后一份代码command + C、command + V、一份儿,改个名字, Name:04-CALayer的transform属性, 我们把这个代码稍微修改一下, 我们先添加了一个layer,到控制器的view上, 然后呢,这两句话不…