Redis五大基本数据类型之字符串(string)

在这里插入图片描述

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

1、String(字符串)

​ string 是 Redis 最基本的类型,最大能存储512MB,它是二进制安全的,意思是 redis 的 string 可以包含任何数据。它类似于 Memcached 一样,不过它可以持久化,而memcache的数据仅保存在内存中,服务器重启后数据将丢失,不会持久化。一个 key 对应一个 value。

2、基本命令

2.1、set命令

set命令时最常用的设置值的命令,主要用于设置给定key的值,如果key已经存在,则会覆盖原来的值,写入新值,忽略数据类型。

具体语法

set key value [expiration EX seconds|PX milliseconds] [NX|XX]

NX:当数据库中key不存在时,可以将key-value添加数据库
XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
EX:key的超时秒数
PX:key的超时毫秒数,与EX互斥

在 Redis 2.6.12 以前版本, set 命令总是返回 OK 。

从 Redis 2.6.12 版本开始, set 在设置操作成功完成时,才返回 OK 。

例如:

127.0.0.1:6379> set name
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set name itbestboy
OK

案例

在redis中设置一个key对应的value

#启动redis-server即服务端,以后台的方式启动,默认不是后台启动的,需要修改redis.conf里面的配置
[root@root /]# redis-server /usr/local/bin/redisconfig/redis.conf 
24334:C 02 Sep 2021 23:48:50.033 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24334:C 02 Sep 2021 23:48:50.033 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=24334, just started
24334:C 02 Sep 2021 23:48:50.033 # Configuration loaded

#启动redis-cli即客户端
[root@root /]# redis-cli -p 6379
#测试
127.0.0.1:6379> ping
PONG

#设置
#1.得到所有的key
127.0.0.1:6379> keys *
(empty list or set)
#2.设置key-value
127.0.0.1:6379> set name itbestboy
OK
#3.查看
127.0.0.1:6379> get name
"itbestboy"
#4.重新设置,默认如果存在相同的key_name。会覆盖对应的值
127.0.0.1:6379> set name it
OK
127.0.0.1:6379> get name
"it"
# 设置当数据库中key存在时,不可以添加
127.0.0.1:6379> set name itbestboy nx
(nil)
# 设置当数据库中key存在时,可以添加
127.0.0.1:6379> set name itbestboy xx
OK
#如果key不存在就会报错
127.0.0.1:6379> set age 12 xx
(nil)

127.0.0.1:6379> set name op
OK
127.0.0.1:6379> get name
"op"

#和json一块使用
127.0.0.1:6379> set user:1 {name:lisi,age:12}
OK
127.0.0.1:6379> get user:1
"{name:lisi,age:12}"

2.2、get命令

get 命令时最常用的获取值的命令,如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。

具体语法

get key

案例

得到上面设置的值

#获取数据库中所有的key
127.0.0.1:6379> keys *
1) "hobby"
2) "name"

#获取不存在的key
127.0.0.1:6379> get age
(nil)
#获取存在的key
127.0.0.1:6379> get name
"itbestboy"
#获取不是string类型的值
127.0.0.1:6379> get hobby
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#查看hobby的类型
127.0.0.1:6379> type hobby
set

2.3、setnx命令

setnx(SET if Not eXists)命令是指当指定的 key 不存在时,为 key 设置值,如果指定的key存在时就会报错,类似于set key name nx

具体语法

setnx key value

:其中key为指定的。

(integer) 0:表示不存在或者错误

(integer) 1:设置成功

案例

假设key为sex,name为F

#判断key是否存在 
127.0.0.1:6379> exists sex
(integer) 0

#设置set
127.0.0.1:6379> setnx sex F
(integer) 1
127.0.0.1:6379> get sex
"F"
#改变性别
127.0.0.1:6379> setnx sex M
(integer) 0 #可以看出设置失败,如果想设置成功,可以使用sex key name 或者 set key name xx
127.0.0.1:6379> get sex
"F"
#可以使覆盖成功
127.0.0.1:6379> set sex M
OK
127.0.0.1:6379> get sex
"M"
127.0.0.1:6379> set sex F
OK
127.0.0.1:6379> get sex
"F"
127.0.0.1:6379> set sex M xx
OK
127.0.0.1:6379> get sex
"M"

2.4、setex命令

setex(set with expire)设置值及其过期时间,如果 key 已经存在, setex命令将会替换旧的值。

具体语法

setex key seconds value

:这里设置的时间是以秒为单位的。过期后会自动删除。

案例

设置sex在30s后过期

#设置30s后过期
127.0.0.1:6379> setex sex 30 F
OK
#查看
127.0.0.1:6379> get sex
"F"
127.0.0.1:6379> ttl sex
(integer) 22
127.0.0.1:6379> get sex
"F"
127.0.0.1:6379> ttl sex
(integer) 13
127.0.0.1:6379> get sex
"F"
127.0.0.1:6379> ttl sex
(integer) 3
127.0.0.1:6379> ttl sex
(integer) 1
#此时已经过期
127.0.0.1:6379> ttl sex
(integer) -2
127.0.0.1:6379> get sex
(nil)
127.0.0.1:6379> ttl sex
(integer) -2
#过期后会自动删除
127.0.0.1:6379> keys *
1) "hobby"
2) "name"

2.5、psetex命令

psetex设置值及其过期时间,如果 key 已经存在, setex命令将会替换旧的值。

具体语法

psetex key milliseconds value

:这里设置的时间是以毫秒为单位的。过期后会自动删除。

案例

设置sex在10000毫秒后过期

127.0.0.1:6379> psetex sex 10000 F
OK
127.0.0.1:6379> ttl sex
(integer) 7
127.0.0.1:6379> ttl sex
(integer) 4
127.0.0.1:6379> get sex
"F"
127.0.0.1:6379> ttl sex
(integer) -2
127.0.0.1:6379> get sex
(nil)

2.6、setrange命令

setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从0开始。相当于更新操作,即update操作

具体语法

setrange key offset value

说明

  • key :指定的key,已经存在,如果不存在就会自动创建。
  • offset:需要覆盖的字符串的下标,默认是从0开始的。
  • value:值

案例

127.0.0.1:6379> get name
"itbestboy"
127.0.0.1:6379> setrange name 14 ,redis
(integer) 20
127.0.0.1:6379> get name
"itbestboy,love,redis"

2.7、mset命令

mset(more set) 命令可以同时设置一个或多个 key-value。

具体语法

mset key value [key value ...]

  • 当设置的key一样时,只会保留最后一个key对应的值,相当于覆盖。
  • 这不是一个原子操作,注意和msetnx区分

案例

#同时设置相同的值对应不同的value
127.0.0.1:6379> mset adress c adress s adress v
OK
127.0.0.1:6379> get adress
"v"
#同时设置不同的key-value
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v4
OK
#查看结果
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"


#特殊设置
127.0.0.1:6379> mset user:1:name wangwu user:1:age 15
OK

2.8、append命令

append 命令用于为指定的 key 追加值。如果 key 已经存在并且是一个字符串,append命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, 就将key对应的值设置为value ,就像set key value一样。相当于MySQL数据库中的插入操作,即inster操作。

具体语法

 append key value

案例

#首先查看此时存在的key-value
127.0.0.1:6379> keys *
1) "hobby"
2) "name"

#1.假设指定的key不存在,则将value设置为所给出的值
127.0.0.1:6379> append k1 China
(integer) 5
127.0.0.1:6379> get k1
"China"

#2.假设指定的key存在,则追加在原值后面
127.0.0.1:6379> append k1 -->Henan
(integer) 13
127.0.0.1:6379> get k1
"China-->Henan"

2.9、incr /incrby命令

incr命令用于自增1,即在原来的基础上自增一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 ince 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

incrby命令用于指定增加的步长。

具体语法

#incr语法
incr key
#incrby语法 increment:步长
incrby key increment

案例

#对k1实现自增。因为k1不能表示成数字,故会报错
127.0.0.1:6379> get k1
"China-->Henan"
127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range

#对k2实现自增
127.0.0.1:6379> set k2 1
OK
127.0.0.1:6379> incr k2
(integer) 2
127.0.0.1:6379> incr k2
(integer) 3
127.0.0.1:6379> incr k2
(integer) 4
127.0.0.1:6379> get k2
"4"

#自定义步长
127.0.0.1:6379> incrby k2 6
(integer) 10
127.0.0.1:6379> get k2
"10"
127.0.0.1:6379> incrby k2 4
(integer) 14
127.0.0.1:6379> get k2
"14"

2.10、decr/decrby命令

decr命令用于自减1,即在原来的基础上自减一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

decrby命令用于指定增加的步长。

具体语法

#decr语法
decr key
#decrby语法 decrement:步长
decrby key decrement

案例

#对k1实现自减。因为k1不能表示成数字,故会报错
127.0.0.1:6379> get k1
"China-->Henan"
127.0.0.1:6379> decr k1
(error) ERR value is not an integer or out of range

#对k2实现自减
127.0.0.1:6379> get k2
"14"
127.0.0.1:6379> decr k2
(integer) 13
127.0.0.1:6379> decr k2
(integer) 12
127.0.0.1:6379> decr k2
(integer) 11
127.0.0.1:6379> decr k2
(integer) 10
127.0.0.1:6379> decr k2
(integer) 9
127.0.0.1:6379> decr k2
(integer) 8
127.0.0.1:6379> get k2
"8"

#自定义步长
127.0.0.1:6379> decrby k2 7
(integer) 1
127.0.0.1:6379> get k2
"1"
127.0.0.1:6379> decrby k2 6
(integer) -5
127.0.0.1:6379> get k2
"-5"

2.11、getrange命令

getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。

具体语法

 getrange key start end

说明

  • start:起始位置
  • end:结束位置

:如果指定的key不存在,则会返回“”

案例

#获取不存在的key对应的值
127.0.0.1:6379> getrange age 1 3
""

#获取存在的key对应的值
 #1.获取[1,9]位置的字符
127.0.0.1:6379> getrange name 1 9
"tbestboy,"
  #2.获取全部的字符,相当于get key
127.0.0.1:6379> getrange name 0 -1
"itbestboy,love,redis"

2.12、mget命令

mget 命令返回所有(一个或多个)给定 key 的值。

具体语法

mget key [key ...]

说明

  • 如果给定的 key 存在,则返回相应的值 。
  • 若果指定的值key不存在,则返回nil。

案例

#首先检查已经存在的key-value
127.0.0.1:6379> keys *
1) "k2"
2) "hobby"
3) "name"
4) "k1"

#1.指定的key不存在
127.0.0.1:6379> mget k3
1) (nil)

#2.指定的key存在
 #2.1 指定一个key
127.0.0.1:6379> mget k1
1) "China-->Henan"
 #2.2 指定多个key
127.0.0.1:6379> mget k1 k2 name
1) "China-->Henan"
2) "-5"
3) "itbestboy,love,redis"
 #2.3 如果指定的key中有不存在的key时,不会影响其他存在的key返回放入value
127.0.0.1:6379> mget k1 k2 name k3
1) "China-->Henan"
2) "-5"
3) "itbestboy,love,redis"
4) (nil)

127.0.0.1:6379> mget user:1:name user:1:age
1) "wangwu"
2) "15"

2.13、getset命令

getset命令一般用于设置新的值,返回旧的值,执行顺序为先get后set。如果指定的key不存在时就会返回nil。

具体语法

getset key value

特别需要注意的时,getset命令用于先get旧值然后set新值

案例

#先查看已经存在的key
127.0.0.1:6379> keys *
1) "k2"
2) "hobby"
3) "name"
4) "k1"

#getset不存在的key
127.0.0.1:6379> getset k3 jiangsu
(nil)
#getset已经存在的key
127.0.0.1:6379> keys *  #可以看出经过第一次getset后k3已经存在了
1) "k3"
2) "k2"
3) "hobby"
4) "name"
5) "k1"
127.0.0.1:6379> get k3
"jiangsu"
127.0.0.1:6379> getset k3 nanjing
"jiangsu"

2.14、strlen命令

strlen命令用于获取指定key所存储的字符串的长度,如果指定的key不存在时会返回0,但是如果此时指定的key对用的value不是字符串时会报错。

具体语法

strlen key

案例

#假设指定的key不存在
127.0.0.1:6379> strlen k4
(integer) 0

#假设指定key对应的value不是字符串类型
127.0.0.1:6379> type hobby
set
127.0.0.1:6379> strlen hobby
(error) WRONGTYPE Operation against a key holding the wrong kind of value

#获取正确的
127.0.0.1:6379> strlen k2
(integer) 2

2.15、msetnx命令

msetnx 命令用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对,这是一个原子操作。

具体语法

msetnx key value [key value ...]

:这是一个原子操作

案例

#检验是否是原子操作
127.0.0.1:6379> msetnx k1 v1 k8 v3 k5 v3
(integer) 0
#添加失败,说明之谁一个原子钟操作,因为k1已经存在,不能被添加进去,从而导致k8 k5也添加失败

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值