Redis

高性能内存数据库:

为解决传统数据库在高并发和低延迟场景下的性能瓶颈

传统数据库 I/O 慢,不适合做高频缓存

Memcached 只支持简单的 key-value,不能表达复杂业务

项目中很多需求本质上是“操作数据结构”:列表、集合、计数器等

为什么要操作数据结构?

展示出最近的10条评论

SELECT * FROM comments WHERE post_id = ? ORDER BY created_at DESC LIMIT 10 OFFSET x

Redis内置数据结构:

(String、Hash、List、Set、Sorted Set 等)

根据情况 选择合适的数据结构

  1. 字符串

缓存用户姓名:SET user:1:name "Alice".

页面访问计数:INCR page:views.

数据量小,操作简单(读写、增减)。

  1. Hash(哈希)

存储用户信息:HSET user:1 name "Alice" age 25.

更新年龄:HSET user:1 age 26.

  1. List(列表)

任务队列:LPUSH tasks "send_email",RPOP tasks.

最近浏览记录:LPUSH user:1:history "item1", LTRIM user:1:history 0 9(保留最近 10 条)。

  1. Set(集合)

用户标签:SADD user:1:tags "tech" "sports".

共同好友:SINTER user:1:friends user:2:friends.

用 Set 实现推荐系统(比如推荐共同兴趣的用户)。

  1. Sorted Set(有序集合)

游戏排行榜:ZADD leaderboard 100 "Alice".

获取前 3 名:ZREVRANGE leaderboard 0 2.

问题:

“如何用 Redis 做缓存?”(String/Hash)

“如何实现消息队列?”(List)

“如何设计排行榜?”(Sorted Set)

为什么选这个数据结构? 它的优点!

##问题

为什么redis可以操作列表等数据结构呢? 它的底层就是一个哈希表吗?

Redis 的全局键值存储是基于哈希表(Dict)

全局哈希表只存储「键」和「值的指针」

对于Redis 不同数据类型有不同的底层实现

实际上:

LPUSH mylist A 为例:

  1. 查找 Key:先在全局哈希表中查找 "mylist":

  2. 如果不存在,创建一个新的 List(底层可能是 QuickList)。

  3. 如果存在,拿到指向 List 的指针。

  4. 操作数据结构:调用 QuickList 的插入逻辑,在头部插入 "A"。