深入浅出聊聊 Redis 高级特性
mhr18 2024-11-25 10:44 23 浏览 0 评论
深入浅出聊聊 Redis 高级特性
String 在 redis 内部存储默认就是一个字符串,被 redisObject 所引用,当遇到 incr,decr 等操作时会转成数值型进行计算,此时 redisObject 的 encoding 字段为int。
Redis 数据结构
Redis 常用的数据类型主要有以下五种:
String
Hash
List
Set
Sorted set
Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。
String 在 redis 内部存储默认就是一个字符串,被 redisObject 所引用,当遇到 incr,decr 等操作时会转成数值型进行计算,此时 redisObject 的 encoding 字段为int。
list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
Hash 对应 Value 内部实际就是一个 HashMap,实际这里会有2种不同实现,这个 Hash 的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的 HashMap 结构,对应的 value redisObject 的 encoding 为 zipmap,当成员数量增大时会自动转成真正的 HashMap,此时 encoding 为 ht。
Redis 存储
Redis 提供了一系列不同的持久性选项:
- RDB 持久性以指定的时间间隔执行数据集的时间点快照。
- AOF 持久性会记录服务器接收到的每个写入操作,这些操作将在服务器启动时再次执行,重建原始数据集。使用与Redis协议本身相同的格式以追加方式记录命令。
RDB的优点:
- RDB是Redis数据的非常紧凑的单文件时间点表示。
- RDB文件非常适合备份。
RDB的缺点:
- 快照不是非常耐用。如果运行Redis的计算机停止运行,电源线出现故障,或者意外地终止了您的实例,写入Redis的最新数据将丢失。
- 为了使用子进程在磁盘上保留RDB,RDB需要经常fork。如果数据集很大,Fork会很费时,并且可能导致Redis在几毫秒内停止服务客户端,或者如果数据集非常大并且CPU性能不佳,甚至会持续一秒。
Redis 需要将数据集转储到磁盘时,会发生以下情况:
- Redis fork。我们现在有一个子进程和一个父进程。
- 子进程开始将数据集写入临时RDB文件。
- 当子进程写完新的RDB文件后,它会替换旧的。
AOF的优势:
AOF日志是一种只能追加的日志,因此如果发生停电,也不会出现问题。
AOF的缺点:
- AOF文件通常比相同数据集的等效RDB文件大。
- 根据确切的fsync策略,AOF可能比RDB慢。
Redis将在磁盘上同步数据的次数。有三种选择:
- 每当一个新命令被附加到AOF时,fsync。非常非常缓慢,非常安全。
- 每秒fsync。足够快(在2.4可能与快照一样快),并且如果发生灾难,您可能会丢失1秒的数据。
- 永远不要fsync,只需将您的数据交给操作系统即可。更快,不安全的方法。
日志重写使用已用于快照的相同的写入时复制技巧。这是如何工作的:
- Redis fork,所以现在我们有子进程和一个父进程。
- 子进程开始在临时文件中写入新的AOF
- 父进程将所有新的更改累积到内存缓冲区中
- 当子进程完成重写文件时,父进程获取信号,并在子进程生成的文件末尾追加内存缓冲区的内容。
- Redis自动将旧文件重命名为新文件,并开始将新数据附加到新文件中。
Redis 事务
Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability),简称ACID。
原子性(Atomicity)
Redis 本身提供的所有 API 都是原子操作。
但 Redis 在事务执行过程的错误情况做出了权衡取舍,那就是放弃了回滚。
Redis 官方文档对此给出的解释是:
1、Redis 操作失败的原因只可能是语法错误或者错误的数据库类型操作,这些都是在开发层面能发现的问题不会进入到生产环境,因此不需要回滚。
2、Redis 内部设计推崇简单和高性能,因此不需要回滚能力。
一致性(Consistency)
一致性意味着事务结束后系统的数据依然保证一致。
Redis 舍弃了回滚的设计,基本上也就舍弃对数据一致性的有效保证。
隔离性(Isolation)
隔离性保证了在事务完成之前,该事务外部不能看到事务里的数据改变。
Redis 采用单线程设计,隔离性得到保证。
持久性(Durability)
Redis 一般情况下都只进行内存计算和操作,持久性无法保证。
但 Redis 也提供了2种数据持久化模式,RDB 和 AOF,RDB 的持久化操作与命令操作是不同步的,无法保证事务的持久性。而 AOF 模式意味着每条命令的执行都需要进行系统调用操作磁盘写入文件,可以保证持久性,但会大大降低 Redis 的访问性能。
Redis 主从
Redis的主从结构可以采用一主多从或者级联结构:
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。
具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis 场景
常见的 NoSQL 方案分为 4 类。
- K-V 存储:解决关系数据库无法存储数据结构的问题,以 Redis 为代表。
- 文档数据库:解决关系数据库强 schema 约束的问题,以 MongoDB 为代表。
- 列式数据库:解决关系数据库大数据场景下的 I/O 问题,以 HBase 为代表。
- 全文搜索引擎:解决关系数据库的全文搜索性能问题,以 Elasticsearch 为代表。
缓存的架构设计要点:
缓存穿透是指缓存没有发挥作用,业务系统虽然去缓存查询数据,但缓存中没有数据,业务系统需要再次去存储系统查询数据。
通常情况下有两种情况:
- 1、存储数据不存在
- 2、缓存数据生成耗费大量时间或者资源
缓存雪崩是指当缓存失效(过期)后引起系统性能急剧下降的情况。
缓存热点的解决方案就是复制多份缓存副本,将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力。
读写分离+多级缓存策略
首页分流加载
感谢您耐心看完了文章~
小编这里整理了一份资料:
里面包括(Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、Redis、ActiveMQ、Java面试资料)也有详细的Java进阶路线脑图。
领取方式:
关注作者,私信关键词 “ 666 ” 即可!
- 上一篇:三天吃透Redis面试八股文
- 下一篇:Redis - NoSQL 入门
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)