Redis 提供了五种基本数据类型:String、Hash、List、Set、Sorted Set。以下是每种类型的定义、使用场景和常用命令。
1. String(字符串类型)
特点:Redis 最基本的数据类型,一个键对应一个值,值可以是字符串、数字或者二进制数据。
常用场景
-
需要存储常规数据的场景:缓存Session、Token、图片地址、序列化后的对象(相比较于Hash存储更节省内存)。
-
需要计数的场景:用户单位时间的请求数(简单限流可以用到)、页面单位时间的话访问数。
-
分布式锁:利用SETNX key value命令可以实现一个最简易的分布布式锁(存在一些缺陷,通常不建议这样实现分布式锁)。
常用命令
-
设置和获取值
SET key value # 设置值 GET key # 获取值
-
设置带过期时间的值
SETEX key seconds value # 设置值并指定过期时间(秒)
-
递增/递减数值
INCR key # 值自增1 DECR key # 值自减1 INCRBY key increment # 值增加指定数值 DECRBY key decrement # 值减少指定数
2. Hash(哈希类型)
特点:键值对集合,适合存储对象(类似数据库表中的一行数据)。
常用场景
- 存储对象的多个属性(如用户属性)。
- 动态更新部分字段。
常用命令
-
设置和获取字段值
HSET key field value # 设置字段值 HGET key field # 获取字段值
-
批量操作
HMSET key field1 value1 field2 value2 # 批量设置字段值 HMGET key field1 field2 # 批量获取字段值
-
获取所有字段和值
HGETALL key # 获取所有字段和值
-
删除字段
HDEL key field1 field2 # 删除字段
3. List(列表类型)
特点:有序列表,可存储一组有序的值(可以重复)。
常用场景
- 信息流展示:最新文章、最新动态LPUSH、LRANGE。
- 消息队列:List可以用来做消息队列,只是功能过于简单且存在很多缺陷,不建议这样做。相对来说 Redis5.0 新增加的一个数据结构Stream更适合做消息队列一些,只是功能依然非常简陋。和专业的消息队列相比,还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。
- 实现栈(LIFO)或队列(FIFO)。
常用命令
-
插入元素
LPUSH key value1 value2 # 从左侧插入 RPUSH key value1 value2 # 从右侧插入
-
获取列表元素
LRANGE key start stop # 获取指定范围的元素
-
弹出元素
LPOP key # 从左侧弹出 RPOP key # 从右侧弹出
-
获取列表长度
LLEN key # 获取列表长度
4. Set(集合类型)
特点:无序集合,值唯一。
常用场景
- 需要存放的数据不能重复的场景:网站UV统计(数据量巨大的场景还是HyperLoggLog更适合一些)、文章点赞、动态点赞等场景。
- 需要获取多个数据源交集、并集和差集的场景:共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集)等场景。
- 需要随机获取数据源中的元素的场景:抽奖系统、随机点名等场景。
常用命令
-
添加和删除元素
SADD key value1 value2 # 添加元素 SREM key value1 value2 # 删除元素
-
判断元素是否存在
SISMEMBER key value # 判断元素是否存在
-
获取集合
SMEMBERS key # 获取所有元素
-
集合运算
SINTER key1 key2 # 交集 SUNION key1 key2 # 并集 SDIFF key1 key2 # 差集
5. Sorted Set(有序集合)
特点:类似 Set,元素唯一,但每个元素关联一个分数(score),可按分数排序。
常用场景
- 需要随机获取数据源中的元素根据某个权重进行排序的场景:各种排行榜比如直播间间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。
- 需要存储的数据有优先级或者重要程度的场景:比如优先级任务队例。
常用命令
-
添加元素
ZADD key score1 value1 score2 value2 # 添加元素及其分数
-
获取元素
ZRANGE key start stop [WITHSCORES] # 按分数从低到高排序获取 ZREVRANGE key start stop [WITHSCORES] # 按分数从高到低排序获取
-
获取指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] # 按分数范围获取
-
获取排名
ZRANK key value # 获取元素的排名(从低到高) ZREVRANK key value # 获取元素的排名(从高到低)
总结
类型 | 常用场景 | 主要命令 |
---|---|---|
String | 缓存单值、计数器 | SET , GET , INCR , DECR |
Hash | 存储对象属性 | HSET , HGET , HGETALL |
List | 消息队列、日志存储 | LPUSH , RPUSH , LPOP , RPOP |
Set | 唯一值集合、集合运算 | SADD , SMEMBERS , SINTER , SUNION , SDIFF |
Sorted Set | 排行榜、优先队列 | ZADD , ZRANGE , ZRANGEBYSCORE , ZRANK |
根据实际业务需求,选择合适的数据结构和命令可以更好地利用 Redis 的强大功能!