undefined

Redis 和 MySQL 的联系和区别

一、区别

  • Mysql是关系型数据库,主要用于存放持久数据,将数据存放在硬盘中,读取速度相对较慢。每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库会产生以下问题:
    • 会在反复链接数据库上花费大量的时间,从而导致运行效率过慢
    • 反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生出来了

查看更多

undefined

Codis 原理

一、Codis 的整体架构和基本流程

Codis 集群中包含了 4 类关键组件

  • codis server:基于 redis 3.2.8 二次开发的 redis 实例,其中增加了额外的数据结构,支持数据迁移操作,主要负责处理具体的数据读写请求
  • codis proxy:接收客户端请求,并把请求转发给 codis server
  • Zookeeper 集群:保存集群元数据,例如数据为止信息和 codis proxy 信息。codis 也可以使用 etcd 或本地文件系统保存元数据信息
查看更多

undefined

切片集群

如果redis要存储的数据量特别大,那么进行RDB持久化时会使主线程的写请求因为要申请内存而变慢。因此只是提升单台机器的CPU、mem是不能解决问题的。要考虑切片集群(多个redis实例组成一个集群)

切片集群面临问题

  1. 数据切片后,在多个实例之间如何分布?
  2. 数据端怎么确定想要访问的数据在那个实例上?
查看更多

undefined

Redis 批量操作

一、为什么需要批量执行 redis 指令

Redis 协议采用的是客户端-服务器方式,客户端发送一条指令,服务端解析指令并执行,然后向客户端返回结果。客户端发起一次 redis 请求主要有如下开销:

  • socket IO 导致的上下文切换开销。一次 redis 请求在客户端和服务端分别会存在一次 read() 和 一次 write() 系统调用。
  • 高并发下资源竞争和系统调用。
    • 在客户端,如果采用调用多次 redis 指令来完成某个服务请求,那么在高并发下,多个请求会在多个线程中同时竞争 redis 连接资源多次,导致连接池压力增加,线程上下文切换频繁。如果每个请求只抢占一次 redis 连接并通过批量执行的方式一次处理多个请求,则单次请求的效率会显著提升
查看更多

undefined

Redis的高可靠性:1. 数据尽量少丢失 2. 服务尽量少中断。AOF和RDB 保证了前者,对于后者增加了副本冗余量,即将一份数据同时保存在多个实例上。

问题:多副本,他们之间的数据如何保持一致呢?数据读写操作可以发给所有的实例吗?

Redis数据同步

Redis提供主从库模式,保证数据副本的一致,主从库之间采用的是读写分离的方式

读操作:主库、从库都可以接收

写操作:首先到主库执行,然后,主库将写操作同步给从库

查看更多