现在多数秒杀,抽奖,抢红包等大并发高流量的功能一般都是基于 redis 实现,然而在选择 redis 的时候,我们也要了解 redis 如何保证服务正确运行的原理
前言
- redis 如何实现高性能和高并发
- reids 事务的 ACID 原理
- WATCH、EXEC 命令实现 redis 事务
- lua 实现 redis事务
- 抢红包方案
redis 如何实现高性能和高并发
- redis 是一个内存数据库,读写非常高效。除了开启 AOF,RDB 异步线程去持久化数据,基本没有磁盘I/O消耗,性能方面是比 mysql,oracle 快很多
- redis 自己实现一套简单高效的基础数据结构:动态字符串(SDS),链表,字典,跳跃链表,整数集合和压缩列表。然后在这个基础上去实现用户能操作的对象:字符串,列表,哈希,集合,有序集合等对象
- reactor 模式的网络事件处理器。它使用了 I/O 多路复用去同时监控多个套接字,这是一种高效的I/O模型。reactor 相关知识可以看下这篇文章框架篇:见识一下linux高性能网络IO+Reactor模型
- 事件处理器是单线执行的,这大大减少CPU的上下文切换,和对资源锁的竞争问题,极大提高redis服务处理速度(至于为啥使用单线程,因为CPU够用了,它的性能瓶颈在内存而不是CPU)
- Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
reids 事务的 ACID 原理
- redis 的事务需要先划分出三个阶段
- 事务开启,使用 MULTI 可以标志着执行该命令的客户端从非事务状态切换至事务状态
redis> MULTI
- 命令入队,MULTI开启事务之后,非 WATCH、EXEC、DISCARD、MULTI 等特殊命令;客户端的命令不会被立即执行,而是放入一个事务队列
- 执行事务或者丢弃。如果收到 EXEC 的命
- 事务开启,使用 MULTI 可以标志着执行该命令的客户端从非事务状态切换至事务状态