全局命令
keys * // 遍历所有键, 线上一定要禁用, 有可能阻塞其他操作, O(n), 成功返回 OK
dbsize // 键总数, 直接读取 db 中存的一个变量, O(1)
exists key // 检查键是否存在, 存在返回 1, 不存在返回 0
del key [key ...] // 删除键, 返回删除成功的键的个数
expire key seconds // 添加过期时间
ttl key // 返回键的剩余过期时长. >= 0 为过期时长, -1 表示没有过期时间, -2 表示 键不存在
type key // 返回数据结构类型, 如 string, list 等, 若 键不存在返回 none
object encoding key // 查询内部编码, 如: string 的内部编码可能是 int 或 embstr。(只有 int 才可以用 incr/incrby 命令)
数据结构和内部实现
数据结构与对应的内部编码 关系如下:
- string: raw, int, embstr
- hash: hashtable, ziplist
- list: linkedlist, ziplist
- set: hashtable, intset
- zset: skiplist, ziplist
redis 可以在 节省内存 与 节省性能 之间选择合适的内部编码使用
数据库管理命令
select dbIndex // redis 用数字作 db 名, 默认 16 个库, 0 ~ 15
flushdb/flushall // 清除 db, 前者清除当前库, 后者消除所有库
不建议使用一个 redis 实例切换 db 存储数据的方式, 在 3.0 版本中已弱化了这个功能,分布式的 cluster 上只允许使用 0 号数据库,只不过向下兼容仍然支持。 建议在一台机器上部署多个 redis 实例, 用不同端口做区分,原因如下:
- Redis 是单线程的, 使用多个数据库仍是在用一个 CPU, 彼此间有影响
- 调试和运维也有影响, 如一个慢查询依然会影响其他数据库
- 切换 db 的方式容易引起混乱,且部分 redis 客户端不支持这种方式
- flushdb/flushall 会删除单个/所有数据库的数据(后面会介绍用 rename-command 规避这一问题)
- 由于删除也需要时间, 所以 flushdb/flushall 也有可能阻塞 redis.
String 命令
(操作的类型又分 int, string, bitmap)
其他数据结构都是在字符串类型的基础上构建的, 它甚至可以存二进制数据 (如图片, 音频, 视频), 最大值不可超过 512 MB
set key value [ex seconds] [px milliseconds] [nx/xx]
- ex seconds: 设置秒级过期时间
- px millisecond: 设置毫秒级过期时间
- nx: 键必须不存在才可以成功 (创建), 等同于
setnx
命令 - xx: 键必须存在才可以成功 (更新)
setex key seconds value
setnx key value
get key
获取值, 若 key 不存在, 返回 nil
mset key value [key value ...]
批量设置值
mget key [key ...]
批量获取值, 按照 key 的顺序返回, 若不存在的 key 对应为 nil
TIP: 能用 mget 就不要用 get * n 次, 因为一次 get 在 发送命令, 执行 get, 返回结果上都有花费时间, 而 mget 发送命令一次, 执行 n 次 get, 返回结果一次, 所以所花的网络时间 (发送命令, 返回结果) 少了很多
incr key
自增操作, 若不是整数, 返回错误, 是整数返回自增后结果, 若键不存在, 返回 1
另有类似的 decr
(自减), incrby
(自增指定的数值), decrby
(自减指定数值), incrbyfloat
(自增浮点数)
append key value
字符串尾部追加值 (拼接)
strlen key
计算字符串值长度 (中文占 3 个字节)
getset key value
设置并返回原值 (set 命令返回改后的值), 原来无 key 返回 nil(相当于先 get 再 set)
setrange key offset value
设置指定字符位置 (替换) (??? 只是字符操作还是字符串操作)
getrange key start end
获取部分字符串, 偏移量从 0 开始
String 使用场景
- 缓存: 加速读写
- 计数
- 共享 Session: 用 redis 将 sessin 集中管理, 尤其可以解决在分布式服务下将用户的访问均衡到不用的服务器上的场景
- 限速: 利用设置过期时间的特性, 如在获取验证码限制频率的场景下
网友评论