文章目录
简介
- String类型是Redis最基本的数据类型,一个键最大能存储512MB
- String数据结构是简单的key-value类型,value不仅是String类型,也可以是数字,是包含很多种类型的特殊类型。
- String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如序列号的对象存储,比如一张图片存储,比如一个简单的字符串,数值等待。
string(字符串)的内部结构
string(字符串)是Redis最简单也是使用最广泛的数据结构,它的内部是一个字符数组。如图所示:
Redis中string(字符串)是动态字符串,允许修改;它在结构上的实现类似于Java中的ArrayList(默认构造一个大小为10的初始数组),这是冗余分配内存的思想,也称为预分配;这种思想可以减少扩容带来的性能消耗。
string(字符串)的扩容
当string(字符串)的大小达到扩容阈值时,将会对string(字符串)进行扩容,string(字符串)的扩容主要有以下几个点:
- 长度小于1MB,扩容后为原先的两倍; length = length * 2
- 长度大于1MB,扩容后增加1MB; length = length + 1MB
- 字符串的长度最大值为 512MB
String命令
赋值语法
set
set key value [EX seconds] [PX milliseconds] [NX|XX] KEEPTTL
- 多次设置key会覆盖,Redis set命令用于设置给定key的值,如果key已经存储值,set就覆写旧值,无视类型。
- 通过EX(单位是秒) 和PX (单位是毫秒) 参数可以指定该变量的生存时间。在大多数场景里,应该合理设置对应的生存时间,否则可能会导致内存溢出问题。
- NX 参数表示当key不存在时才进行设置值的操作,如果key存在,那么该命令不执行。XX参数表示当key存在时才进行操作。
- KEEPTTL 是redis 6.0 的新特性,是指“保留生存时间”,既重复set时,保留原值的过期时间。
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379>
setnx命令如果key不存在,则设值并返回1,如果key存在,则不设值返回0
setnx key value
如果key不存在,则设值并返回1,如果key存在,则不设值返回0,解决分布式锁方案之一,只有在key不存在的时候设置key的值,setnx(set if no exits)命令在指定key不存在时,为key设置指定的值。
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> setnx name zhangsan
expire 过期时间
setex key expire value
#setex key 10 value
设置key的值时value,过期时间时10秒,十秒后key清除,可以使用ttl命令查看剩余时间。
127.0.0.1:6379> setex code 10 12345
OK
127.0.0.1:6379> ttl code
(integer) 5
127.0.0.1:6379> ttl code
(integer) -2
127.0.0.1:6379> get code
(nil)
127.0.0.1:6379>
Setrange 替换字符串
setrange key offset value :替换字符串
从偏移量offset开始,覆写value(对于新的value长度如果小于旧值从offset到结束的长度时,长度小于的部分会保持不变),并返回当前value的长度。
特殊的情况如下:
- offset偏移量从0开始,只要offset偏移量小于0,就会报错(error)
ERR offset is out of range
. - 如果offset的下标大于旧值的长度,中间的部分会用零字节(“\x00”)进行填充。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> setrange db -1 redis //只要offset偏移量小于0,就会报错
(error) ERR offset is out of range
127.0.0.1:6379> setrange db 0 redis //如果没有,也会执行,相当于set key value,并返回当前长度
(integer) 5
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> setrange db 0 mogo //a.新的value从offset开始覆写,并返回当前长度
(integer) 5
127.0.0.1:6379> get db //b.覆写时value长度小于旧值从offset到旧值字符串结束时,不足的部分不变
"mogos"
127.0.0.1:6379> setrange db 0 mysql //覆写value,并返回操作之后的value的长度
(integer) 5
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379> setrange db 5 '+redis'
(integer) 11
127.0.0.1:6379> get db
"mysql+redis"
127.0.0.1:6379> del db //删除db的键值对
(integer) 1
127.0.0.1:6379> setrange db 1 redis //a.键db不存在,此时从offset=1开始覆写
(integer) 6
127.0.0.1:6379> get db //b.offset前面(下标为0)value部分会用“\x00”填充
"\x00redis"
取值语法
get 用于获取指定key的值
get key
Redis get命令用于获取指定key的值,如果key不存在,则返回nil,如果key储存的值不是字符串类型,返回一个错误
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> get db1
(nil)
getrange 用于获取存储在指定key中字符串的字符串
getrange key start end
用于获取存储在指定key中字符串的字符串,字符串的截取范围由start和end两个偏移量确定,(start和end包括在内)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> GETRANGE db 0 2
"red"
getbit
getbit key offset
对key所存储的字符串值,获得指定偏移量上的位(bit)
getset用于设置指定key的值,并返回key的旧值
getset key value
getset命令用于设置指定key的值,并返回key的旧值,当key不存在时,返回nil
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db java
"redis"
127.0.0.1:6379> get db
"java"
strlen 返回key所存储的字符串长度
strlen key
返回key所存储的字符串长度
127.0.0.1:6379> get db
"java"
127.0.0.1:6379> strlen db
(integer) 4
删除语法
del 删除指定的key
del key
删除指定的key,如果存在,返回值数字类型1
127.0.0.1:6379> keys *
1) "db"
127.0.0.1:6379> del db2
(integer) 0
127.0.0.1:6379> del db
(integer) 1
批量操作
批量写mset
mset k1 v1 k2 v2
批量写 mset k1 v1 k2 v2 一次性写入多个值
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> mset name dhx name2 dhx2
OK
127.0.0.1:6379> keys *
1) "name2"
2) "name"
批量读 mget
mget k1 k2
mget k1 k2 一次性读多个值
127.0.0.1:6379> mget name name2
1) "dhx"
2) "dhx2"
自增自减
incr
incr key
incr命令将key中存储的数字值加1,如果key不存在,那么key的值会先被初始化为0,然后在执行incr操作。
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> incr num
(integer) 3
decr
decr key
decr命令将key中存储的数字值减1
incrby
incrby key 增量值
incrby命令将key缓存的数据加上指定的增加值
decrby
decrby key 减量值
incrby命令将key缓存的数据减去指定的值
注意 ;这些自增自减的对应key必须是数字类型字符串,否则会报错
字符串拼接
append key value
append命令用于为指定的key追加至末尾,如果不存在,则为其赋值