字符串
字符串键是 Redis 中最基本的键值对类型,被关联的 k-v 既可以是普通文本数据,有可以是二进制数据。
基本命令
SET
设置 k-v 字符串。
1 | -- 有引号 |
时间复杂度:O(1)
MSET
设置多个 k-v 字符串。
1 | -- 设置 name == hanzhang |
时间复杂度:O(n)
- 提高操作效率;
- 方便多个 k-v 操作;
MSETNX
==所有== k 不存在的情况下,设置多个 k-v 字符串
1 | -- name 和 age 都不存在的情况下,设置成功,返回 true;否则,返回 false |
时间复杂度:O(n)
GET
查询 k-v 字符串。
1 | GET message |
时间复杂度:O(1)
MGET
查询多个 k-v 字符串。
1 | -- 同时查询 name address school |
时间复杂度:O(n)
- 提高操作效率;
- 方便多个 k-v 操作;
GETSET
返回 k 对应的字符串,并设置新值。
1 | -- 设置 number == 1 |
时间复杂度:O(1)
STRLEN
获取字符串长度。
1 | -- 返回 len(name) |
时间复杂度:O(n)
GETRANGE
获取字符串索引指定闭区间的内容。
1 | SET message "hello world" |
时间复杂度:O(n)
SETRANGE
设置字符串指定索引开始的字符串。
当设置字符串 > 当前字符串长度时,会自动扩容。
1 | SET message "hello world" |
时间复杂度:O(n)
APPEND
k 存在时,就添加;不存在时,就执行 SET 操作。
1 | SET message "Redis" |
时间复杂度:O(n)
存储方式
如果 k-v 字符串中,v 能够使用 C 语言中 long long int 或者 long double 时,redis 可以把 v 当作数字来处理;否则都是字符串存储。
INCR
自增 + 1。
1 | SET num 100 |
时间复杂度:O(1)
INCRBY
增加指定数字。
1 | SET num 100 |
时间复杂度:O(1)
INCRBYFLOAT
1 | SET num 100 |
时间复杂度:O(1)
DECR
对应 INCR,只是减少。
DECRBY
对应 INCRBY,只是减少。
DECRBYFLOAT
对应 INCRBYFLOAT,只是减少。
示例
缓存
将数据存储再内存 Redis,而不是硬盘 MySQL。
1 | func put(key, value string, expiration int) error { |
分布式锁
不同进程通过设置字符串键和删除字符串键来模拟获取锁和释放锁。
1 | func acquire(key string) (bool, error) { |
- 无法保证该锁只能是锁的持有者才能释放;
- 无法设置锁超时时间;
保存 Blog
1 | func SaveBlog(title, author string, id int) (bool, error) { |
总结
- k 和 v 都是既可以存储二进制,又可以存储字符串;
- SET、SETNX 和 SETXX;
- MSET、MSETNX 和 MGET 可以减少网络请求,提升程序效率;
- 字符串值中正数索引 0 开始,负数索引 -1 开始;
- GETRANGE 是返回索引闭区间;
- SETRANGE 当长度不够时,会自动扩展;
- APPEND 处理键不存在时执行 SET;键存在时,执行 APPEND;
- 字符串值满足 C 语言中 long long int 或者 long double 时,当作数字来处理;