Redis study

这篇blog摘抄自《Redis开发与运维》,供自己学习使用。

  • Redis: Remote Dictionary Server

  • 将数据分为热数据和冷数据,比如视频信息是热数据,放在redis中可以加快读写。

  • 5种数据结构:

    • 字符串 string

      • Bitmap 位图
      • HyperLogLog
    • 哈希 hash

    • 列表 list

    • 集合 set

    • 有序集合 zset

  • 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码.
1
2
3
4
127.0.0.1:6379> OBJECT encoding java
"embstr"
127.0.0.1:6379> OBJECT encoding mylist
"quicklist"
image-20210311141000387 image-20210311141053562
  • 持久化

    • RDB

    • AOF

字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。如图2-7所示,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

image-20210311100114986 image-20210311142325597

复制原理

image-20210312155735502

内存

image-20210313152433108

避免使用过长的key

建议主节点挂载的从节点不超过两个

正常的碎片率(mem_fragmentation)在1.03左右,解决方案

  • 数据对齐
  • 安全重启

动态调整内存上限,最简单最理想化的例子:

image-20210313154353253

建议所有进程都要配置maxmemory.

哨兵 Sentinel

image-20210313200057532

提高整个系统的可用性

分布式架构
image-20210313203605144

Sentinel 原理

  • 三个定时任务
  • 主观下线
  • 客观下线
  • 领导者选举
  • 故障转移

Redis 分布式方案

  • 客户端分区方案,把数据分到多个节点上。

    • 哈希分区
    • 顺序分区(Redis采用这种规则)
  • 代理方案

image-20210314143218147

虚拟槽分区 SLOT

Slot :使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽,是数据迁移的基本单位。

节点通信

  • ping: 检测在线 交换状态信息(自身节点和部分其他节点的状态数据)
  • pong: 回应ping meet,(自身节点和部分其他节点的状态数据)
  • meet: 通知新节点加入
  • fail:判定集群内另一节点的下线时,通知别人
image-20210314152617475

集群伸缩=槽和数据在节点间移动

image-20210314154449203

建议使用redis-trib.rb add node这样的工具进行自动加入新节点,如果手动加入的话,万一旧节点里有数据可能会导致错乱。