SDS模块】的更多相关文章

sds模块的具体实现: 1.sdsnewlen 根据参数生成一个sds字符串 sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; //如果初始化的内容为NULL,则生成一个内容只有一个\0的串,但是长度不会变,还是传入的长度.zmalloc和zcalloc的功能一样,这个地方为啥还要调用不同的呢. if (init) { sh = zmalloc(); } else { sh = zcalloc(); } if…
早上花了一点时间读了下sds的相关源码,其实sds就是构造了两个字段用来记录len和free的状态,然后还有一个char[]用来记录字符串的值. 然后sds模块的函数都是在模拟str的操作. 比较,追加,新建,删除,分割字符串等等 今天看完了源代码sds.h, sds.c 到 sdssplitlen函数 明天有空接着读. sds里面用到的va_list, memmove等函数也帮我复习了.…
Redis开发者在开发过程中没有使用系统的原始字符串,而是使用了自定义的sds字符串,这个模块的编写是在文件:sds.h和sds.c文件中.Redis自定义的这个字符串好像也不是很复杂,远不像nginx自定义的一样复杂,但也存在一些问题. 在.h文件中定义了一个新的类型和一个结构体分别是: typedef char *sds;//定义了sds的字符串类型,使用的仍是字符串指针,只是多了个头部,具体定义见sdshdr. //动态字符串,数组的长度是可变的. struct sdshdr { unsi…
redis 在底层中会把long long转成string 再做存储. 主个功能是在sds模块里. 下面两函数是把long long 转成 char  和   unsiged long long 转成 char. 大致的思路是: 1 把数值从尾到头一个一个转成字符, 2 算出长度,加上结束符. 3 把字符串反转一下. 4 如果是 long long 型 要考虑有负数的情况.   int sdsll2str(char *s, long long value) { char *p, aux; uns…
前言 项目里用到了redis数据结构,不想只是简单的调用api,这里对我的读书笔记做一下记录.原文地址: http://www.redisbook.com/en/latest/internal-datastruct/sds.html 数据类型定义 与sds实现有关的数据类型有两个,一个是 sds: // 字符串类型的别名 typedef char *sds; 另一个是 sdshdr: // 持有sds的结构 struct sdshdr { // buf中已经被使用的字符串空间数量 int len…
与其他key-value数据库不同之处 不仅支持字符串值,还支持 字符串 set,get 列表 lpush,rpush,lrange 哈希 hset,hget,hgetall hmset,hmget 集合 sadd smembers 有序集 zset   数据库的键则总是字符串对象   简单动态字符串   sds(simple dynamic string)   用途: 实现字符串对象(StingObject) 在Redis程序内部用作char* 类型的替代品 127.0.0.1:6379> h…
        note:写这个或许算是翻译,又或算是对这个论文[1]的理解,又或者仅仅是我的看法.         这篇论文和IOFlow相比較,更加注重软件定义存储的框架(利用已有的框架来创建新的框架,然后使用已有的协议),而不是像IOFlow那样注重通信的协议.而且,这个框架还是软件定义环境的框架,而不不过存储的框架,不过全文注重说了存储(更有挑战性).特别地.关于可软件定义的存储逻辑.从这里能够管中窥豹. SDE软件定义环境 数据中心的环境包含Compute.Network和Storag…
简单动态字符串 Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds. 本章将对 sds 的实现.性能和功能等方面进行介绍, 并说明 Redis 使用 sds 而不是传统 C 字符串的原因. sds 的用途 Sds 在 Redis 中的主要作用有以下两个: 实现字符串对象(StringObject): 在 Redis 程序内部用作 char* 类型的替代品: 以下两个小节分别对这两种用途进行介…
起因:看各位大佬们写的shellcode厉害的一匹,可惜自己没学C和汇编 也看不懂shellcode,只能写一个调用metasploit里的模块进行攻击了. 0x01 攻击机:192.168.223.141 kali Linux 目标:192.168.3.5 windows 需要用到的模块(这里我们写两个脚本,一个用于扫描IP段,看看那个IP开了445) nmap模块 os模块 sys模块 nmap模块kail自带坑的要死,完全没有相关的函数. 手动卸载:pip uninstall nmap 安…
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话,是远远不足以应对面试提问的.本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串(SDS) Redis使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS…
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库 各种请求方式: #!/urs/bin/evn python # -*- coding:utf-8 -*- import requests url = "http://www.baidu.com" print(requests.get(url)) print(requests.post(url)) print(requests.put(url)) print(requ…
一.  SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示.Redis只会使用C字符串作为字面量.在Redis里,使用SDS来表示字符串值,是一个可以被修改的字符串,字符串“键值对”底层都是由SDS实现的. -- 例1:客户端执行如下命令: > set msg "hello world" OK > get msg &quo…
一.SDS的简单介绍 SDS:简单动态字符串(simple dynamic string) 1)SDS是Redis默认的字符表示,比如包含字符串值的键值对都是在底层由SDS实现的 2)SDS用来保存数据库中的字符串值 3)SDS被用作缓冲区:比如AOF模块的AOF缓冲区,以及客户端状态中的输入缓冲区 二.SDS的结构 struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 字节数组 char buf[];…
一.模块加载方法 1.在配置文件或者启动参数里面通过<loadmodule /path/to/mymodule.so args>指令加载 2.Redis启动后,通过<module load /path/to/mymodule.so args>指令加载,另外<module list>可以查询当前所有已加载模块.<module unload name>可以卸载已经加载的模块,注意name为模块的注册名字,不一定和模块文件名相同. 二.介绍 Redis模块是一种动…
redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redis的底层数据结构有以下7种,包括简单动态字符串(SDS),链表.字典.跳跃表.整数集合.压缩列表.对象.今天我们一起看下简单动态字符串(simple dynamic string),后面的文章以SDS简称. SDS简介 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称…
SDS 前提:在redis中,C字符串只会作为字符串字面量用在一些无须对字符串进行修改的地方,比如打印日志: redisLog(REDIS_WARNING, “Redis is ready to exit”) 因此,redis构建了一种简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作redis的默认字符串表示. 比如: redis> SET msg “Hello World” OK 其中键值对的键是一个字符串对象,对象底层是一个保存着字符串 ”ms…
模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他在内存中开辟了以模块名命名的内存空间 2.你模块文件的所有内容都加载到了内存. 3.通过模块名.的方式去引用模块中的对象 为模块起别名: 1,将模块名较长的改为较短的,便于操作 import time as tm tm.time() 2.拓展代码 from .... import ....   方式…
logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warning.error.critical #2.级别本身没有代表信息重要性的区别,只是包含级别信息,可以约定日志的重要性 标准的三流 import sys # 标准的三流 stdout | stdin | stderr # stdout和stderr两个是抢cpu工作,没有规定的前后 sys.stdout.w…
1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个例子: SET msg "Hello World" 在这个语句中,Redis 会新建一个键值对,其中 key 为一个 字符串,对象的底层实现是一个保存着字符串 “msg” 的 SDS 对象. value 为一个字符串,对象的底层实现是一个保存着字符串 “Hello World” 的 SDS…
Redis没有直接使用C字符串(以'\0'结尾的字符数组),而是构建了一种名为简单动态字符串( simple  dynamic  string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示.在Redis里面,C字符串只会作常量值,比如打印日志: redisLog(REDIS_WARNING,"Fatal: Can't initialize Background Jobs."); 当Redis需要一个可被修改的字符串时,就会使用SDS来表示字符串值,在Redis中,包含…
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 npm 仓库的账号. npm install -g npm npm login 软件包设置 所有的私有模块都是 scoped package 的. scope 是 npm 的新特性.如果一个模块的名字以 "@" 开始,那么他就是一个scoped package.scope 就是"@&…
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该文件,会报错 4.运行test2.js 二.模块简单使用 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Node环境中,一个.js文件就称之为一个模块(module). 模块化的开发的好处:提高代码的可维护性,避免修…
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, year} from './profile'; 2.导入外部的模块,并立即执行 import './test' //执行test.js,但不导入任何变量 第2种情况就不用讲了,就是执行从头到尾执行引入的js文件,当然,会忽略js文件里export. 下面详细讲第1种情况. 两个js文件,count…
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情.例如,你可能想要打开一个文件,然后写入一些内容,最后再关闭文件.这或许就是上下文管理器中一个最经典的示例.事实上,当你利用with语句打开一个文件时,Python替你自动创建了一个上下文管理器. with open("test/test.txt","w") as f_o…
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >&g…
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然,我们也会了解如何创建它们,在我们需要的时候,就可以创建属于我们自己的迭代器和生成器. 2 模块使用 2.1 迭代器 迭代器是一个允许你在一个容器上进行迭代的对象.Python的迭代器主要通过两个方法实现:__iter__和__next__.__iter__要求你的容器支持迭代.它会返回迭代器对象本…
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向时间模块的一个对象,做一个函数继承,让宿主函数也拥有处理事件的能力 使用nodejs事件模块的demo如下: var EventEmitter = require('events'); var util = require('util'); function MyEmitter() { EventE…
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有url非法字符或者下划线点符号开头.scope在模块name中使用时,以@开头,后边跟一个/ .package.json中,name的写法如下: @somescope/somepackagename scope是一种把相关的模块组织到一起的一种方式,也会在某些地方影响npm对模块的处理. npm公共仓库…
前置技能 npm工具为nodejs提供了一个模块和管理程序模块依赖的机制,当我们希望把模块贡献出去给他人使用时,可以把我们的程序发布到npm提供的公共仓库中,为了方便模块的管理,npm规定要使用一个叫package.json的文件来描述我们模块的名称.版本等信息. 我们贡献出去的程序模块,可能也依赖了别人所编写的模块,所以需要在package.json中写明我们依赖了哪些模块,便于别人安装. 简单的nodejs程序可以通过 node xxx.js 来运行,当我们希望直接在控制台中使用xxx命令运…
net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket类 事件 方法 属性 工厂方法 练习代码 netServer var net=require("net"); /** * 创建server */ function t1(){ var server=net.createServer(function(socket){ //socket.en…