Redis 命令及数据类型 -- 通用命令

摘要

通用命令

  • 我们可以在 Redis官网 中查看所有命令的使用方法,也可以在命令行中通过 help commandhelp @group 查看命令的帮助

1
2
3
4
# 查看 set 命令的使用方法
help set
# 查看事务相关命令的使用方法
help @transactions
  • Redis核心分组

分组 说明
@string String
@hash Hash
@list List
@set Set
@sortedset ZSet
@bitmap Bitmap
@hyperloglog HLL
@geo GEO
@stream Stream
@transactions MULTI / EXEC
@pubsub 发布订阅
@scripting Lua
@server 服务器管理
@connection 连接管理
@cluster 集群
@module Stack扩展
  • 以下是针对所有数据类型均可使用给的方法和命令

方法功能 方法 redisTemplate.xxx() Redis 原始命令 命令备注 / 推荐替代
复制 key 到新 key Boolean copy(K source, K target, boolean replace) COPY source target [REPLACE] Redis ≥ 6.2
判断 key 是否存在(单个) Boolean hasKey(K key) EXISTS key CLI 返回存在数量
统计存在的 key 数量 Long countExistingKeys(Collection<K> keys) EXISTS key [key ...] 返回存在 key 的数量
删除指定 key(同步) Boolean delete(K key) DEL key 返回是否删除成功
批量删除 key(同步) Long delete(Collection<K> keys) DEL key [key ...] 返回删除数量
删除 key(异步) Boolean unlink(K key) UNLINK key 非阻塞删除
批量删除 key(异步) Long unlink(Collection<K> keys) UNLINK key [key ...] 推荐大 key 使用
获取 key 的数据类型 DataType type(K key) TYPE key 返回 string/hash/list/set/zset/none
按模式匹配 key(阻塞) Set<K> keys(K pattern) KEYS pattern 生产环境不推荐
游标方式扫描 key Cursor<K> scan(ScanOptions options) SCAN cursor [MATCH] [COUNT] 推荐替代 KEYS
随机返回一个 key K randomKey() RANDOMKEY 可能返回 null
重命名 key void rename(K oldKey, K newKey) RENAME oldKey newKey 覆盖目标 key
key 不存在时重命名 Boolean renameIfAbsent(K oldKey, K newKey) RENAMENX oldKey newKey 原子操作
设置 key 过期时间 Boolean expire(K key, long timeout, TimeUnit unit) PEXPIRE / EXPIRE 优先毫秒精度
设置 key 在指定时间过期 Boolean expireAt(K key, Date date) PEXPIREAT / EXPIREAT 精度自动降级
设置过期策略(高级 API) ExpiryChangeState expire(K key, Expiration expiration, ExpirationOptions options) EXPIRE / PEXPIRE / EXPIREAT Spring 抽象封装
清除 key 的过期时间 Boolean persist(K key) PERSIST key 变为永久 key
获取剩余 TTL(秒) Long getExpire(K key) TTL key -1 无 TTL,-2 不存在
获取剩余 TTL(指定单位) Long getExpire(K key, TimeUnit unit) PTTL / TTL 优先毫秒
将 key 移动到其他 DB Boolean move(K key, int dbIndex) MOVE key db 集群模式不可用
导出 key 的序列化值 byte[] dump(K key) DUMP key 用于迁移
恢复 key void restore(K key, byte[] value, long ttl, TimeUnit unit, boolean replace) RESTORE key ttl value [REPLACE] DUMP 配合
排序并返回结果 List<V> sort(SortQuery<K> query) SORT key 阻塞操作
排序并指定返回类型 List<T> sort(SortQuery<K> query, RedisSerializer<T> serializer) SORT key 结果反序列化
排序并映射结果 List<T> sort(SortQuery<K> query, BulkMapper<T,V> mapper) SORT key Spring 封装
排序并映射(高级) List<T> sort(SortQuery<K> query, BulkMapper<T,S> mapper) SORT key 批量映射
排序并存储结果 Long sort(SortQuery<K> query, K storeKey) SORT key STORE destination 返回结果条数
  • 生产环境慎用的命令

命令 原因 推荐
KEYS 阻塞、O(N) SCAN
SORT 阻塞、消耗 CPU 业务侧排序
DEL 阻塞、消耗 CPU UNLINK

避免BigKey

  • BigKey 的危害并不在“占内存”,而在操作成本是 O(N)。

  • Redis 是单线程执行命令,比如 HGETALLDEL等,运行期间会占用CPU,阻塞 Redis 主线程,直接表现为 RT 飙升 / QPS 下降。

  • 另外BigKey还会导致如下问题:

1
2
3
大 Key 返回值过大 → 网络 IO 抖动
主从复制同步 BigKey → 从库延迟
RDB / AOF 重写 → Fork 时间变长
  • BigKey 的阈值

数据类型 元素数量阈值(经验值)
String ≥ 10,000 byte
Hash ≥ 10,000 field
List ≥ 10,000 item
Set ≥ 10,000 member
ZSet ≥ 10,000 member
Stream ≥ 10,000 entry

在生产环境中,5,000 就已经需要警惕。
建议在数据量达到一定阈值时,考虑拆分。

  • Reids官方给出了判断BigKey的命令

1
redis-cli --bigkeys
  • ⚠️ 注意:它不是按内存占用最大,而是按元素数/长度 来找最大的 key

BigKey 的处理方式

避免执行占用CPU的操作

  • 比如 HGETALLDELKeys *

1
2
3
4
5
6
7
8
# 只读取一部分字段
HGETALL user:1001 --> HMGET user:1001 name age email
# 异步清除
DEL key --> UNLINK key
# 避免 KEYS 改用 SCAN
keys pattern --> scan cursor match pattern count 1000
# 避免读取全部数据,而是应该指定读取范围
LRANGE key 0 -1 --> LRANGE key 0 999
  • 业务侧排序,避免使用SORT

设计上避免BigKey

  • 拆分数据

1
2
3
4
5
# 错误设计:
user:all_profiles -> 超大 JSON
# 正确设计:
user:1001:profile
user:1002:profile
  • Hash 分桶(Shard)

1
2
3
4
# 通过 hash(id) % N 分散
order:2025:0
order:2025:1
order:2025:2