[TOC] #### 1. 前言 --- Redis 装好了,你可能会问:它到底能存什么 ? 不像 MySQL 那样有表有字段,Redis 的核心数据结构就五种,搞懂这五种,你就知道什么时候该用 Redis、怎么用了 #### 2. String 字符串 --- String 是最基础的数据类型,啥都能往里塞 存个名字: ```bash set name liang get name ``` 存个数字还能自动加一 ```bash set views 0 incr views # 变成 1 incr views # 变成 2 ``` 文章阅读数、点赞数,就是这么实现的 别看简单,String 是用得最多的类型,面试问到 Redis 数据结构,第一个说的也是它 #### 3. Hash 哈希 --- Redis 的 Hash 类型是存对象用的 比如一个用户有姓名、年龄、城市: ```bash hset user:1 name liang age 25 city beijing hget user:1 name # 获取用户的某个数据 "liang" hgetall user:1 # 获取用户全部数据 ``` 比 String 存 JSON 好在哪 ? 你改一个字段,不用把整个 JSON 取出来改完再存回去,直接 `hset user:1 age 26` 就行了 购物车、用户信息、商品详情,都适合用 Hash 类型存储 #### 4. List 列表 --- 有序的列表,能从两头操作,从左边进,从右边出,就是一个队列 ```bash lpush queue task1 task2 task3 rpop queue # 取出 task1(先进先出) ``` 还有个阻塞模式很实用: ```bash brpop queue 30 ``` 没数据就等着,有数据立刻返回,简单消息队列就是这么做的 #### 5. Set 集合 --- 无序、自动去重 ```bash sadd tags python java go python smembers tags # 只有3个,python 自动去重了 ``` 最厉害的是能做集合运算: ```bash sadd user1:friends a b c d # user1好友:a b c d sadd user2:friends c d e f # user2好友:c d e f sinter user1:friends user2:friends # 交集 → 共同好友 c d sunion user1:friends user2:friends # 并集 → 所有集合的元素,自动去重 a b c d e f sdiff user1:friends user2:friends # 差集 → 只在第一个集合独有的元素 a b ``` 一行命令搞定共同好友,不用自己写代码遍历。抽奖、标签、去重,都用 Set。 #### 6. ZSet 有序集合 --- 每个元素带一个分数,按分数自动排序 ```bash zadd rank 100 zhangsan 90 lisi # 向集合中添加元素 zrange rank 0 -1 withscores # 从低到高排 zrevrange rank 0 -1 withscores # 从高到低排 ``` 排行榜天然就是这个结构 给分数加一: ```bash zincrby rank 10 lisi ``` 延时队列、限流器也能用 ZSet 实现,后面会讲 #### 7. 怎么选择用哪个类型 --- 怎么选?记住这个: + 存单值 → String + 存对象 → Hash + 要排队 → List + 要去重 → Set + 要排序 → ZSet 不用纠结,用多了自然就知道了