Redis数据类型之字符串类型string
想学习更多Redis相关知识,请点击右侧链接查看Redis学习笔记:点我查看
一、Redis字符串类型介绍
Redis字符串类型官网介绍(英文)
Redis的字符串(string)存储字节序列,包含文本、序列化对象和二进制数组。字符串类型是Redis的key对应的值中最简单的类型。字符串类型通常用于缓存,但是它们也可以实现计数和位运算等功能。
Redis字符串类型特性:单个键(key)对应单个值(value)。
默认情况下,一个字符串类型的值(value)最大可以存储512MB数据。
应用场景:
1. 视频/文章点赞功能;
2. 统计视频播放量、文章阅读量等。
二、Redis字符串常用命令
1. 添加和修改Key:
1 |
|
如果对应的value存在空格等特殊符号,需要使用双引号:
- 为当前的key设置过期时间(单位:秒):
1 |
|
其中ex(expire)值的是当前的key-value存在过期时间,seconds就是我们自定义的过期时间(秒):
- 为当前的key设置过期时间(单位:毫秒)
1 |
|
- 当前key如果不存在时,创建key,否则不创建,相当于后续学习的SETNX命令:
1 |
|
- 当前key如果存在时,对当前的value进行覆盖:
1 |
|
2. 获取当前key对应的value:
1 |
|
这里我们顺便验证一下上述set命令是否由修改key的功能(数据覆盖):
3. 批量设置多个key-value:
1 |
|
4. 批量获取多个key对应的value:
1 |
|
获取前面设置的key对应的value:
5. 批量设置一个或多个key-value对,当前仅当所有给定的key都不存在:
1 |
|
执行成功返回1,如果命令中的key已经存在,则执行失败,返回结果是0:
MSETNX具有原子性,所给的key-value要么执行成功,如果有一个key已经存在,那么这个命令就不会执行成功。
6. 获取指定区间范围内的值:
1 |
|
假设key对应的value默认的长度是value.length
。和Java的字符串类似,Redis字符串从左向有得出的范围是$[0,value.length)$。
Redis对于value的索引值范围也可以从当前字符串最末尾的字符索引值是-1,前一个字符索引值为-2,以此类推(从右向左)。由此我们也可以得出Redis字符串索引值范围是$[-value.length, -1]$。
假设当前有一个key,对应的value是iCode504,下图就是对正向索引值范围和逆向索引值范围的分析:
我们在使用上述GETRANGE命令时,start和end的索引值范围是$[0, value.length)$或者$[-value.length, -1]$,两个范围的值可以混用。例如:value的开始位置0,末尾是-1,如果想通过GETRANGE获取整个字符串,那么执行命令就是GETRANGE 0 -1
。
以下是GETRANGE命令的使用:
7. 将当前key对应的value某个偏移量覆盖新值(overwriteValue),
1 |
|
其中offset是偏移量,它本质上就是一个索引值,这个命令是将当前offset及之后覆盖新值value,覆盖区间:$[offset, offset + value.length)$
以下是SETRANGE实现数据覆盖的原理图:
以下是SETRANGE命令的使用:
8. 数值加减操作:必须保证key对应的value是数字才可以进行加减操作。
下面命令的返回值都是数值增加/减少的结果:
递增数值,每次自增1:
1 |
|
增加指定的整数:
1 |
|
递减数值,每次自减1:
1 |
|
减少指定的整数:
1 |
|
9. 获取字符串长度:
1 |
|
10. 内容追加(在字符串末尾添加内容):
1 |
|
11. 当前key不存在时,创建key;存在则不执行上述操作(该命令可用于分布式锁):
1 |
|
如果执行成功,返回结果是1;如果失败,返回结果是0
12. 为当前key设置过期时间(单位:秒,该命令可用于分布式锁):
1 |
|
- GETSET命令:先执行GET命令并返回当前key对应的value,然后对key立即执行GET操作:
1 |
|
三、Redis字符串命令的注意事项
大多数字符串命令的时间复杂度是$O(1)$,这也就意味着执行这些命令效率非常高。需要注意的是,如下几个命令的时间复杂度是$O(n)$:
- SUBSTR
- GETRANGE
- SETRANGE
这几个随机访问的字符串命令在处理超大字符串的时候可能会出现性能问题。