当前位置: 首页 > article >正文

【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) 0

127.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
OK

127.0.0.1:6379> ttl k10
(integer) 58

PSETEX

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

语法:

PSETEX key milliseconds value

使用:

127.0.0.1:6379> psetex k11 60000 v11
OK

127.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
OK

127.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
OK

127.0.0.1:6379> msetnx d 4 f 5 a 0
(integer) 0

127.0.0.1:6379> msetnx d 4 f 5
(integer) 1

APPEND

append:追加字符串。

语法:

APPEND key value

使用:

127.0.0.1:6379> set k1 hello
OK

127.0.0.1:6379> append k1 " word"
(integer) 10

127.0.0.1:6379> get k1
"hello word"

SETRANGE

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

语法:

SETRANGE key offset value

使用:

127.0.0.1:6379> set k1 hello
OK

127.0.0.1:6379> setrange k1 3 world
(integer) 8

127.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 range

127.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
OK

127.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
OK

127.0.0.1:6379> object encoding kk
"int"

127.0.0.1:6379> set kk 100.5
OK

127.0.0.1:6379> object encoding kk
"embstr"

127.0.0.1:6379> set ke abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmopqrstuvwxyz
OK

127.0.0.1:6379> object encoding ke
"raw"

使用场景

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

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

  3. session共享。

  4. 分布式锁。


http://www.kler.cn/a/537195.html

相关文章:

  • 【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化
  • MySQL的底层原理与架构
  • windows 蓝牙驱动开发-传输总线驱动程序常见问题
  • 【银河麒麟高级服务器操作系统】系统日志Call trace现象分析及处理全流程
  • H266/VVC 环路滤波中去块滤波 DF 技术
  • 【AI大模型】Ubuntu18.04安装deepseek-r1模型+服务器部署+内网访问
  • 一条sql 在MySQL中是如何执行的
  • c语言:取绝对值
  • [笔记] 汇编杂记(持续更新)
  • HTML学习笔记(6)
  • ubuntu中如何在vscode的终端目录后显示(当前的git分支名) 实测有用
  • 组合总和II(力扣40)
  • centos7-mini-2009下载docker
  • Cloudflare 2024 网络流量回顾:洞悉网络发展趋势与安全挑战
  • 数据库读写分离、事务的特性、事务隔离级别及默认级别、脏读不可重复读和幻读、更新丢失问题、写偏斜问题、MVCC
  • 【开源免费】基于SpringBoot+Vue.JS智能学习平台系统(JAVA毕业设计)
  • 通过AutoHotkey将Windows按键修改为Mac的快捷键并设置开机自启动
  • 问题大集04-浏览器阻止从 本地 发起的跨域请求,因为服务器的响应头 Access-Control-Allow-Origin 设置为通配符 *
  • Vue3.5 企业级管理系统实战(五):图标组件
  • 远程 IO 模块:汽车零部件产线的高效生产引擎
  • AI智算-k8s部署DeepSeek Janus-Pro-7B 多模态大模型
  • 探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
  • selenium使用
  • Stable Diffusion的入门介绍和使用教程
  • 如何在Swift中实现基本的UI设计?
  • AI眼镜-推理成本降低将加速端侧硬件智能化-AI 眼镜、AI玩具、手机AI化