Redis基础
Redis基础
Redis (Remote Dictionary Server) 是一个基于C语言开发的NoSQL数据库,是一个内存数据库,支持持久化,因此读写速度非常快,原生支持集群部署。
Redis为什么这么快呢?
- 内存数据库,所有请求完全基于内存,读写速度非常快,访问级别是纳秒级,相对于硬盘数据库的毫秒级,性能要更好
- 高效I/O模型,Redis实现了I/O多路复用模型,基于单线程事件循环监听多个I/O请求
- 单线程模型,虽然是单线程,但单次请求速度非常快,避免了线程上下文切换和锁竞争,结合I/O多路复用模型性能很高
- 内存数据结构经过极致优化,以在性能和空间效率之间取得最佳平衡

既然Redis支持持久化,为什么不当作主数据库呢?
- Redis为内存数据库,内存的成本很高
- 虽然支持持久化,但是仍然有数据丢失的风险,所以不适合作为主数据库
本地缓存 vs 分布式缓存
| 维度 | 本地缓存 | 分布式缓存 |
|---|---|---|
| 数据一致性 | 多服务器部署难以维护数据一致性 | 最终一致性 |
| 内存限制 | 受限于本机内存 | 独立部署,可横向扩展 |
| 数据丢失风险 | 服务器宕机数据丢失 | 支持持久化,不易丢失 |
| 性能 | 高 | 相对较低,存在网络传输延迟 |
| 管理维护 | 缓存分散,难以维护 | 独立部署,集中管理 |
| 图示 | ![]() |
![]() |
缓存本质上属于空间换时间的思想,但是缓存不是银弹,分布式缓存的引入增加了系统复杂度,需要保证缓存的高可用
本地内存适合缓存只读数据,比如商品详情之类的只读数据
Redis事务
MULTI+EXEC+DISCARD
Redis事务和传统数据的事务不太一样,不满足ACID,更像是将一组命令打包,这组命令执行期间不会被打断,满足隔离性,但是失败不会回滚,不满足原子性
MULTI
> OK
SET PROJECT "String"
> QUEUED
GET PROJECT
> QUEUED
EXEC
> OK
LUA脚本(推荐)
LUA脚本相对来说使用更多,相对于MULTI来说,具有以下优势
- 命令执行失败后,后续命令不再执行,而MULTI会继续执行后续命令
- 网络传输更加高效,所有命令一次性传输,而MULTI是每添加一条命令就立即传输
两种事务原理都是在执行过程中不会被其他命令打断,从而保证原子性
两种事务机制性能对比
待补充



浙公网安备 33010602011771号