SDS

[redis]SDS和链表

穿精又带淫゛_ 提交于 2020-05-01 10:53:21
一、SDS 1、SDS结构体 redis3.2之前 :不管buf的字节数有多少,都用 4字节的len来储存长度 ,对于只存短字符串那么优点 浪费空间 ,比如只存 name ,则 len=4 则只需要一个字节8位即可表示 struct sdshdr { unsigned int len; // buf中已占字节数 unsigned int free; // buf中剩余字节数 char buf[]; // 数据空间 }; redis3.2之后: struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; //已分配字节数 uint8_t alloc; //剩余字节数 unsigned char flags; //标识属于那种类型的SDS 低3存类型,高5不使用 char buf[]; }; //........16、32、64 _ attribute _ ((_ packed _)) 关键字是为了取消字节对齐 struct test1 { char c; int i; }; struct __attribute__ ((__packed__)) test2 { char c; int i; }; int main() { cout << "size of test1:" << sizeof(struct test1) <<

通过扩展redis-cli来实现在redis集群中移动槽位

时光怂恿深爱的人放手 提交于 2020-05-01 02:46:19
下面的扩展代码基于redis 5.0.2进行扩展, 对于其他的redis版本, 我没有进行相关的测试。考虑到redis集群的修改频率,这段代码应该同时适用于其他的redis版本。 下面为修改的代码: static clusterManagerNode * clusterManagerByIpPort( const char* ip, int port); static int clusterManagerCommandMoveSlot( int argc, char **argv); { " move-slot " , clusterManagerCommandMoveSlot, 3 , " from-host:from-port to-host:to-port slotNo " , NULL}, // 根据ip和端口号来获取对应的redis集群节点 clusterManagerNode *clusterManagerByIpPort( const char * ip, int port) { if (cluster_manager.nodes == NULL) return NULL; clusterManagerNode *found = NULL; sds lcip = sdsempty(); lcip = sdscpy(lcip, ip); sdstolower(lcip)

10w+QPS 的 Redis 真的只是因为单线程和内存?360° 深入底层设计为你揭开 Redis 神秘面纱!

陌路散爱 提交于 2020-04-30 17:20:39
原文链接 : 10w+QPS 的 Redis 真的只是因为单线程和内存?360° 深入底层设计为你揭开 Redis 神秘面纱! 你以为 Redis 这么快仅仅因为单线程和基于内存? 那么你想得太少了,我个人认为 Redis 的快是基于多方面的:不但是单线程和内存,还有底层的数据结构设计,网络通信的设计,主从、哨兵和集群等等方面的设计~ 下面,我将 360° 为你揭开 Redis QPS达到10万/秒的神秘面纱。 一、底层数据结构设计 1、底层架构: 首先值得称赞的第一点:Redis 底层使用的数据结构很多,但是却没有直接使用这些数据结构来实现键值对数据库,而是基于数据结构创建了一个对象(redisObject)系统。(是不是觉得有点面向对象编程的意思 😂 ~) 对象系统里面包括了字符串对象,列表对象,哈希对象、集合对象和有序集合对象。 使用对象的好处: Redis 在执行命令之前,可以根据对象的类型判断这个对象是否可以执行给定的命令。 可以针对不用的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。 一个对象怎么设置不同的数据结构实现? 在讲解前,我们必须要了解 Redis 对象的结构。 它三个重要的部分:type 属性、encoding 属性,和 ptr 属性。 我们用字符串对象为例: 我们都知道,Redis 的 SET 命令其实是针对字符串的

Redis 学习笔记(篇五):对象(RedisObject)

不羁岁月 提交于 2020-04-27 02:31:14
Redis-对象 在以前的文章中,我们介绍了 Redis 用到的主要数据结构,比如简单动态字符串、双端链表、字典、压缩列表、整数集合。 然而 Redis 并没有直接使用这些数据结构来实现键值对的数据库,而是在这些数据结构之上又包装了一层 RedisObject(对象),RedisObject 有五种对象:字符串对象、列表对象、哈希对象、集合对象和有序集合对象。 还是跟以前一样,看几个问题: 使用 RedisObject 对象而不是直接使用双端队列、双端链表等数据结构,有什么好处呢? RedisObject 的具体结构是什么? 五种对象(string、hash、list、set、sort set)对应的 RedisObject 对象有何不同,底层使用的数据结构是什么? 使用 RedisObject 的好处 使用 RedisObject 的优点主要有两个,分别是: 通过不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。 我们可以针对不同的使用场景,为对象设置不同的实现,从而优化内存或查询速度。 RedisObject 的具体结构是什么? RedisObject 的源码如下: typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; //

TCL品牌升级,“饱和攻击”下B、C端“联袂”成为主航道

核能气质少年 提交于 2020-04-24 12:07:08
文|曾响铃 来源|科技向令说(xiangling0815) 2020年以来,商用显示领域持续沸腾,正如这前后不到一个月时间,先后有包括TCL、小米、华为在内的众多玩家将目光瞄向了商用显示市场(以下简称“商显”)。 TCL商用宣布2020年战略部署的调整,将“智显”移至中心舞台;红米发布98英寸大电视,“高调”进军商用;华为也凭借“企业智慧屏”入局商显,试着分一杯羹。 “商显”缘何突然就成了兵家必争之地? “集成化”趋势下,商显需要的是综合解决方案 企图在商显市场有所作为的远不止TCL、小米、华为三家,之外如三星、LG,又或是其他传统电视品牌,海信、康佳、创维们也一直在行业中深耕多年,却始终未能爆发。 原因主要来自两个方面,一是商显市场的体量足以让人眼红。 据AVC Revo数据显示,2019年商显市场规模接近850亿元,而2020年整体市场规模将会突破千亿。TCL电子控股有限公司副总裁、TCL信息科技(惠州)有限责任公司总经理张志伟在接受“科技向令说”采访时表示“硬件只是冰山一角,很多客户的需求是硬件+软件+差异化的定制,整体的市场规模应该远远大于千亿,甚至是它几倍。” 二是,尤其受疫情影响,消费信心受挫,C端存量市场告急,寻找新的增量市场,对于各类企业而言都是当务之急。 但商显市场不是企业说进来,就能玩得转的,第一步还需读懂行业的实际痛点。就目前来看商显市场的主要矛盾是

Redis数据存储结构之String

萝らか妹 提交于 2020-04-21 06:12:11
前言:   在Redis使用中,我们最常使用的操作是set key value,或 get key value 。这里面包含了redis最基本的数据类型:String,字符串类型是redis中最基本的类型,它能存储任何形式的字符串,包括二进制数据(JSON,Image...)。 大家有没有思考过redis是通过何种数据结构来存储数据的呢?今天来带大家一探究竟。 源码打开方式:   打开我们下载好的redis源码包,进入src目录,思考,怎么才能知道哪一个是String的结构类型的源码呢? 然后我们慢慢找,慢慢找, 哪一个像String的结构类型的源码呢? 诶,大兄嘚, 找到了, 这个sds.c像是String的源码,哈哈哈哈哈哈哈哈哈哈哈哈哈,真是机智! 实时证明,这是一种效率极其低下的方式。   正确的打开源码的方式是,查找官方文档。在Redis官方页面中,有Quick links,有官方的Github. 我们进入GitHub。在GitHub中,有对源码的简要描述。我们通过往下翻,找到如下描述:    我们可以看到官方介绍的很清楚,sds.c是Redis的字符串库。接下来,我们就可以快乐的去看源码了。 源码剖析: part1: sds.h   在源码包中,有sds.c和sds.h文件。在C语言中,.h文件一般为头文件,.c为源文件。在源文件中可以调用头文件中定义的变量,结构体

redis内存管理

佐手、 提交于 2020-04-17 08:16:55
【推荐阅读】微服务还能火多久?>>> 目录 一、内存统计 ​ 二、内存划分 ​ 三、内存消耗 四、缓冲内存 普通客户端缓冲区 slave客户端缓冲区 pubsub客户端缓冲区 一、内存统计 可以在 lua中自定义命令。 # Memory used_memory:33805895736 used_memory_human:31.48G used_memory_rss:42316582912 used_memory_rss_human:39.41G used_memory_peak:44346475840 used_memory_peak_human:41.30G total_system_memory:338519248896 total_system_memory_human:315.27G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:200000000000 maxmemory_human:186.26G maxmemory_policy:volatile-lru mem_fragmentation_ratio:1.25 mem_allocator:jemalloc-4.0.3 二、内存划分 内存碎片是操作系统分配给的内存和实际使用的内存的差值。 例如 存了一个string类型的key。

浅谈Redis五种数据结构的底层原理

假装没事ソ 提交于 2020-04-07 11:00:18
概念 Redis作为一个开源的用C编写的非关系型数据库,基于优秀的CRUD效率,常用于软件系统的缓存,其本身提供了以下五种数据格式: string:字符串 list:列表 hash:散列表 set:无序集合 zset:有序集合 接下来我们就要针对这五种数据结构,来分析其底层的结构 这里选用的版本是 redis-5.0.4 ,所以可能有很多地方和如今网络上的其他博文不太一致,不同的地方我会在文中指出 string 因为redis使用c语言开发,所以自然没有java和c++的那些字符串类库,在redis中,其自己定义了一种字符串格式,叫做SDS(Simple Dynamic String),即简单动态字符串 这个结构定义在sds.h中: typedef char *sds; 但是这个sds类型仅作为参数和返回值使用,并不是真正用于操作的类型,真正核心的部分是下面的这些类: struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; char buf[]; }; struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; uint8_t alloc; unsigned char flags; char buf[]; }; struct __attribute

【理论研究】漫谈云计算IT基础设施04-存储虚拟化

社会主义新天地 提交于 2020-04-06 15:54:46
本文欢迎转载,转载请注明出处和作者。 存储虚拟化的概念也是一个发展的过程。 在实现了计算虚拟化与网络虚拟化的时期,存储其实还未完成彻底的虚拟化,但是由于计算与网络都已经被叫上虚拟化了,所以存储也不得不借虚拟化的概念热炒一波。 因此在当时,以IBM SVC为首的一批名为虚拟化存储网关(如EMC VPLEX、华为Oceanstor VIS 6000)的设备,承担了存储虚拟化的名头。 01-存储虚拟化网关 如前面文章所说,存储这东西非常讨厌,不像x86服务器,资源不够了,可以直接scaleout扩容,只要往计算的资源池里面加入新的x86服务器,然后做负载均衡/集群等方式,就可以把它们整合起来了。 而磁盘阵列的扩容受以下几个因素限制: 1、同品牌限制: 例如你的IBM DS5300磁盘阵列空间不够了,但是你的华为OceanStor 5300V3还有很多空余的磁盘空间/磁盘扩展柜,不好意思,你是不能将华为OceanStor 5300V3的磁盘空间/磁盘扩展柜加入到DS5300给它进行扩容的。因此一旦你选定买了一个品牌的存储,通常只能被品牌绑定,一直扩容购买该品牌的设备了。 2、同品牌不同系列限制: 例如IBM的DS系列(DS5000)与V系列(V7000),由于后者是收购回来的,所以管理平台与某些技术都不一样,无法统一使用。 3、控制器的性能 每款磁盘阵列都会有控制器,而控制器的性能

一文带你深入了解 Redis 内存模型

放肆的年华 提交于 2020-03-27 12:12:33
3 月,跳不动了?>>> 作者:编程迷思 链接: https://www.cnblogs.com/kismetv/p/8654978.html 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有很大帮助,例如: 1、估算Redis内存使用量。目前为止,内存的使用成本仍然相对较高,使用内存不能无所顾忌;根据需求合理的评估Redis的内存使用量,选择合适的机器配置,可以在满足需求的情况下节约成本。 2、优化内存占用。了解Redis内存模型可以选择更合适的数据类型和编码,更好的利用Redis内存。 3、分析解决问题。当Redis出现阻塞、内存占用等问题时,尽快发现导致问题的原因,便于分析解决问题。 这篇文章主要介绍Redis的内存模型(以3.0为例),包括Redis占用内存的情况及如何查询、不同的对象类型在内存中的编码方式、内存分配器(jemalloc)、简单动态字符串(SDS)、RedisObject等