SDS

Redis开发与运维:SDS与44字节深入理解

女生的网名这么多〃 提交于 2020-08-04 23:39:46
对于上一篇文章,我又自己总结归纳并补充了一下,有了第二篇。 概览 <<左移 开始之前,我们先准备点东西:位运算 i<<n 总结为 i*2^n 所以 1<<5 = 2^5 1<<8 = 2^8 1<<16 = 2^16 1<<32 = 2^32 1<<64 = 2^64 SDS 5种数据类型 Redis 3.2 以后SDS数据类型有5个 #define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #define SDS_TYPE_16 2 #define SDS_TYPE_32 3 #define SDS_TYPE_64 4 结合上面的位运算,我们也能理解这5个数据类型的命名规则。 外部类型String 找 SDS结构 我们现在有定义了5种SDS数据类型,那么如何根据字符串长度找这些类型呢? 或者说输入的字符串长度和类型有什么关系?下面我们来看一看他们之间的关系。 再来看看源码: static inline char sdsReqType(size_t string_size) { if (string_size < 1<<5) return SDS_TYPE_5; if (string_size < 1<<8) return SDS_TYPE_8; if (string_size < 1<<16) return SDS_TYPE_16; #if (LONG

选择超融合一体机还是超融合纯软件?

久未见 提交于 2020-08-04 16:28:57
超融合这两年发展如火如荼,在软件定义存储SDS的推动下,超融合架构正在引领一场巨大的变革,成为软件定义数据中心SDDC的未来技术发展趋势。 超融合架构的优势和客户价值这个已经勿容置疑,市面上很多存储厂商都推出了超融合一体机,那企业在选择购买超融合产品时,是选择自建服务器购买超融合软件还是选择超融合一体机呢? 首页我们要了解什么是超融合,什么是超融合一体机。 超融合是指在同一套单元设备中不仅仅具备计算、网络、存储和服务器虚拟化等资源和技术,而且还包括备份软件、快照技术、重复数据删除、在线数据压缩等元素,而多套单元设备可以通过网络聚合起来,实现模块化的无缝横向扩展(scale-out),形成统一的资源池。 超融合更多强调是分布式存储软件和虚拟化软件的融合部署,并不是单纯的指软、硬件融合,,超融合是基于X86服务器等低单价企业服务器为基础,对服务器的内置硬盘资源进行虚拟化,提供raid后的存储空间供服务器使用,硬件基础就是X86服务器 而超融合一体机是一套基于融合架构的IT基础设施新平台,它将服务器虚拟化、分布式存储、软件定义的网络与安全等业界前沿技术融合到一台x86服务器中,并通过统一管理平台实现IT资源的可视化管理,帮助用户打造极简、稳定、高性能的IT基础新架构。超融合一体机内置软件平台,以一体化的方式交付开箱即用的超融合解决方案, 根据用户的需求搭配不同的软件平台和功能模块

人格障碍在线测试,人格障碍筛查和判断 PDQ-4+

早过忘川 提交于 2020-07-28 20:18:33
每个人都是独一无二的,每个人都存在人格上的偏差,日常生活中我们携带着自己的人格在忙碌,在不够成对学习、生活和工作的影响下,我们认为都是健康的人格,反之则属于人格障碍。 人格障碍给我们的日常生活带来极大的影响,比如,抑郁,焦虑,失眠,人际关系恶化等诸多困扰.... (免费)焦虑症测试(SAS) https://www.zxgj.cn/g/jiaolv (免费)抑郁症测试(SDS) https://www.zxgj.cn/g/yiyuzheng 人格障碍测试 https://www.zxgj.cn/g/pdq4 MMPI 明尼苏达多项人格测验 https://www.zxgj.cn/g/mmpi 人格障碍 指明显偏离正常且根深蒂固的行为方式,具有适应不良的性质,会让人遭受痛苦或使他人遭受痛苦,或给个人或社会造成严重影响。 人格障碍判断 1、对症状 百科有比较完整的说明,每种人格障碍的类型都有,可以进行简单粗暴的对比,好处是简单易行,不过没啥太多用处,绝大部分人都是对上了部分,还有某些没有对上,对过症状后,以前是怀疑自己,现在还是怀疑自己,没啥变化。 2、做测评 目前专业的测评量表,有PDQ-4+,叫人格障碍筛查量表,还有一个是MMPI 明尼苏达多项人格测验。比第一条更加科学和准确一点。 3、看医生 这条才是正确的路线,因为只有医生才有资格做诊断和确诊。但是对于自我怀疑的朋友

Redis-初体验/数据结构

孤街浪徒 提交于 2020-07-28 03:48:01
定义: Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。 特点: 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。单进程单线程,是线程安全的,采用 IO 多路复用机制。丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅 Redis内部内存对象管理 ! redis内存管理 Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value,结构如下 typedef struct redisObject{ //对象的数据类型(String/Hash/List/Set/Zset) unsigned type:4; //表示redisObject对象的底层编码实现,主要有简单动态字符串,链表,字典,跳跃表,整数集合以及压缩列表, unsigned encoding:4; //指向底层数据结构的指针 void *ptr; //引用计数器,初始值为1

Redis 字符串

拜拜、爱过 提交于 2020-07-27 22:59:59
众所周知,Redis有五种比较常见的数据类型,分别是 字符串 (String) , 列表(List),集合 (Set), 有序集合(Zset) 和 哈希(Hash)。我们今天来讲讲字符串类型。 1,简介 字符串是最基本的key => value 形式,每个 key 最大能存储 512M 的value。 2,应用场景 可以存储 字符串、数字、json后的数据,可使用在验证码,session,token,锁,热点数据等场景。 3,语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 例如 redis 127.0.0.1:6379> SET testkey redis OK redis 127.0.0.1:6379> GET testkey "redis" 4,常见命令 序号 命令及描述 1 SET key value [ex=None px=None nx=False xx=False] 设置指定 key 的值 ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果 xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值 2 GET key 获取指定 key 的值。 3 GETRANGE key start

Serverless 的初心、现状和未来

旧城冷巷雨未停 提交于 2020-07-27 15:10:30
作者 | 不瞋 阿里云高级技术专家 导读: Serverless 是如何产生的?当前有哪些落地场景?Serverless 的未来又将如何?本文分享了阿里云高级技术专家不瞋对于 Serverless 的看法,回顾其发展历程,并对 Serverless 的发展趋势做出预测。 源起 回望整个计算机技术发展史,我们会发现 “抽象、解耦、集成” 的主题贯穿其中。产业每一次的抽象、解耦、集成,都将创新推向新的高度,也催生出庞大的市场和新的商业模式。 大型机时代,硬件和软件都是定制化的,使用专有的硬件、操作系统和应用软件。 PC 时代,硬件被抽象解耦成 CPU、内存、硬盘、主板、USB 设备等标准化的部件,不同厂商生产的部件可以自由组合,组装成整机。软件被抽象解耦为操作系统、库等可复用组件。硬件和软件的抽象解耦,创造了新的商业模式,释放了生产力,造就了 PC 时代的繁荣。 云的时代,硬件软件化和软件服务化成为最显著的两个趋势。 硬件软件化的核心在于硬件功能中越来越多的部分由软件来呈现,从而在迭代效率、成本等方面获得显著优势。以软件定义存储(Software Defined Storage,SDS)为例,SDS 是位于物理存储和数据请求之间的一个软件层,允许用户操控数据的存储方式和存储位置。通过硬件与软件解耦,SDS 可运行于行业标准系统或者 X86 系统上

Redis为什么快?你只知道单线程和基于内存?

大城市里の小女人 提交于 2020-07-27 11:54:42
面试场景 面试官:Redis有哪些数据类型? 我:String,List,set,zset,hash 面试官:没了? 我:哦哦哦,还有HyperLogLog,bitMap,GeoHash,BloomFilter 面试官:就这?回家等通知吧。 前言 我敢肯定,第一个回答,100%的人都能说上来,但是第二个回答能回答上来的人可能就不多了,但是这也不是我今天探讨的话题。 我就从我自己的去面试的回答思路,以及作为一个面试官他想听到的标准答案来给大家出一期,Redis基础类型的文章(系列文章),写这个的时候我还是很有心得的,不知道大家有多少人跟我最开始一样,面试官问有哪些类型,就回答出那五种就结束了,如果你是这样的可以在评论区留言,让我看看有多少人是这样的。 但是,一场面试少说都是半小时起步上不封顶,你这样一句话就回答了这么重要的五个知识点,这个结果是你想要的么?是面试官想要的么? 我再问你一个问题,你可能就懵逼了:String在Redis底层是怎么存储的?这些数据类型在Redis中是怎么存放的?Redis快的原因就只有单线程和基于内存么? 宝贝,触及知识盲区没?不慌,我以前也是这样的,我以为我背出那五种就完事了,结果被面试官安排了一波,后面我苦心修炼,总算是好了一点,现在对缓存也是非常熟悉了,你不会没事,有我嘛,乖。 正文 Redis是C语言开发的,C语言自己就有字符类型

Redis 学习笔记(一) 字符串 SDS

允我心安 提交于 2020-07-27 06:27:40
SDS 简单动态字符串。 SDS的结构: struct sdshdr{ int len; // 记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free ; // 记录BUF数组中未使用字节的数量 char buf[]; // 字节数组,用于保存字符串 } 1、与c语言的字符串相比,SDS获取长度时,时间复杂度位O(1),c的复杂度位O(n)。 2、杜绝缓冲区溢出,c字符串若未重新分配内存,在进行字符串拼接时,会导致扩展字符串s1的数据溢出到s2所在的空间,导致s2所保存的内容被意外修改(缓冲区溢出)。 3、杜绝内存泄漏,若裁剪字符串,若未重新分配内存,则会造成内存泄露。 4、对于SDS来说,如果扩展,则SDS API 会检查空间是否足够,如果足够则直接使用未使用的空间,无需重新分配。惰性释放空间,SDS需要缩短时,程序不会立即重新分配内存,而是使用free记录这些多余的空间,等待将来使用。 5、SDS的API都是使用二进制安全的,所有的SDS API都会以处理二进制的方式处理SDS存放在buf数组中的数据,程序不会对其中的数据做任何限制、过滤、或者假设,所以Redis不是用数组保存字符串,而是用它来保存一系列的二进制数据。 来源: oschina 链接: https://my.oschina.net/u/4414278/blog/4274188

Redis的内存和实现机制

断了今生、忘了曾经 提交于 2020-07-24 04:31:32
1. Reids内存的划分 数据 内存统计在used_memory中 进程本身运行需要内存 Redis主进程本身运行需要的内存占用,代码、常量池等 缓冲内存,客户端缓冲区、复制积压缓冲区、AOF缓冲区。有jemalloc分配内存,会统计在used_memory中 内存碎片 Redis在分配、回收物理内存过程中产生的。内存碎片不会统计在used_memory中。如果Redis服务器中的内存碎片已经很大,可以通过安全重启的方式减小内存碎片:因为重启之后,Redis重新从备份文件中读取数据,在内存中进行重排,为每个数据重新选择合适的内存单元,减小内存碎片。 2. Redis的数据存储的细节 涉及到内存分配器jemalloc, 简单动态字符串(SDS),5种值类型对象的内部编码,redisObject, DictEntry: Redis 是key-value数据库,因此对每个键值对都会有一个dictEntry,里面存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关 Key: 并不是以字符串存储,而是存储在SDS结构中 RedisObject: 5种值对象不是直接以对应的类型存储的,而是被封装为redisObject来存储 jemalloc: 无论是DictEntry对象,还是redisObject, SDS对象,都需要内存分配器 2.1

[redis]SDS和链表

强颜欢笑 提交于 2020-05-01 14:31:30
一、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) <<