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也添加失败