Redis
日常开发与排障可先查阅:Redis 常用命令与实战手册。
Redis 提供了 9 种数据类型。
- STRING 字符串
- GET
- SET
- DEL
- LIST 列表 (有序,可重复)
- LPUSH 将元素推入表头
- RPUSH 将元素推入表尾
- LPOP
- RPOP
- LINDEX
- LRANGE
- SET 集合 (无顺序,不重复)
- SADD 添加元素
- SREM 删除元素
- SMEMBERS 获取所有元素
- SISMEMBER 检查元素是否存在
- SINTER 交集
- SUNION 并集
- SDIFF 差集
- HASH 散列 (包含键值对的无序散列表)
- HSET
- HGETALL
- HDEL
- HGET
- ZSET 有序集合 (存储键值对)
- ZADD
- ZREM
- ZRANGE
- ZRANGEBYSCORE
- BitMap
- HyperLogLog
- GER
- Stream
文章投票系统
评分:文章发布时间 + 票数 * 常量
- 时间:Unix 时间
- 常量:一天的秒数 86400/200 = 432
使用 HASH 来存储文章的信息 name: HASH-ARTICLE key-> article:10086 value-> title, link, poster, time, votes
使用 ZSET 存储文章发布时间 name: ZSET-TIME key -> article:10086 value -> unix time
使用 ZSET 存储文章评分 name: ZSET-SCORE key -> article:10086 value -> score
使用 SET 存储每个文章的投票用户 name: voted:10086 vaule -> user:996,user:12580 ...
当用户给文章 ID 为 10086 投票时,向 voted:10086 集合添加用户的 ID,同时修改 ZSET-SCORE 中文章 ID 为 10086 的评分。
投票的逻辑
- 使用 ZSCORE 命令来检查 ZSET-TIME 中,文章的发布时间是否超过 7 天,如果超过则不允许投票。
- 使用 SADD 命令,将用户ID添加到 voted:10086 集合中。
- 使用 ZINCRBY 命令,修改 ZSET-SCORE 中文章 ID 为 10086 的评分。
- 使用 HINCRBY 命令,修改 HASH-ARTICLE 中文章 ID 为 10086 的票数。
发布文章的逻辑
- 使用 INCR 命令,获取文章的 ID。
- 使用 SADD 命令,将 poster 的ID 添加到 voted:10087 集合中。
- 使用 EXPIRE 命令,设置 voted:10087 集合的过期时间。
- 使用 HMSET 命令,将文章的信息存储到 HASH-ARTICLE 中。
- 使用 ZADD 命令,将文章的发布时间存储到 ZSET-TIME 中。
- 使用 ZADD 命令,将文章的评分存储到 ZSET-SCORE 中。
取出文章
- 使用 ZREVRANGE 命令,从 ZSET-SCORE 取出评分最高的文章 ID。
- 使用 HGETALL 命令,从 HASH-ARTICLE 取出文章的信息。
文章分组
- 文章属于哪个分组
- 取出某个分组的所有文章
Redis 面试题目
1、为什么要使用 Redis
- 高性能
- 线程模型
- 数据结构
- 持久化
- 网络框架
- 高可靠
- 主从复制
- 哨兵机制
- 高拓展
- 数据分片
- 负载均衡

2、Redis 为什么使用单线程模型
单线程模型的优点
- 简单性,多线程编程需要处理诸如数据同步、线程间通信等复杂问题,而单线程模型可以避免这些复杂性。
- CPU 不是瓶颈。
Redis的瓶颈通常在于网络 I/O,而不是 CPU。因此使用多线程并不能提高 Redis 的性能。 - 高效的事件模型。
Redis使用了高效的事件模型和非阻塞 I/O,可以处理大量并发连接,这使得单线程模型能够充分利用 CPU 资源。 - 避免了锁的开销。在多线程环境中,为了保证数据的一致性,需要使用锁来同步数据,这会带来额外的开销。
为什么 CPU 不是 Redis 的瓶颈呢?
因为 Redis 是一个基于内存的数据结构存储系统。它的操作大多数是增、查、删,都是在内存中完成的,速度非常快,通常不会成为瓶颈。
反而, I/O 通常是 Redis 的瓶颈。当 Redis 服务器需要处理大量并发连接,或者需要频繁地读写大量数据时,网络带宽和延迟可能会成为限制 Redis 性能的主要因素。
为什么 Redis 会是单线的呢?
- 性能上考虑,单线程避免了上下文频繁切换问题,效率高。
- 内部结构上设计原理进行考虑,
Redis是基于Reactor 模式开发了自己的网络事件处理器(file event handler)。这个文件事件处理器是单线程的。