redis学习-sds数据类型

今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 《Redis 设计与实现(第一版)》

于是决定从这个开始入门。

1.数据类型定义

typedef char *sds;

struct sdshdr {

    // buf 已占用长度
    int len;

    // buf 剩余可用长度
    int free;

    // 实际保存字符串数据的地方
    char buf[];
};

2.重新计算新的长度
newlen = sdshdr.len + required_len
if newlen < SDS_MAX_PREALLOC:
        newlen *= 2
    else:
        newlen += SDS_MAX_PREALLOC

3. 关于这种分配策略会浪费内存吗?
执行 APPEND 命令的字符串键数量通常并不多, 占用内存的体积通常也不大, 所以这一般并不算什么问题如果执行 APPEND 操作的键很多, 而字符串的体积又很大的话, 那可能就需要修改 Redis 服务器, 让它定时释放一些字符串键的预分配空间, 从而更有效地使用内存。

小结

  • Redis 的字符串表示为 sds ,而不是 C 字符串(以 \0 结尾的 char*)。
  • 对比 C 字符串, sds 有以下特性:
    • 可以高效地执行长度计算(strlen);
    • 可以高效地执行追加操作(append);
    • 二进制安全;
  • sds 会为追加操作进行优化:加快追加操作的速度,并降低内存分配的次数,代价是多占用了一些内存,而且这些内存不会被主动释放。
				
时间: 2024-10-07 04:55:33

redis学习-sds数据类型的相关文章

Redis学习之数据类型List详解

本文和大家分享的主要是redis数据类型中的list相关内容,一起来看看吧,希望对大家学习redis有所帮助. list即链表,它是一个能维持数据先后顺序的列表,便于在表的两端追加和删除数据,中间位置的存取具有O(N)的时间复杂度,是一个双向链表. 一.内部原理 redis内部实现代码在quicklist.c(注释:A doubly linked list of ziplists)中,它确实是一个双向链表,并且是一个ziplist双向列表. ziplist是什么? 一个经过特殊编码的的双向链表,

redis学习笔记——数据类型

对象处理机制 Redis 构建了自己的类型系统,这个系统的主要功能包括:• redisObject 对象.• 基于redisObject 对象的类型检查.• 基于redisObject 对象的显式多态函数.• 对redisObject 进行分配.共享和销毁的机制. (redisObject 实际上是只是一个结构类型.) redisObject 的定义位于redis.h :/** Redis 对象*/typedef struct redisObject {// 类型unsigned type:4;

Redis 学习(二) —— 数据类型及操作

Redis支持string.list.set.zset.hash等数据类型,这一篇学习redis的数据类型.命令及某些使用场景. 一.String,字符串 字符串是 Redis 最基本的数据类型.一个字符串最大为 512M 字节.字符串数据类型适用于很多场景,例如,缓存 HTML 片段或者页面. Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串可以包含任意类型的数据,例如一张 JPEG 图像,或者一个序列化的对象. 我们可以把字符串当做位数组(位图)来处理,很容易统计一些基于

Redis学习——SDS字符串实现

0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及文件:sds.h/sds.c 1.  数据结构: 1 typedef char *sds; 2 3 struct sdshdr { 4 unsigned int len; //buf中已使用的字节数 5 unsigned int free; //buf中未使用的字节数 6 char buf[]; /

Redis学习(4)-数据类型set和zset

Set数据类型及操作 Set集合是通过hash table实现的,所以添加.删除和查找的复杂度都是O(1),hash table会随着添加或者删除自动的调整大小,需要注意的是 hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了,关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersetion),差集(difference),通过这些操作

Redis 学习子数据类型

该文使用centos6.5 64位 redis-3.2.8 [[email protected] bin]# netstat -tunpl |grep 6379  查看redis 是否启动成功 一.String类型 String是最简单的类型,一个key对应一个Value,string类型是二进制安全的.redis的string可以包含任何数据类型,比如jpg图片或者序列化的对象. 1.set方法:设置key对应的值为string类型的value,如果该key已经存在,则覆盖key对应的valu

Redis学习(2)-数据类型String和Hashes

Redis的数据类型 (1)Strings类型及操作String是最简单的类型,一个Key对应一个Value,string类型是二进制安全的,Redis的string可以包含任何数据,比如jpg图片或者序列化的对象 1.Set 设置key对应的值为string类型的value 例如:我们添加一个name=hello的键值对 命令:set name hello2.Get 获取key对应value的值 命令:get name3.Setnx 设置key对应的值为string类型的value,如果key

Redis学习(3)-数据类型List

list类型及操作List是一个链表结构,主要的功能是push.pop获取一个范围的所有值等等,操作中key理解为链表的名字,Redis的list类型其实就是一个每子元素都是string类型的双向链表,我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列 1.lpush 在key对应list的头部添加字符串元素 在此处我们先插入一个world,然后在world的头部插入一个hello,其中lrange是用于取mylist的内容. 命令: lp

Redis学习笔记——数据类型及操作

数据操作 redis是key-value的数据,所以每个数据都是一个键值对 键的类型是字符串 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset 数据操作的全部命令,可以查看http://redis.cn/commands.html 接下来逐个介绍操作各类型的命令 string string是redis最基本的类型 最大能存储512MB数据 string类型是二进制安全的,即可以为任何数据,比如数字.图片.序列化对象等 命令 设置 设置键值 set