开篇思考
- Redis 为什么在系统中使用?解决了哪些问题?
- Redis 如何保证和数据库同步?
- Redis 缓存操作是在操作数据库前还是操作数据库后?
话还得从上次报税说起,耳边还回绕这残留的芬芳:“SX系统,这也不能点,那也不能用!”,
身为程序员的我听到总是百感交集,程序员背锅是免不了了。。。
上线至今都能用的系统,突然就不行了,为什么?问题就在稳定性和系统架构上,发现问题就要吸取经验和血的教训。
我也特别喜欢吐槽,我觉得正确的吐槽姿势有助于系统的良性发展,就像父母的爱强烈扎刺着程序员面临崩溃的心灵,流出的爱的液体浇灌给系统茁壮成长。
系统稳定,快速,美如画谁都想追求,可是往往美好的东西后面代价也不小。
追求可靠,我们需要+集群部署,容错容灾,那么就需要更多的机器设施及其他附属服务。
追求快速,我们需要解决地域限制,全球部署战斗机,DNS 快速定位访问,软件层面缓存技术。
那么接下来我们就来扒一扒分布式系统架构中 Redis 的使用,进入正题,不扯蛋了。
让我们看看 Redis 给分布式系统带来哪些好处和问题的解决方案,看看这些代价是否值得。
Redis 简介
- 内存存储,速度极快
- key-value 存储结构
- 支持 string,list,set,zset,hash 类型,其实还有一些不常用的
- 基于 epoll 多路复用,串行执行效率高
- 可以持久化数据,遇到宕机可以快速恢复
- redis 支持主从模式、哨兵模式
- 使用场景丰富:热点数据缓存、临时会话存储、消息发布订阅、网页计数
上面的介绍中,我基本扒出了 redis 的主要特点,外衣都给你扒了,这么赤裸的诱惑你们都不要吗?觉得还是不够吸引吗?
那我们就继续来扒拉扒拉。。。
内存
Redis 都是通过计算机内存来存取的,不用多解释。它为什么快? JMM java 中的内存模型大家了解吧,java 中每个线程会有自己的内存,要想达成可见性,需要同步主内存,这一操作听起来
很简单,但其实里面数据被拷贝了多次。这里简单介绍下传统的磁盘到网络的数据拷贝流程:
- 磁盘到 read buffer, 快
- read buffer 到 user buffer ,此处很慢,上下文有切换
- user buffer 到 socket buffer ,快
- socket buffer 写入到网卡 buffer 发送,快
好家伙,不扒不知道,原来底层数据是这么传输的。Redis 为什么快呢,因为它官方只支持 linux 系统,而 Linux
本身还支持零拷贝技术,并且这里都是纯内存操作,所有的数据操作都非常快。那么究竟有多快呢,
一秒真男人:读 10 w/s;写 8w/s; 当然数据只能是小数据流量的。
零拷贝技术被广泛应用在 Java NIO,netty,kafka 等。
redis 实现系统的接口幂等控制
每个工程师都应该知道接口幂等的重要性,在分布式系统中,接口幂等的设计原则贯彻始终。 所谓接口幂等就是无论我在某个业务执行过程中调用多少次接口,得到的结果都应该和调用一次接口得到的结果一样。 因此我们知道查询、删除这些是天然幂等的,没有必要再做幂等性控制。 那么一般哪些接口需要实现幂等控制呢?redis 是起了什么作用?
- 新增接口