【Redis】Redis十大数据类型—字符串String

news2025/1/24 11:43:57

介绍

在这里插入图片描述

获取命令地址

英文:https://redis.io/commands/

中文:http://www.redis.cn/commands.html

字符串(string)

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。

一个字符串类型的值最多能存储512M字节的内容。

单值单value

可以用Redis字符串做许多,例如:

  • 利用INCR命令簇(INCR, DECR, INCRBY)来把字符串当作原子计数器使用。
  • 使用APPEND命令在字符串后添加内容。
  • 将字符串作为GETRANGE 和 SETRANGE的随机访问向量。
  • 在小空间里编码大量数据,或者使用 GETBIT 和 SETBIT创建一个Redis支持的Bloom过滤器。

常用命令

在这里插入图片描述在这里插入图片描述

常用案例

SET

set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]

在这里插入图片描述

[NX|XX]
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 v1 nx #键存在了,返回nil
(nil)
127.0.0.1:6379> set k1 v1ss xx #键存在时设置键值
OK
127.0.0.1:6379> set k1 v1ss xx
OK
127.0.0.1:6379> set k1 v1ss xx
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1ss"
[GET]
127.0.0.1:6379> set k1 v1 get #先返回键原本的值,然后将新的值写入
"v1ss"
127.0.0.1:6379> get k1
"v1"
[EX]
127.0.0.1:6379> set k1 v1 EX 30
OK
127.0.0.1:6379> TTL k1
(integer) 23
127.0.0.1:6379> TTL k1
(integer) 21
[KEEPTTL]
127.0.0.1:6379> set k1 v1 EX 30 #设置过期时间为30
OK
127.0.0.1:6379> TTL k1
(integer) 23
127.0.0.1:6379> TTL k1
(integer) 21
127.0.0.1:6379> set k1 v11 #重新设置后,变成默认,永不过期,如果需要将过期时间延续的话,需要用到keepttl
OK
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> set k1 v1 ex 60
OK
127.0.0.1:6379> ttl k1
(integer) 58
127.0.0.1:6379> set k1 v11 keepttl
OK
127.0.0.1:6379> ttl k1
(integer) 47
127.0.0.1:6379> get k1
"v11"

MSET

MSET key value [key value ....]

127.0.0.1:6379> MSET k1 v1 k2 v2
OK

MGET

MGET key [key ....]

127.0.0.1:6379> MGET k1 k2
1) "v1"
2) "v2"

MSETNX

MSETNX key value [key value ...]

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

127.0.0.1:6379> MSET k1 v1 k2 v2
OK
127.0.0.1:6379> MGET k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> MSETNX k1 v1 k3 v3 #因为k1已经存在,所以该命令失败,k3没有
(integer) 0
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> MSETNX k3 v3 k4 v4 #当且仅当所有的key都不存在时该命令才成功
(integer) 1
127.0.0.1:6379> get k3
"v3"

GETRANGE

GETRANGE key start end

获取指定区间范围内的值,类似between…and的关系
从零到负一表示全部

127.0.0.1:6379> set k5 abcdefg
OK
127.0.0.1:6379> GETRANGE k5 0 -1
"abcdefg"
127.0.0.1:6379> GETRANGE k5 0 2
"abc"
127.0.0.1:6379> GETRANGE k5 1 4
"bcde"

SETRANGE

SETRANGE key offset value

设置指定区间范围内的值,格式是setrange key值 具体值

127.0.0.1:6379> get k5
"abcdefg"
127.0.0.1:6379> SETRANGE k5 2 kuangdi
(integer) 9
127.0.0.1:6379> get k5
"abkuangdi"

INCR

INCR key

只有数字才能进行加

127.0.0.1:6379> set k6 100
OK
127.0.0.1:6379> get k6
"100"
127.0.0.1:6379> INCR k6
(integer) 101
127.0.0.1:6379> get k6
"101"

INCRBY

INCRBY key increment

增加指定的整数

127.0.0.1:6379> get k6
"101"
127.0.0.1:6379> INCRBY k6 100
(integer) 201
127.0.0.1:6379> get k6
"201"

DECR

DECR key

只有数字才能进行减

127.0.0.1:6379> get k6
"201"
127.0.0.1:6379> DECR k6
(integer) 200
127.0.0.1:6379> get k6
"200"

DECRBY

DECRBY key decrement

减少指定的整数

127.0.0.1:6379> get k6
"200"
127.0.0.1:6379> DECRBY k6 100
(integer) 100
127.0.0.1:6379> get k6
"100"

SETNX

SETNX key value

不存在就插入

127.0.0.1:6379> setnx k7 200
(integer) 1
127.0.0.1:6379> setnx k6 200
(integer) 0
127.0.0.1:6379> get k6
"100"
127.0.0.1:6379> get k7
"200"

SETEX

SETEX key seconds value

相当于:

SET key value EX seconds

设置值并设置过期时间

127.0.0.1:6379> SETEX k9 60 v9
OK
127.0.0.1:6379> ttl k9
(integer) 56

应用场景

缓存对象

使用 String 来缓存对象有两种方式:

  • 直接缓存整个对象的 JSON,命令例子:SET user:1 '{"name":"xiaolin", "age":18}'
  • 采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子:MSET user:1:name xiaolin user:1:age 18 user:2:name xiaomei user:2:age 20

常规计数

因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。

计算文章的阅读量:

# 初始化文章的阅读量
> SET aritcle:readcount:1001 0
OK
#阅读量+1
> INCR aritcle:readcount:1001
(integer) 1
#阅读量+1
> INCR aritcle:readcount:1001
(integer) 2
#阅读量+1
> INCR aritcle:readcount:1001
(integer) 3
# 获取对应文章的阅读量
> GET aritcle:readcount:1001
"3"

分布式锁

SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁:

  • 如果 key 不存在,则显示插入成功,可以用来表示加锁成功;
  • 如果 key 存在,则会显示插入失败,可以用来表示加锁失败。

一般而言,还会对分布式锁加上过期时间,分布式锁的命令如下:

SET lock_key unique_value NX PX 10000

  • lock_key 就是 key 键;
  • unique_value 是客户端生成的唯一的标识;
  • NX 代表只在 lock_key 不存在时,才对 lock_key 进行设置操作;
  • PX 10000 表示设置 lock_key 的过期时间为 10s,这是为了避免客户端发生异常而无法释放锁。

而解锁的过程就是将 lock_key 键删除,但不能乱删,要保证执行操作的客户端就是加锁的客户端。所以,解锁的时候,我们要先判断锁的 unique_value 是否为加锁客户端,是的话,才将 lock_key 键删除。

可以看到,解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性,因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,保证了锁释放操作的原子性。

// 释放锁时,先比较 unique_value 是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

这样一来,就通过使用 SET 命令和 Lua 脚本在 Redis 单节点上完成了分布式锁的加锁和解锁。

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

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

相关文章

STM:基于Siamese编码器的时空混频器用于CT扫描肺结节生长趋势预测

文章目录 Siamese Encoder-based Spatial-Temporal Mixer for Growth Trend Prediction of Lung Nodules on CT Scans摘要方法Spatial-Temporal MixerTwo-Layer H-Loss 实验结果 Siamese Encoder-based Spatial-Temporal Mixer for Growth Trend Prediction of Lung Nodules on…

JavaScript的三座大山

前言:这个题目是抄的,看着很有意思,就拿过用了,毕竟CV是程序员的基本功底嘛,顺带把图也拿过来了 作用域和闭包 这个几乎是天天在用的东西,可能有些人甚至不知道这个概念,但是用到过这种方法去解…

Dubbo消费者调用流程分析

消费者在发起一次调用的时候时序图如下 由于Dubbo调用是基于动态代理的方式,所以请求先进入 InvokerInvocationHandler#invoke()方法,进而调用到MockClusterInvoker#invoke()方法。MockClusterInvoker#invoke()中判断是否需要开启 Mock,如果开启 Mock 调用 doMockInvoke 执行…

WebRTC系列-Qos系列之AEC-可配置参数

文章目录 1. 简介2. 源码中相关参数WebRTC的自适应回声消除(AEC)是一个广泛使用的技术,用于在音频通信中消除扬声器输出产生的回声。在WebRTC中,有三种AEC算法可供选择,分别是 AECM、 AEC和 AEC3。本文将介绍WebRTC AEC 3算法的原理和应用场景。 在上图中可以看出AEC算…

MiniGPT4,开源了。

大家好,我是 Jack。 一个月前,我发布过一篇文章,讲解了 GPT4 的发布会。 ChatGPT 的对话能力,想必大家也早已体验过了,无论是文本生成能力,还是写代码的能力,甚至是上下文的关联对话能力&#…

SpringBoot自定义登录、权限验证

1、首先最基础的User实体类,使用了lombok,所以省略了getter、setter方法 Data public class UserInfo implements Serializable {private Integer id;//用户名private String username;//密码不需要被序列化存入redisprivate transient String password…

vue3类型uniapp调用signalr

目录 背景 安装 renderjs 1选择一个tab页面承载renderjs代码 2编写业务逻辑代码 3编写renderjs代码 背景 后端使用.net6开发,长链接选择了微软的signalr而非原生的websocket 前端uniapp下vue3类型开发的app,需要通过长链接获取后端推送的消息 安…

通过对话了解cookie session与token的用途和区别

1 先来了解cookie与localstorage 1.1 http的无状态 用户: 我想看csdn我有多少粉丝了(http请求) 服务器:你是?请告诉我你的名字和密码,我确认你是谁 用户:发起登录请求 admin 123456 服务器:ok,登录成功 用户&…

分享几个国内免费的ChatGPT镜像网址(亲测有效)

最近由于ChatGPT的爆火也让很多小伙伴想去感受一下ChatGPT的魅力,那么今天就分享几个ChatGPT国内的镜像网址,大家可以直接使用!记得点赞收藏一下呦! 1、AQ Bot,网址:点我 https://su.askaiw.com/aq 缺点&…

搭建CDH流程记录

搭建CDH流程记录 如何搭建本地yum源 1.配置yum源这里使用 阿里源 http://mirrors.aliyun.com/repo/Centos-7.repo wget http://mirrors.aliyun.com/repo/Centos-7.repo2.安装http软件 yum install httpd -y3.配置httpd.conf vi /etc/httpd/conf/httpd.conf在 AddType appli…

酒店行业开启“狂飙”,尚美数智稳步领跑

文|智能相对论 作者|范柔丝 在消费行业迅速复苏的浪潮下,无论从销量还是数量来看,酒旅行业蛰伏三年后,终于开启了业绩狂飙。 从数量来看,企查查数据显示,截至目前,我国现存酒店相关企业233.5万家&#x…

Grafana链接跳转与值传递,把表格变量值从一个dashboard传递给另一个dashboard

文章目录 1. 创建两个空白 Dashboard 用于实验2. dash_1:创建跳转用的表格2. dash_2:配置接收数据的变量 Variables3. 测试跳转4. 通过跳转的变量传递方法总结 这里,我们一步步的来,通过配置一个页面跳转的效果,把一个…

二结(4.18)项目进度

今天学长上了多线程的课程,内容挺广泛的,部分也需要实际运用到项目中来,但我的登录、注册实现还没区分开服务端和客户端(仅在同一项目里实现) --------------------------------------------------------------------…

【分布式系统】分布式系统架构的冰与火

什么是分布式系统 分布式系统(distributed system)是建立在网络之上的软件系统。 以上是摘自百度百科的解释,不可否则,分布式系统的基础是网络、计算、存储。比如常见的一个Web单体系统,其实也是一个分布式系统&#x…

Android监听消息(二)——电话及短信监听

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为2747字,预计阅读6分钟 前言 前面一篇《Android监听消息(一)——应用消息捕获》我们使用NotificationListenerService实现了应用的消息监听,但是电话和短信是…

【花雕学AI】爆款ChatGPT的核心算法和技术逻辑到底是什么?

一、ChatGPT是一种基于GPT模型的聊天机器人 由OpenAI研究中心开发,于2022年11月30日发布。它可以根据用户的输入,生成自然、流畅、有趣的对话回复。它的技术逻辑主要是利用大规模的预训练语言模型(LLM),通过Transforme…

总结823

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:早上1.5小时背单词,背了两篇文章,之后抄写5篇文章。晚上做了一道长难句。 …

CAN-FD协议

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 CAN-FD协议**CAN-FD协议需要什么?**CAN-FD 协议的属性CAN-FD 协议中的安全性 OSI 层中的 CAN-FD**CAN-FD物理层设计**CAN-FD 数据链路层数据链路层…

【2023】cookie是什么?有什么用?一篇文章彻底搞懂cookie

一个不大不小的问题 假设服务器有一个接口,通过请求这个接口,可以添加一个管理员 但是,不是任何人都有权力做这种操作的 那么服务器如何知道请求接口的人是有权力的呢? 答案是:只有登录过的管理员才能做这种操作 …

一天掌握C51单片机基础1-计算机数值与MCS51单片机

目录 简介计算机的数值表示源码反码补码 MCS51 单片机型号与构成存储结构外部引脚与总线接口并行 IO 口工作原理工作周期 简介 本笔记参考B站高宏亮老师的教学视频:点击观看 计算机的数值表示 源码 正数:首位 0,其余七位表示实际数值 负数&…