陈宗志:大容量redis存储方案--Pika
大容量redis存储方案--Pika 陈宗志 360基础架构组技术经理 SACC2017 简介 • 13年入职360 基础架构组 – Bada – Pika – Zeppelin – Mario, Pink, slash, floyd • https://github.com/Qihoo360 SACC2017 概要 • 存在问题 • 分析问题 • 解决问题 • Pika vs redis SACC2017 • Pika 是DBA 和 基础架构团队一起设计开发的 大容量redis的解决方案 • 完全兼容redis 协议, 用户不需要修改任何代码 进行迁移 Introduction SACC2017 • Redis实例数量:6000+个 • 日访问量:5000+亿 • Pika数据数量:1000+个 的出现并不是为了替代 Redis,而是 Redis 的场景补充。 Pika 力求在完全兼容 Redis 协议、继承 Redis 便 捷运维设计的前提下通过持久化存储的方式解决 Redis 在大容量场景下的问题 Pika 定位 SACC2017 Redis 问题 • 恢复时间长 • 一主多从, 主从切换代价大 • 缓冲区写满问题 • 成本问题0 码力 | 47 页 | 2.18 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector
resize 的目标长度大于原有的容量时, 就需要重新分配一段更大的连续内存,并 把原数组长度的部分移动过去,多出来的 部分则用 0 来填充。这就导致元素的地址 会有所改变,从而过去 data 返回的指针 以及所有的迭代器对象,都会失效。 vector 容器: resize 到更小尺寸不会导致 data 失效 • 当 resize 的目标长度小于原有的容量时, 不需要重新分配一段连续的内存也不会造 之后,数组的容量仍 然是 5 ,因此重新扩容到 5 是不需要重 新分配内存的,也就不会移动元素导致指 针失效。 vector 容器: capacity 函数查询实际的最大容量 • 可以用 capacity() 函数查询已经分配内存的大小,即最大容 量。 • 而 size() 返回的其实是已经存储了数据的数组长度。 • 可以发现当 resize 指定的新长度一个超过原来的最大容量时 时 时,就会重新分配一段更大容量的内存来存储数组,只有这时 才会移动元素的位置( data 指针失效)。 • size_t capacity() const noexcept; vector 容器: resize 的优化策略 • 注意这里 resize(7) 之后容量实际上扩充到了 10 而不是刚好 7 ,为什么 ? • 因为标准库的设计者非常聪明,他料想到了你 resize(7) 以后可能还会来0 码力 | 90 页 | 4.93 MB | 1 年前3鸟哥的 Linux 私房菜:基础学习篇 第四版
2 一切设计的起点:CPU 的架构, RISC与ARM, CISC与x86 0.1.3 其他单元的设备 0.1.4 运行流程 0.1.5 电脑按用途分类 0.1.6 电脑上面常用的计算单位 (容量、速度等) 0.2 个人电脑架构与相关设备元件 0.2.1 执行脑袋运算与判断的 CPU:CPU的工作频率,32位与64位,CPU等级, 超线程 0.2.2 内存:多通道, DRAM与SRAM 人,所创建的或拥有的文件是否会相同呢?例如系统管理员与一般身份使用者的文件? 当然 不太一样!除此之外,如果您的硬盘空间不足,需要增加硬盘时,应该要如何新增呢? 还 有,内存不足的情况下,有没有增进虚拟内存容量的方法?在接下来的几个章节之中,我们 将介绍 Linux 主要的文件架构、以及磁盘在 Linux 当中该如何使用及挂载等问题。 第五章 Linux文件权限与目录配置 鸟哥的 Linux 私房菜:基础学习篇 重点回顾 6.8 本章习题 6.9 参考资料与延伸阅读 第七章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不能太 小,太大会造成磁盘容量的浪费, 太小则会产生文件无法储存的困扰。此外,我们在前面几 章谈到的文件权限与属性中, 这些权限与属性分别记录在.....2015/06/26 7.1 认识 Linux 文件系统 7.1.10 码力 | 1158 页 | 13.73 MB | 1 年前3鸟哥的Linux私房菜:基础学习篇 第四版
不同的身份的人,所创建的或拥有的文件 是否会相同呢?例如系统管理员与一般身份使用者的文件? 当然不太一样!除此之外,如果您的硬盘空间不足,需要 增加硬盘时,应该要如何新增呢? 还有,内存不足的情况下,有没有增进虚拟内存容量的方法?在接下来的几个章节 之中,我们将介绍 Linux 主要的文件架构、以及磁盘在 Linux 当中该如何使用及挂载等问题。 Linux最优秀的地方之一,就在于他的多用户多任务的环境。而为了让各个使用者具有较保密的文件数据, 磁盘与文件系统管理 1. 目录及概述 - 12 - 本文档使用 书栈(BookStack.CN) 构建 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不能太小,太大会造成磁盘容量 的浪费, 太小则会产生文件无法储存的困扰。此外,我们在前面几章谈到的文件权限与属性中, 这些权限与属性分 别记录在…..2015/06/26 9.1. 7.1 认识 Linux 文件系统 9 13.9 本章习题 15.10. 13.10 参考资料与延伸阅读 如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁盘配额 (Quota) 就是一项非常有用的工具!另外,如果你的用户常常抱怨磁盘容量不够用,那么更进阶的文件系统就得要 学习学习…..2015/07/28 16.1. 14.1 磁盘配额 (Quota) 的应用与实作 16.2.0 码力 | 1057 页 | 14.60 MB | 1 年前3Hello 算法 1.1.0 Go版
349 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 383 页 | 18.48 MB | 1 年前3Hello 算法 1.1.0 C#版
344 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 378 页 | 18.47 MB | 1 年前3Hello 算法 1.1.0 JavaScript版
345 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 (nums[i] === target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 379 页 | 18.46 MB | 1 年前3Hello 算法 1.1.0 Python版
331 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 63 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 range(len(nums)): if nums[i] == target: return i return -1 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 364 页 | 18.42 MB | 1 年前3Hello 算法 1.1.0 TypeScript版
349 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 (nums[i] === target) { return i; } } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 383 页 | 18.49 MB | 1 年前3Hello 算法 1.2.0 简体中文 C# 版
345 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 15.4 最大切分乘积问题 . . 结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 www.hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? 这是因为原码和补码的相互转换实际上是计算“补数”的过程。我们先给出补数的定义:假设 ? + ? = ? , 那么我们称 ? 是0 码力 | 379 页 | 18.48 MB | 9 月前3
共 413 条
- 1
- 2
- 3
- 4
- 5
- 6
- 42