Redis 中最常用的数据结构之一:String 数据类型介绍

Redis

大家好,我是香香。

在之前的 Redis 专栏 介绍与安装 Redis,高性能内存数据存储系统 我们介绍到了 Redis 支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。 那我们今天来讲讲对 Redis 数据类型 String 的理解:

我们先来了解以下 Redis 中对 Key 的命令操作:

复制代码
127.0.0.1:6379> ping  #查看当前连接是否正常,正常返回PONG
PONG
127.0.0.1:6379> clear  #清楚当前控制台(为了更好的看到下面输入的命令)
127.0.0.1:6379> keys *  #查看当前库里所有的key
1) "db"
127.0.0.1:6379> FLUSHALL  #清空所有库的内容
OK
127.0.0.1:6379> keys * 
(empty array)
127.0.0.1:6379> set name dingdada  #添加一个key为'name' value为'dingdada'的数据
OK
127.0.0.1:6379> get name  #查询key为'name'的value值
"dingdada"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set name1 dingdada2
OK
127.0.0.1:6379> get name1
"dingdada2"
127.0.0.1:6379> keys *  #查看当前库里所有的key
1) "name1"
2) "name"
127.0.0.1:6379> EXISTS name  #判断当前key是否存在
(integer) 1
127.0.0.1:6379> move name 1  #移除当前库1的key为'name'的数据
(integer) 1
127.0.0.1:6379> keys *
1) "name1"
127.0.0.1:6379> FLUSHALL  #再次清空所有库的内容
OK

## 多加几条数据 测试设置key的过期时间
127.0.0.1:6379> set name dingdada
OK
127.0.0.1:6379> set name1 dingdada1
OK
127.0.0.1:6379> set name2 dingdada2
OK
127.0.0.1:6379> EXPIRE name 15  #设置key为'name'的数据过期时间为15秒 单位seconds
(integer) 1
127.0.0.1:6379> ttl name  #查看当前key为'name'的剩余生命周期时间
(integer) 13
127.0.0.1:6379> ttl name
(integer) 11
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name  #如若返回-2,证明key已过期
(integer) -2
127.0.0.1:6379> get name    #再次查询即为空
(nil)
127.0.0.1:6379> type name1   # 获取key为'name1'的数据类型
string
127.0.0.1:6379> move name1 1
(integer) 1 # 将key为'key2'移动到数据库1中

如果有不知道的命令,可以去 Redis 官网 - Redis 命令大全 去查;

数据类型 String

  • 添加、查询、追加、获取长度,判断是否存在:

    127.0.0.1:6379> set name dingdada #插入一个key为'name'值为'dingdada'的数据
    OK
    127.0.0.1:6379> get name #获取key为'name'的数据
    "dingdada"
    127.0.0.1:6379> get key1
    "hello world!"
    127.0.0.1:6379> keys * #查看当前库的所有数据

    1. "name"
      127.0.0.1:6379> EXISTS name #判断key为'name'的数据存在不存在,存在返回1
      (integer) 1
      127.0.0.1:6379> EXISTS name1 #不存在返回0
      (integer) 0
      127.0.0.1:6379> APPEND name1 dingdada1 #追加到key为'name'的数据后拼接值为'dingdada1',如果key存在类似于java中字符串'+',不存在则新增一个,类似于Redis中的set name1 dingdada1 ,并且返回该数据的总长度
      (integer) 9
      127.0.0.1:6379> get name1
      "dingdada1"
      127.0.0.1:6379> STRLEN name1 #查看key为'name1'的字符串长度
      (integer) 9
      127.0.0.1:6379> APPEND name1 ,dingdada2 #追加,key存在的话,拼接'+',返回总长度
      (integer) 19
      127.0.0.1:6379> STRLEN name1
      (integer) 19
      127.0.0.1:6379> get name1
      "dingdada1,dingdada2"
      127.0.0.1:6379> set key1 "hello world!" #注意点:插入的数据中如果有空格的数据,请用""双引号,否则会报错!
      OK
      127.0.0.1:6379> set key1 hello world! #报错,因为在Redis中空格就是分隔符,相当于该参数已结束
      (error) ERR syntax error
      127.0.0.1:6379> set key1 hello,world! #逗号是可以的
      OK
  • 自增/自减操作:

    127.0.0.1:6379> set num 0 #插入一个初始值为0的数据
    OK
    127.0.0.1:6379> get num
    "0"
    127.0.0.1:6379> incr num #指定key为'num'的数据自增1,返回结果 相当于java中 i++
    (integer) 1
    127.0.0.1:6379> get num #一般用来做文章浏览量、点赞数、收藏数等功能
    "1"
    127.0.0.1:6379> incr num
    (integer) 2
    127.0.0.1:6379> incr num
    (integer) 3
    127.0.0.1:6379> get num
    "3"
    127.0.0.1:6379> decr num #指定key为'num'的数据自减1,返回结果 相当于java中 i--
    (integer) 2
    127.0.0.1:6379> decr num
    (integer) 1
    127.0.0.1:6379> decr num
    (integer) 0
    127.0.0.1:6379> decr num #可以一直减为负数~
    (integer) -1
    127.0.0.1:6379> decr num #一般用来做文章取消点赞、取消收藏等功能
    (integer) -2
    127.0.0.1:6379> decr num
    (integer) -3
    127.0.0.1:6379> INCRBY num 10 #后面跟上by 指定key为'num'的数据自增'参数(10)',返回结果
    (integer) 7
    127.0.0.1:6379> INCRBY num 10
    (integer) 17
    127.0.0.1:6379> DECRBY num 3 #后面跟上by 指定key为'num'的数据自减'参数(3)',返回结果
    (integer) 14
    127.0.0.1:6379> DECRBY num 3
    (integer) 11

  • 截取/替换操作:

    #截取
    127.0.0.1:6379> set key1 "hello world!"
    OK
    127.0.0.1:6379> get key1
    "hello world!"
    127.0.0.1:6379> GETRANGE key1 0 4 #截取字符串,相当于java中的subString,下标从0开始,不会改变原有数据
    "hello"
    127.0.0.1:6379> get key1
    "hello world!"
    127.0.0.1:6379> GETRANGE key1 0 -1 #0至-1相当于 get key1,效果一致,获取整条数据
    "hello world!"
    #替换
    127.0.0.1:6379> set key2 "hello,,,world!"
    OK
    127.0.0.1:6379> get key2
    "hello,,,world!"
    127.0.0.1:6379> SETRANGE key2 5 888 #此语句跟java中replace有点类似,下标也是从0开始,但是有区别:java中是指定替换字符,Redis中是从指定位置开始替换,替换的数据根据你所需替换的长度一致,返回值是替换后的长度
    (integer) 14
    127.0.0.1:6379> get key2
    "hello888world!"
    127.0.0.1:6379> SETRANGE key2 5 67 #该处只替换了两位
    (integer) 14
    127.0.0.1:6379> get key2
    "hello678world!"

  • 设置过期时间、不存在设置操作:

    #设置过期时间,跟Expire的区别是前者设置已存在的key的过期时间,而setex是在创建的时候设置过期时间
    127.0.0.1:6379> setex name1 15 dingdada #新建一个key为'name1',值为'dingdada',过期时间为15秒的字符串数据
    OK
    127.0.0.1:6379> ttl name1 #查看key为'name1'的key的过期时间
    (integer) 6
    127.0.0.1:6379> ttl name1
    (integer) 5
    127.0.0.1:6379> ttl name1
    (integer) 3
    127.0.0.1:6379> ttl name1
    (integer) 1
    127.0.0.1:6379> ttl name1
    (integer) 0
    127.0.0.1:6379> ttl name1 #返回为-2时证明该key已过期,即不存在
    (integer) -2
    #不存在设置
    127.0.0.1:6379> setnx name2 dingdada2 #如果key为'name2'不存在,新增数据,返回值1证明成功
    (integer) 1
    127.0.0.1:6379> get name2
    "dingdada2"
    127.0.0.1:6379> keys *

    1. "name2"
      127.0.0.1:6379> setnx name2 "dingdada3" #如果key为'name2'的已存在,设置失败,返回值0,也就是说这个跟set的区别是:set会替换原有的值,而setnx不会,存在即不设置,确保了数据误操作~
      (integer) 0
      127.0.0.1:6379> get name2
      "dingdada2"
  • mset/mget操作(多条数据操作):

    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #插入多条数据
    OK
    127.0.0.1:6379> keys * #查询所有数据

    1. "k2"
    2. "k3"
    3. "k1"
      127.0.0.1:6379> mget k1 k2 k3 #查询key为'k1','k2','k3'的数据
    4. "v1"
    5. "v2"
    6. "v3"
      127.0.0.1:6379> MSETNX k1 v1 k4 v4 #msetnx是一个原子性的操作,在一定程度上保证了事务!要么都成功,要么都失败!相当于if中的条件&&(与)
      (integer) 0
      127.0.0.1:6379> keys *
    7. "k2"
    8. "k3"
    9. "k1"
      127.0.0.1:6379> MSETNX k5 v5 k4 v4 #全部成功
      (integer) 1
      127.0.0.1:6379> keys *
    10. "k2"
    11. "k4"
    12. "k3"
    13. "k5"
    14. "k1"
  • 添加获取对象和 getset 操作:

    #这里其实本质上还是字符串,但是我们讲其key巧妙的设计了一下。
    ##mset student:1:name student 相当于类名,1 相当于id,name 相当于属性
    #如果所需数据全部这样设计,那么我们在java的业务代码中,就不需要关注太多的key
    #只需要找到student类,下面哪个id,需要哪个属性即可,减少了代码的繁琐,在一定程度上可以理解为这个一个类的对象!
    127.0.0.1:6379> mset student:1:name dingdada student:1:age 22 #新增一个key为'student:1:name',value为'dingdada '。。等数据
    OK
    127.0.0.1:6379> keys * #查看所有的key

    1. "student:1:age"
    2. "student:1:name"
      127.0.0.1:6379> mget student:1:age student:1:name #获取数据
    3. "22"
    4. "dingdada"

    ##getset操作
    127.0.0.1:6379> getset name1 dingdada1 #先get再set,先获取key,如果没有,set值进去,返回的是get的值
    (nil)
    127.0.0.1:6379> get name1
    "dingdada1"
    127.0.0.1:6379> getset name1 dingdada2 ##先获取key,如果有,set(替换)最新的值进去,返回的是get的值
    "dingdada1"
    127.0.0.1:6379> get name1 #替换成功
    "dingdada2"

字符串数据类型在Redis中被广泛应用,例如用于缓存数据、存储会话信息、计数器等场景。

总结:

在 Redis 中,字符串(string)数据类型是最简单和最常用的数据类型之一。 具有以下特点:

  • 存储简单值: 字符串类型可以存储任意类型的数据,例如文本、数字或二进制数据。

  • 键值对存储: 每个字符串类型的键都对应着一个值,类似于键值对的形式,可以通过键快速访问对应的值。

  • 操作方法: 字符串类型支持多种操作方法,例如设置值、获取值、追加字符串、自增、自减等。

  • 常见操作: 常见的操作包括设置值(SET)、获取值(GET)、设置过期时间(EXPIRE)、自增自减(INCR、DECR)等。

相关推荐
IT大白鼠4 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
lbb 小魔仙4 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除5 天前
redis--018
redis
两锭子5 天前
Redis基础
redis
烟沙九洲5 天前
Redis 缓存穿透、缓存击穿、缓存雪崩
数据库·redis
字节探索5 天前
Redis 只会当缓存用?这 10 大实战场景,让你的系统快到飞起
redis·后端
于樱花森上飞舞5 天前
【Redis】哨兵详解
java·开发语言·数据库·redis
Rain的Java大神之路5 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog5 天前
Java 接入Redis: 通用命令与键管理
java·服务器·redis