Redis是一个键值型(Key-Value)数据库,它的 Key 一般是 String 类型,但 Value 支持非常丰富的数据结构。
为了方便学习,可以通过 help 命令查看命令的具体用法,比如 help keys 查看单个命令,或 help @generic 查看通用组的命令。
1. Key 的层级结构规范
在没有 MySQL 中 Table 概念的 Redis 里,为了避免 Key 冲突并让数据关系清晰,通常通过给 Key 添加前缀并用冒号 : 隔开来形成层级结构。
- 规范格式:
项目名:业务名:类型:id。 - 示例:比如 heima 项目中有 user 和 product 两种数据,可以命名为
heima:user:1和heima:product:1。如果值是一个 Java 对象,通常将其序列化为 JSON 字符串后进行存储。图形化客户端会根据这种前缀自动展示出树形的层级目录。
2. Redis 通用命令
通用命令是不分具体数据类型,几乎所有 Key 都可以使用的指令:
- KEYS:查看符合模板的所有 Key(如
keys *或keys a*)。在生产环境下由于可能引发性能问题,不推荐使用。 - DEL:删除一个或多个指定的 Key。
- EXISTS:判断某个 Key 是否存在。
- EXPIRE:给一个 Key 设置有效期,到期后该 Key 会被自动删除。
- TTL:查看一个 Key 的剩余有效期(返回 -1 表示未设置过期时间,-2 表示已过期)。
3. 五大常见数据结构及命令
3.1 String 类型(字符串)
这是最简单的存储类型。它的 value 实际上不仅可以是普通字符串,还可以是整数(int)或浮点数(float),数值类型支持自增、自减操作。最大空间不能超过 512M。
- SET / GET:添加/修改或获取一个 String 类型的键值对。
- MSET / MGET:批量添加或获取多个 String 类型的键值对。
- INCR / INCRBY / DECR:让整型的 value 自增 1、自增指定步长,或递减。
- SETNX:添加一个键值对,前提是这个 Key 不存在(如果存在则不执行),常用于分布式锁。
- SETEX:添加一个键值对的同时直接指定有效期。
3.2 Hash 类型(散列)
其 value 是一个无序字典,类似于 Java 中的 HashMap。相比于 String 存 JSON,Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做增删改查。
- HSET / HGET:添加/修改或获取 Hash 类型 Key 中某一个 field 的值。
- HMSET / HMGET:批量添加或获取多个 field 的值。
- HGETALL:获取一个 Hash 类型的 Key 中的所有的 field 和 value。
- HKEYS / HVALS:单独获取所有的 field,或所有的 value。
- HINCRBY:让 Hash 类型中的某个 field 值自增并指定步长。
3.3 List 类型(列表)
类似于 Java 中的 LinkedList(双向链表),支持正向和反向检索。特征:有序、元素可重复、插入和删除快。常用于朋友圈点赞列表、评论列表等。
- LPUSH / LPOP:向列表左侧(头部)插入元素,或移除并返回列表左侧的第一个元素。
- RPUSH / RPOP:向列表右侧(尾部)插入元素,或移除并返回列表右侧的第一个元素。
- LRANGE:返回一段角标范围内的所有元素。
- BLPOP / BRPOP:与 LPOP/RPOP 类似,但在没有元素时会阻塞等待指定时间,而不是直接返回 nil。
3.4 Set 类型(集合)
类似于 Java 中的 HashSet(看作 value 为 null 的 HashMap)。特征:无序、元素不可重复、查找快。常用于处理共同好友、黑白名单等功能。
- SADD / SREM:向 set 中添加一个/多个元素,或移除指定元素。
- SCARD:返回 set 中元素的个数。
- SISMEMBER:判断某个元素是否存在于 set 中。
- SMEMBERS:获取 set 中的所有元素。
- SINTER / SDIFF / SUNION:分别求多个集合的交集、差集、并集。
3.5 SortedSet 类型(可排序集合 / ZSet)
类似于 Java 中的 TreeSet,但底层实现是一个跳表(SkipList)加 Hash 表。每一个元素都会带有一个 score 属性,会基于此分数对元素进行自动排序。常用于排行榜。
- ZADD / ZREM:添加一个/多个元素(如果已存在则更新 score),或删除指定元素。
- ZSCORE:获取指定元素的 score 值。
- ZRANK / ZREVRANK:获取指定元素的排名(默认升序;如果在命令后加 REV 则为降序)。
- ZCARD:获取元素个数。
- ZCOUNT:统计 score 值在给定范围内的元素个数。
- ZINCRBY:让指定元素自增指定的 score 步长。
- ZRANGE / ZRANGEBYSCORE:按照排名范围或 score 范围获取元素。