《Redis 设计与实现》

【还有五天】开学季当当计算机图书大促

久未见 提交于 2020-11-27 07:32:02
开学季 当当网计算机图书大促 >> 每满100减50 << 满200减100 满300减150 满400减200 不止如此!秉持绝不让大家多花一分钱的精神 机械工业出版社华章公司 联合 实时流式计算 特别送出一批优惠码 “实付满200减40” 可以和满减活动 叠加 使用 优惠码使用后相当于 花160买400的书! 超低门槛!超大力度!快快上车! 选书太纠结?推荐几本必买的好书新书 助你囤的疯狂、读的畅快,绝不后悔! 推荐书单 01 《MySQL技术内幕:InnoDB存储引擎 第2版》 推荐语:国内外数据库专家联袂推荐,基于MySQL5.6,从存储引擎内核角度对InnoDB的核心实现和工作机制进行深入剖析。 02 《Redis设计与实现》 推荐语 :系统而全面地描述了 Redis 内部运行机制,图示丰富,描述清晰,并给出大量参考信息,是NoSQL数据库开发人员案头必备。 03 《HBase原理与实践》 推荐语:HBasePMC成员与网易资深工程师倾力打造,多位技术专家联袂推荐。本书系统介绍HBase基本原理与运行机制,融入了作者多年的开发经验与实践技巧。 04 《ClickHouse原理解析与应用实战》 推荐 语:这是一本可帮助读者深度理解并全面掌握ClickHouse运行原理并进行实践开发的工具书,涵盖了ClickHouse的时代背景、发展历程、核心概念、基础功能、运行原理

Redis 10亿数据量只需要100MB内存,为什么这么牛?

元气小坏坏 提交于 2020-11-02 05:35:21
作者:java架构设计 来源:toutiao.com/i6767642839267410445 粉丝福利1: 教妹子手撸了50个项目实战后,我住院了…… 粉丝福利2: 我写了10 万字 Spring Boot 详细学习笔记(带完整目录)+源码,分享给大家 本文主要和大家分享一下redis的高级特性:bit位操作。 力求让大家彻底学会使用redis的bit位操作并掌握其底层实现原理!主要包含以下内容: redis位操作命令示例 底层数据结构分析 为什么他的算法时间复杂度是O(1)? 10亿数据量需要多大的存储空间? redis位操作适合哪些应用场景? 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalone mode redis位操作 reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。 先来看一波基本操作示例: SETBIT 语法:SETBIT key offset value 即:命令 key 偏移量 0/1 setbit命令用于写入位数组指定偏移量的二进制位设置值,偏移量从0开始计数,且只允许写入1或者0,如果写入非0和1的值则写入失败: GETBIT 语法:GETBIT key offset 即:命令

Redis数据结构——整数集合

元气小坏坏 提交于 2020-10-28 20:17:45
前言 整数集合(intset)并不是一个基础的数据结构,而是Redis自己设计的一种存储结构,是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis i就会使用整数集合作为集合键的底层实现。 一、整数集合实现 整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。 //每个intset结构表示一个整数集合 typedef struct intset{ //编码方式 uint32_t encoding; //集合中包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[]; } intset; contents数组是整数集合的底层实现,整数集合的每个元素都是 contents数组的个数组项(item),各个项在数组中按值的大小从小到大有序地排列,并且数组中不包含任何重复项。 length属性记录了数组的长度。 intset结构将contents属性声明为int8_t类型的数组,但实际上 contents数组并不保存任何int8t类型的值, contents数组的真正类型取决于encoding属性的值。encoding属性的值为INTSET_ENC_INT16则数组就是uint16

听说go语言越来越火了?那么请收下这一份go语言书单吧!

僤鯓⒐⒋嵵緔 提交于 2020-08-12 02:26:08
关注公众号【程序员书单】后回复“book”即可领取30+精品免费电子书 ​ Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的语言么,今天就来推荐一份go语言书单吧。 go语言系列书单 ​ Go语言核心编程 Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用; 在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。 此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱

听说go语言越来越火了?那么请收下这一份go语言书单吧!

北慕城南 提交于 2020-08-11 20:46:34
关注公众号【程序员书单】后回复“book”即可领取30+精品免费电子书 ​ Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的语言么,今天就来推荐一份go语言书单吧。 go语言系列书单 ​ Go语言核心编程 Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用; 在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。 此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱

Redis学习笔记(九) AOF持久化

会有一股神秘感。 提交于 2020-08-11 08:49:19
除了RDB持久化功能之外,Redis还提供了AOF持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。 服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭前的数据库状态。 AOF持久化功能的实现可以分为命令追加append、文件写入、文件同步sync三个步骤。 1、服务器在执行完一个写命令后,会议协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。 2、Redis的服务器进程是一个时间循环,这个循环中的文件事件负责接收客户端的命令请求,以及回复,而时间事件则负责执行定时运行的函数,所以服务器每次结束一个事件循环之前他都会调用flushAppendOnlyFile函数,考虑(appendfsync配置)是否将aof_buf缓冲区的内容写入和保存到AOF文件中。 appendfsync值:always(每个事件循环都要同步将aof_buf中的内容写入AOF文件)、everysec (每秒)、no(每个事件循环都要写,但是时写入系统缓冲区) AOF数据还原 : 1、创建一个不带网络的伪客户端(redis只能在客户端中执行) 2、从APF文件中分析并读出一条写命令3、使用伪客户端执行被读出的写命令4、重复2、3步骤 直到全部处理完成。 AOF重写

Redis学习笔记(二) 链表

廉价感情. 提交于 2020-08-11 08:30:33
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。 redis中链表应用广泛,如list中就使用了链表。 每一个链表节点使用listNode结构标识(双向链表): typedef struct listNode{ // 前置节点 struct listNode * prev; // 后置节点 struct listNode * next; // 节点值 void * value; } 链表大家都熟悉不做过多说明,再看下list结构的实现: typedef struct list{ listNode *head; // 表头节点 listNode *tail;/ 表尾节点 unsigned long len; // 链表所包含的节点数量 void *(*dup)( void *ptr); // 节点值赋值函数 void (* free ) ( void *ptr); // 节点值释放函数 int (*match)( void *ptr, void *key); // 节点值对比函数 } Redis 链表实现的特点: 1、双向链表,获取前置后置节点的时间复杂度都是O(1); 2、无环,对链表的访问以NULL为终点。 3、带有表头表尾指针,程序获取链表的表头节点和表尾节点的复杂度为O(1); 4、带链表长度计数器

听说go语言越来越火了?那么请收下这一份go语言书单吧!

£可爱£侵袭症+ 提交于 2020-07-28 12:40:31
关注公众号【程序员书单】后回复“book”即可领取30+精品免费电子书 ​ Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的语言么,今天就来推荐一份go语言书单吧。 go语言系列书单 ​ Go语言核心编程 Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用; 在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。 此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱

听说go语言越来越火了?那么请收下这一份go语言书单吧!

廉价感情. 提交于 2020-07-28 09:45:01
关注公众号【程序员书单】后回复“book”即可领取30+精品免费电子书 ​ Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的语言么,今天就来推荐一份go语言书单吧。 go语言系列书单 ​ Go语言核心编程 Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用; 在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。 此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱

Redis对象——有序集合(ZSet)

我的梦境 提交于 2020-04-18 14:50:54
Redis对象——有序集合(ZSet) 有序集合类型 (Sorted Set或ZSet) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。 一、内部实现# 有序集合是由 ziplist (压缩列表) 或 skiplist (跳跃表) 组成的。 当数据比较少时,有序集合使用的是 ziplist 存储的,有序集合使用 ziplist 格式存储必须满足以下两个条件: 有序集合保存的元素个数要小于 128 个; 有序集合保存的所有元素成员的长度都必须小于 64 字节。 如果不能满足以上两个条件中的任意一个,有序集合将会使用 skiplist 结构进行存储。 有关ziplist 和skiplist 这两种redis底层数据结构的具体实现可以参考我的另外两篇文章。 Redis数据结构——压缩列表 Redis数据结构——跳跃表。 二、常用命令# Redis列表对象常用命令如下表(点击命令可查看命令详细说明)。 命令 说明 时间复杂度 BZPOPMAX key [key ...] timeout 从一个或多个排序集中删除并返回得分最高的成员,或阻塞,直到其中一个可用为止 O(log(N))