String 类型
文章目录
- String 类型
- set 命令
- get 命令
- mset 命令
- mget 命令
- get 和 mget 的区别
- incr 命令
- incrby 命令
- decr 命令
- decrby 命令
- incrbyfloat 命令
- append 命令
- getrange 命令
- setrange 命令
字符串类型是 Redis 中最基础的数据类型,在讲解命令之前,我们先讨论以下 Redis 中的 String 类型,关于 Redis 中的 String 类型,要注意三点:
① Redis 中的 “键” 都是 String 类型,而 Redis 中的 value 是多种类型的,而在这多种中类型中,它们存储的元素类型也都是 String 类型,比如,list 类型,set 类型,存储的元素值是 String 类型。
② 如果 value 是 String 类型,它可以是一般的字符串,也可以是 JSON、XML 格式的字符串,也可以是 “数字”,二进制流数据,例如图片,但是,这里的字符串最好不要太大,否则的话读取时间会很长。
③ Redis 中 String 类型数据的存储都是按照**“二进制数据”**存储的,并且,Redis 是不处理字符集编码问题的,客户端传入的命令中,使用的是什么字符集编码,存储时就是什么字符集编码。
下面,就来简单看一下几个常用的命令:
set 命令
设置 key 和 value,在不指定选型的默认情况下,如果指定的 key 存在的话,则更新 value 值,如果 key 不存在的话,则存储 key 和 value
语法:set key [expiration EX seconds|PX milliseconds] [NX|XX]
选项解释:
EX seconds :设置 key 的过期时间,单位是:秒
PX milliseconds:设置 key 的过期时间,单位是:毫秒
NX:如果 key 不存在,则存储 key 和 value,如果 key 存在,则不能存储
XX:如果 key 存在则存储,如果 key 不存在,则不存储
时间复杂度:O(1)
返回值:ok
操作演示:
注意:上述我存储的 key 和 value 都是字符串类型,而在 Redis 中,字符串类型加不加引号都是可以的,以及加双引号或单引号也都不会出错。
get 命令
根据 key 获取 value,如果 value 的数据类型不是 String ,则会报错
语法:get key
时间复杂度:O(1)
返回值:key 对应的value,如果key不存在,返回 nil
操作演示:
mset 命令
一次设置多个 key
语法:mset key [key……]
时间复杂度:O(k),这里的 k 表示 key 的个数
返回值:ok
操作演示:
mget 命令
一次获取多个 key 的 value
语法:mget key [key……]
时间复杂度:O(k)
返回值:key 对应的 value
操作演示:
get 和 mget 的区别
要记住,Redis 的架构是“客户端-服务器”架构,每一次传入命令都是向服务器发送一次请求,是通过网络传输的,而网络传输的速度也是比较慢的,并且也可能会因为一些因素导致传输失败,毕竟网上有一句话是这样讲的:再牛的网络,也敌不过挖掘机的一铲子,所以,如果要设置多个key 或 获取多个 key 使用 get 和 mget 所发送请求的个数就相差很大,如下图:
所以,mget / mset 这种批量操作,可以有效的节约网络时间,但需要注意的时,批量操作时指定的 key 不要太多,否则的话,容易导致 Redis 阻塞。
incr 命令
将 key 对应的 String 表示的数字加1,如果 key 不存在,则设置key,并且认为 key 对应的 vlaue 的值为 0,如果,key 所对应的 value 的值不是一个数字,或者数字的范围超过了 64位有符号的整型,则报错
语法:incr key
时间复杂度:O(1)
返回值:成功加完后的数值
操作演示:
incrby 命令
将 key 对应的 String 表示的数字加上指定的 n,如果 key 不存在,则设置key,并且认为 key 对应的 vlaue 的值为 0,如果,key 所对应的 value 的值不是一个数字,或者数字的范围超过了 64位有符号的整型,则报错
语法:incrby key n
时间复杂度:O(1)
返回值:成功添加后的值
操作演示:
decr 命令
将 key 对应的 String 表示的数字减 1,如果 key 不存在,则设置key,并且认为 key 对应的 vlaue 的值为 0,如果,key 所对应的 value 的值不是一个数字,或者数字的范围超过了 64位有符号的整型,则报错
语法:decr key
时间复杂度:O(1)
返回值:成功减去后的值
操作演示:
decrby 命令
decrby 命令同样也是减操作,只不过是减去我们指定的数值,和上面的 incrby 命令的操作方式一样,这里就不再演示。
incrbyfloat 命令
incrbyfloat 命令是针对 value +/- 小数,操作方式同样和上面的加减命令操作方式一样,这里也不再演示。
以上一组命令都是对value是数字时进行操作的,很多存储系统和编程语⾔内部使⽤CAS机制实现计数功能,会有⼀定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执⾏。
append 命令
如果 key 已经存在,并且 value 是字符串,那么 append 命令会将指定的value值拼接到字符串后面,如果不存在,用法和set一样,就会添加一个新的元素
语法:append key value
时间复杂度:O(1)
返回值:字符串的长度
操作演示:
getrange 命令
获取 key 对应的字符中的子串
语法:getrange key start end
start:左区间(闭)
end:右区间(闭)
并且可以使用负数表示倒数,-1 表示最后一个位置的元素,-2 表示倒数第二个位置的元素
时间复杂度:O(k),k 是[start,end]区间的长度
返回值:返回指定位置的字串
操作演示:
setrange 命令
覆盖字符串的一部分
语法:setrange key offset value
offset:指定需要覆盖的开始位置
value:新的字符串
时间复杂度:O(k),k 表示 value 的长度
返回值:替换后的字符串的长度
操作演示: