欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 【redis】数据类型之string

【redis】数据类型之string

2025/2/8 18:04:24 来源:https://blog.csdn.net/u022812849/article/details/145475930  浏览:    关键词:【redis】数据类型之string

字符串类型是Redis最基础的数据结构。首先key都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习打下基础。

字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

有关string类型的命令可以通过help @string命令来查看。有关命令的使用可以通过help 命令来查看,例如help set

参考文档:http://redisdoc.com/

字符串操作

GET

get:获取值。

语法:

GET key

使用:

127.0.0.1:6379> get hi
"hello"

SET

set:设置值

语法:

SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

SET命令的选项:

  • EX seconds:为键设置过期时间,单位为秒。

  • PX milliseconds:为键设置过期时间,单位为毫秒。

  • EXAT timestamp:为键设置过期的时间戳,单位为秒。

  • PXAT milliseconds-timestamp:为键设置过期的时间戳,单位为毫秒。

  • NX:键必须不存在,才可以设置成功,用于添加。

  • XX:与-NX相反,键必须存在,才可以设置成功,用于更新。

  • GET:返回键中存储的旧字符串,如果键不存在则返回nil值。当使用此选项时,如果键中存储的值不是字符串,将返回错误并中止设置操作。

  • KEEPTTL:保留与键关联的剩余时间。如果键已经设置了过期时间,使用这个选项将不会改变其过期时间。

使用:

# 设置值
127.0.0.1:6379> set k1 v1
OK# 获取值
127.0.0.1:6379> get k1
"v1"# xx 当键不存在时,设置失败
127.0.0.1:6379> set k2 vv1 xx
(nil)# xx 当键存在时,设置成功
127.0.0.1:6379> set k1 vv1 xx
OK
127.0.0.1:6379> get k1
"vv1"# nx 当键不存在时,设置成功
127.0.0.1:6379> set k3 v3 nx
OK# nx 当键存在时,设置失败
127.0.0.1:6379> set k1 v3 nx
(nil)# ex 设置过期时间,单位秒
127.0.0.1:6379> set k4 v4 ex 60
OK
127.0.0.1:6379> ttl k4
(integer) 58# px 设置过期时间,单位毫秒
127.0.0.1:6379> set k5 v5 px 60000
OK
127.0.0.1:6379> ttl k5
(integer) 56# exat 设置过期时间戳,单位秒
127.0.0.1:6379> set k6 v6 exat 1736847643
OK
127.0.0.1:6379> ttl k6
(integer) 340# pxat 设置过期时间戳,单位毫秒
127.0.0.1:6379> set k7 v7 pxat 1736847643000
OK
127.0.0.1:6379> ttl k7
(integer) 281# get 获取到旧的value,相当于getset命令
127.0.0.1:6379> set k1 v1 get
"vv1"# keepttl 保留与键关联的剩余时间
127.0.0.1:6379> set k8 v8 ex 60000
OK
127.0.0.1:6379> ttl k8
(integer) 59997
127.0.0.1:6379> set k8 vv8 keepttl
OK
127.0.0.1:6379> ttl k8
(integer) 59968
# 不带keepttl会覆盖过期时间
127.0.0.1:6379> set k8 vv8
OK
127.0.0.1:6379> ttl k8
(integer) -1

时间戳工具网站:http://shijianchuo.wiicha.com/

SETNX

setnx:键必须不存在,才可以设置成功,类似于set命令的nx选项。

语法:

SETNX key value

使用:

127.0.0.1:6379> setnx k2 v2
(integer) 0127.0.0.1:6379> setnx k9 v9
(integer) 1

由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:
https://redis.io/docs/latest/develop/use/patterns/distributed-locks/

SETEX

setex:设置一个带过期时间(单位秒)的值。

语法:

SETEX key seconds value

使用:

127.0.0.1:6379> setex k10 60 v10
OK127.0.0.1:6379> ttl k10
(integer) 58

PSETEX

psetex:设置一个带过期时间(单位毫秒)的值

语法:

PSETEX key milliseconds value

使用:

127.0.0.1:6379> psetex k11 60000 v11
OK127.0.0.1:6379> ttl k11
(integer) 56

GETSET

getset:获取存储在指定键中的值,并将其设置为新值。

语法:

GETSET key value

使用:

127.0.0.1:6379> get k1
"v1"127.0.0.1:6379> getset k1 vv1
"v1"127.0.0.1:6379> get k1
"vv1"

GETDEL

getdel:获取存储在指定键中的值,并立即删除该键值对。。

语法:

GETDEL key

使用:

127.0.0.1:6379> getdel k1
"vv1"127.0.0.1:6379> exists k1
(integer) 0

GETEX

getex:获取键的值的同时,还可以选择设置或更新该键的过期时间。

语法:

GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]

选项说明:

  • key:要获取值的键。

  • EX seconds:设置键在指定秒数后过期。

  • PX milliseconds:设置键在指定毫秒数后过期。

  • EXAT timestamp-seconds:设置键在指定的 Unix 时间戳(秒)过期。

  • PXAT timestamp-milliseconds:设置键在指定的 Unix 时间戳(毫秒)过期。

  • PERSIST:移除键的过期时间。

使用:

127.0.0.1:6379> set mykey hello
OK127.0.0.1:6379> getex mykey ex 60
"hello"127.0.0.1:6379> ttl mykey

MSET

mset:批量设置值。

语法:

MSET key value [key value ...]

使用:

127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK

批量操作命令可以有效提高开发效率,mset还能保证这些key和value一次性设置成功,保证原子性。

MGET

mget:批量获取值。

语法:

MGET key [key ...]

使用:

127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"

MSETNX

msetnx:用于同时设置多个键值对,但仅当这些键都不存在时才会执行设置操作。如果有一个或多个键已经存在,那么MSETNX不会执行任何设置操作,并且会返回一个特定的结果来指示操作是否成功。

语法:

MSETNX key value [key value ...]

使用:

127.0.0.1:6379> mset a 1 b 2 c 3
OK127.0.0.1:6379> msetnx d 4 f 5 a 0
(integer) 0127.0.0.1:6379> msetnx d 4 f 5
(integer) 1

APPEND

append:追加字符串。

语法:

APPEND key value

使用:

127.0.0.1:6379> set k1 hello
OK127.0.0.1:6379> append k1 " word"
(integer) 10127.0.0.1:6379> get k1
"hello word"

SETRANGE

setrange:设置字符串范围的值。

语法:

SETRANGE key offset value

使用:

127.0.0.1:6379> set k1 hello
OK127.0.0.1:6379> setrange k1 3 world
(integer) 8127.0.0.1:6379> get k1
"helworld"

GETRANGE

getrange:获取字符串范围的值。

语法:

GETRANGE key start end

使用:

127.0.0.1:6379> getrange k1 0 3
"helw"

STRLEN

strlen:获取字符串的长度

语法:

STRLEN key

使用:

127.0.0.1:6379> strlen k1
(integer) 8

1653388632305.png

数值操作

INCR

incr:自增1。

语法:

INCR key

使用:

127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range127.0.0.1:6379> incr k2
(integer) 1

key不存在,则从0开始递增,key存在且不是整型会报错。

INCRBY

incrby:增加指定整数步长。

语法:

INCRBY key increment

使用:

127.0.0.1:6379> incrby k2 10
(integer) 11

INCRBYFLOAT

incrbyfloat:增加指定浮点数步长。

语法:

INCRBYFLOAT key increment

使用:

127.0.0.1:6379> incrbyfloat k2 0.5
"11.5"

DECR

decr:减1。

语法:

DECR  key

使用:

127.0.0.1:6379> set k3 10
OK127.0.0.1:6379> decr k3
(integer) 9

DECRBY

decrby:减少指定整数步长。

语法:

DECRBY key increment

使用:

127.0.0.1:6379> decrby k3 5
(integer) 4

内部实现

字符串类型的内部编码有3种:

  • int:8个字节的长整型。

  • embstr:小于等于39个字节的字符串。

  • raw:大于39个字节的字符串。

Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

127.0.0.1:6379> set kk 100
OK127.0.0.1:6379> object encoding kk
"int"127.0.0.1:6379> set kk 100.5
OK127.0.0.1:6379> object encoding kk
"embstr"127.0.0.1:6379> set ke abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmopqrstuvwxyz
OK127.0.0.1:6379> object encoding ke
"raw"

使用场景

  1. 缓存,将一些热点数据存储在redis中,当用户请求过来时直接查询redis,无需查询数据库,减少数据库的压力。

  2. 计数,可用于点赞数、评论数、访问数。

  3. session共享。

  4. 分布式锁。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com