Redis

Redis

缓存通识

缓存:存储在计算机上的一个原始数据复制集,便于访问
缓存时介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。
缓存的关键指标
缓存命中率:缓存是否有效依赖于能多少次重用同一个缓存数据响应业务请求。
命中率=总的查询次数/命中次数
影响缓存命中率的主要指标

  • 缓存键集合大小 例如 动物和哺乳动物范围
  • 缓存可使用内存空间
  • 缓存对象生存时间 TTL
    举个栗子 缓存键集合想象成打靶的环数 打在靶上和打中靶心表示的集合大小就完全不同,如果定义成功为打在靶上 那么命中率就大大提高;
    缓存可使用内存空间 可认为是靶的大小直径1米和直径100米的靶命中率哪个高呢 在不考虑射靶人的技术情况下肯定是直径100的命中率高
    缓存对象生存时间则可想象靶是升降的 1秒钟就会消失的靶和一直在那里的靶哪个的命中率高呢?结果显而易见,当然这基于多次射靶并且是在比较长的时间内,这也和缓存的多次查询需求相对应。

redis内存模型

Redis内存划分

数据(最主要)
Redis 使用键值对存储数据,其中的值(对象)包括 5 种类型,即字符串、哈希、列表、集合、有序集
合。
进程(几M 可忽略)
缓冲内存
内存碎片:应该尽量减少内存碎片,如通过安全重启的办法,数据在内存重排。

Redis数据存储

jemalloc
redis默认的内存分配器,能够有效减少内存碎片的产生,将内存空间分为大中小范围,每隔范围内再次进行划分内存单位,当redis存储数据时会根据大小最合适的内存块进行存储。
redisObject
Redis对象有5种类型;无论是哪种类型,Redis都不会直接存储,而是通过redisObject对象进行存储。
redis对象结构

{ 
unsigned type:4;//类型 五种对象类型 
unsigned encoding:4;//编码 
void *ptr;//指向底层实现数据结构的指针 
//... 
int refcount;//引用计数 //... 
unsigned lru:24;//记录最后一次被命令程序访问的时间 
//... 
}robj;

0~9999之间的整数会作为共享对象。
SDS是简单动态字符串(Simple Dynamic String)的缩写。

Redis 设计优化

估算redis内存使用量
优化内存占用
利用jemalloc特性进行优化
使用整型/长整型
共享对象
缩短键值对的存储长度

Redis持久化

三种持久化方案:RDB方式(默认);AOF方式;混合持久化模式

RDB

RDB 方式是通过快照( snapshotting )完成的,当符合一定条件时 Redis 会自动将内存中的数据进行
快照并持久化到硬盘
触发RDB快照的时机

  • 符合指定配置的快照规则
  • 执行sava或bgsave命令
  • 执行flushall 或flushdb
  • 执行主从复制操作
    RDB快照的实现原理
    快照过程
  • Redis 调用系统中的 fork 函数复制一份当前进程的副本(子进程) 2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。 3. 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此,一次快照操作完成。
    快照过程
    fork-调用一个子进程,制作快照,生成RDB文件, 替换掉原来的RDB文件,RDB文件任何时候都是完整的。
    RDB优缺点
    缺点:使用 RDB 方式实现持久化,一旦 Redis 异常退出,就会丢失最后一次快照以后更改的所有
    数据。这个时候我们就需要根据具体的应用场景,通过组合设置自动快照条件的方式来将可能发生
    的数据损失控制在能够接受范围。如果数据相对来说比较重要,希望将损失降到最小,则可以使
    用 AOF 方式进行持久化
    优点: RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子
    进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘 I/O 操作。同
    时这个也是一个缺点,如果数据集比较大的时候, fork 可以能比较耗时,造成服务器在一段时间
    内停止处理客户端的请求;

AOF

开启 AOF 持久化后,每执行一条会更改 Redis 中的数据的命令, Redis 就会将该命令写入硬盘中的
AOF 文件,这一过程显然会降低 Redis 的性能,但大部分情况下这个影响是能够接受的,另外使用较
快的硬盘可以提高 AOF 的性能。
Redis 每次更改数据的时候, aof 机制都会将命令记录到 aof 文件,但是实际上由于操作系统的缓存
机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件。
混合持久化
结合RDB和AOF的优点;在写入的时候,先把当前
的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保
证 Redis 重启时的速度,又能减低数据丢失的风险。

Redis主从复制

为什么要引入主从复制?
持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据
恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能会导致数据丢失,不过通过 Redis 的主从复制
机制就可以避免这种单点故障,
什么是主从复制?

  • 主 Redis 中的数据有两个副本( replication )即从 redis1 和从 redis2 ,即使一台 Redis 服务器宕机其它两台 Redis 服务也可以继续提供服务。
  • 主 Redis 中的数据和从 Redis 上的数据保持实时同步,当主 Redis写入数据时通过主从复制机制 会复制到两个从 Redis 服务上。
  • 只有一个主 Redis ,可以有多个从 Redis 。
  • 主从复制不会阻塞master ,在同步数据时, master 可以继续处理 client 请求。
  • 一个 Redis 可以即是主又是从。
    主从同步
    Redis 的主从同步,分为全量同步和增量同步。
    只有从机第一次连接上主机是全量同步。
    断线重连有可能触发全量同步也有可能是增量同步( master 判断 runid 是否一致)。
    除此之外的情况都是增量同步。
    全量同步
    Redis 的全量同步过程主要分三个阶段:
    同步快照阶段: Master 创建并发送快照给 Slave , Slave 载入并解析快照。 Master 同时将此阶
    段所产生的新的写命令存储到缓冲区。
    同步写缓冲阶段: Master 向 Slave 同步存储在缓冲区的写操作命令。
    同步增量阶段: Master 向 Slave 同步写操作命令

Reidi 哨兵机制(面试)

为什么要用到哨兵机制?
哨兵(Sentinel)主要是为了解决在主从复制架构中出现宕机的情况,主要分为两种情况:
从Redis宕机:重启后自动加入主从架构,自动完成同步数量
主Redis宕机:a. 在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务
b. 第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来
哨兵机制的高可用:监视多个主服务器和从服务器,并在被监视的主服务下线时自动将下线的主服务属下的某个从服务器升级为新的主服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值