实际上想搞懂 Redis 到底是个啥,你先把脑子里那本《深入理解计算机系统》合上,别再拿那些术语当字典查了。Redis 就是个极简的内存游戏,核心就两字:快。别整那些虚头巴脑的架构聊聊,咱们直接拆解它到底是如何在内存里耍帅的。 Redis 不是那种才用才香、目前还在悄悄转型的架构,它就是个典型的全内存系统。
你想想,传统的数据库,数据一般要等写入磁盘再读,哪怕你写刚写完,读的时候还得跑两次 IO。Redis 呢,数据只要存有 RAM 里,想读就秒回,这速度哪位顶用哪位下。它不像 MySQL 那样依赖磁盘作为缓冲,它自己就是那个“肉身”。 核心逻辑实际上特别好办,就是“关键 - 值对”的存。也就是你把一个 ID 存进去,后面跟一串数据,就像查字典一样,ID 是索引,数据是词条。
这个设计让读取变得飞快,别看写入略微慢那么一点点,但这是为了换取那几倍的读取吞吐。 说到内存,Redis 就是把它当硬盘看。它用内存池来管那些常用的键,就像你手机里几千个微信、QQ 的缓存位一样,高频访问的都会常驻内存。数据分布到这些内存位上,自然就在几十纳秒就连更短工夫就能被命中。
要是是热点数据,比如用户 ID 或商品代码,Redis 会专门开辟内存块,确保它们一辈子离得近,这就是为啥你能秒开购物车、秒算商品价格的秘密。 那为啥要如此设计呢?起初肯定是延迟。用户进个聊天室,不用等几毫秒,得毫秒级。
那些非关键数据,比如日志记录、缓存的旧数据,要是都塞硬盘里,磁盘旋转的延迟和随机读写性能就忒差了。Redis 有个智慧的机制,叫内存淘汰策略。当内存快不下了,它就得牺牲掉一些数据,比如轮询淘汰、随机淘汰要么工夫淘汰。
这些都不是为了性能牺牲,而是为了保系统的健康运行。 再看它的数据结构,Redis 封装了 7 种数据结构,每种都是为特定场景量身定做的。
比如哈希表,就像把数据打散存入不同的内存槽位,通过随机哈希计算快速定位。
要是是用户注册这种场景,把 ID 和姓名塞进槽位,MD5 算一下哈希值直接取反,就能秒开用户信息。
还有列表,就是单纯的内存数组,适合做队列,比如购物车商品的添加删除,写一个数字就加一个,读出来就减一个,这在内存里操作简直丝滑。 另外,Redis 还能做持久化。别看它不像文件系统那样依赖磁盘,但它赞成 RDB 快照和 AOF 日志两种方案。RDB 就是定期把内存里所有数据打包,存到 Redis 文件里;AOF 则是把每次写操作都记下来,比如每秒存一次。
这样,就算服务器宕机要么断电,数据也不会丢,并且恢复速度也挺快。 数据在 Redis 里是随机访问的,这和数据库里的顺序读彻底不同。
这也是它快的缘由之一。
比如拉取一批库存,Redis 能瞬间把前 100 个 ID 的数据调取出来,对比总库存,发现少了 5 个,瞬间告诉你“库存不足”。数据库要是如此做,得遍历大量数据,工夫起码是毫秒级的,但 Redis 在纳秒级别就能搞定。 最终说说性能瓶颈。Redis 自然不是神,它的随机写性能确实不如顺序写。
要是你有一亿条数据,每秒写入几万次,那查旧数据的性能会大幅下降。出于内存是有限的,写多了就务必清理。
故此,高频写多查少的系统,Redis 往往不如关系型数据库划算。 总而言之,Redis 就是个极致的内存游戏,用架构上的取舍换取了性能的极致。它不是用来存海量数据的,是用来存热点、做缓存、做高频操作的。
要是你手速快,能处理高并发写入,Redis 就是你的最佳搭档;要是你更看重数据的整个性和长期一致性,可能还得靠那堆成熟的数据库。