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

2023-12-14 12:30:02

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’的数据
1)?"v1"
2)?"v2"
3)?"v3"
127.0.0.1:6379>?MSETNX?k1?v1?k4?v4??#msetnx是一个原子性的操作,在一定程度上保证了事务!要么都成功,要么都失败!相当于if中的条件&&(与)
(integer)?0
127.0.0.1:6379>?keys?*
1)?"k2"
2)?"k3"
3)?"k1"
127.0.0.1:6379>?MSETNX?k5?v5?k4?v4??#全部成功
(integer)?1
127.0.0.1:6379>?keys?*
1)?"k2"
2)?"k4"
3)?"k3"
4)?"k5"
5)?"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??#获取数据
1)?"22"
2)?"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)等。

?

?

文章来源:https://blog.csdn.net/weixin_51109279/article/details/134857692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。