Redis 专题一: 数据结构

简单的动态字符串

  • redis没有直接使用C语言传统的字符串表示,而自己构建了一个动态字符串SDS,当redis需要的不仅仅是一个字符串字面量,而是一个可以被秀噶ide字符串值时,redis就会使用sds来表示字符串值,比如在redis的数据库里,包含字符串值的键值对在底层都是由SDS实现的。
redis  > set name "bugall"
ok
1.键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串"name"的SDS
2.键值对的值也是一个字符串对象,对象的底层实现是一个保存这字符串"bugall"的SDS
  • 除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区,AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区。

struct sdshdr{
    //记录buf数组中已使用字节的数量
    //等于SDS所保存字符串的长度
    int len;
    //记录buf数组中未使用字节的数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
}
1. free属性的值为0,表示这个SDS没有分配任何未使用空间。
2. len属性的值为5,表示这个SDS保存了一个五字节长的字符串
3. buf属性是一个char类型数组,数组的前5个字节分别保存了‘r‘,‘e‘,‘d‘,‘i‘,‘s‘五个字符,而最后一个字节则保存了空字符‘\0‘

注意:保存孔子福的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的一字节空间。
  • 与c字符串不同,SDS的空间分配策略完全杜绝了发生缓冲区溢出的可能性,当SDS api 需要对SDS进行修改时,API 会先检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展至执行修改所需要的大小,然后才执行实际的修改操作,所以使用SDS即不需要手动修改SDS的空间大小,也不会出现的缓冲区溢出的情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 03:21:02

Redis 专题一: 数据结构的相关文章

Redis专题(3):锁的基本概念到Redis分布式锁实现

拓展阅读:Redis闲谈(1):构建知识图谱 Redis专题(2):Redis数据结构底层探秘 近来,分布式的问题被广泛提及,比如分布式事务.分布式框架.ZooKeeper.SpringCloud等等.本文先回顾锁的概念,再介绍分布式锁,以及如何用Redis来实现分布式锁. 一.锁的基本了解 首先,回顾一下我们工作学习中的锁的概念. 为什么要先讲锁再讲分布式锁呢? 我们都清楚,锁的作用是要解决多线程对共享资源的访问而产生的线程安全问题,而在平时生活中用到锁的情况其实并不多,可能有些朋友对锁的概念

(2)redis的基本数据结构是动态数组

redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移   2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间.  这个数组不占用任何内存,意味着这样的结构节省空间: 该数组的内存地址就和他后面的元素的地址相同,意味着无需初始化,数组名就是后面元素的地

[Redis专题]Memcache和Redis对比

1. Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等.2. 数据类型--Memcache在添加数据时就要指定数据的字节长度,例如:  set key3 0 0 8  lxsymcto  STORED而redis不需要,如:redis 127.0.0.1:6379>set key2 "lxsymblog"  OK  redis 127.0.0.1:6379>get key2  "lxs

Redis 5种数据结构使用及注意事项

1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同一条记录如Counter时慢下去的毛病. 丰富的数据结构,超越了一般的Key-Value数据库而被认为是一个数据结构服务器.组合各种结构,限制Redis用途的是你自己的想象力,作者自己捉刀写的用途入门. 因为是个人作品,Redis目前只有2.3万行代码,Keep it simple的死硬做法,使得普

Redis 之(二) Redis的基本数据结构以及一些常用的操作

本篇内容是Redis最简单最容易掌握的知识,如果你已经熟知了,就可以选择跳过啦! 要体验Redis,那么首先你得安装Redis,这边的话我就只讲一下Windows环境下的安装与操作: Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis. 打开一

Redis五种数据结构详解

总结了下Redis五种数据结构的特定,本文主要参考 <redis in action>. 字符串 首先,字符串类型是最基础的类型,在redis里面字符串可以存储3中类型的值,字节串.整数.浮点数.这里整数或者浮点数是可以执行自增或自减的. 字符串常用命令 列表 列表类似于数据结构的链表,可以给定int范围去显示这个列表中的数据.列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作. 列表经常用来存储任务信息.最近浏览过的文章或者联系人信息等. 列表的一个主要优点在

Redis(一)、Redis五种数据结构

Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据.如数字,字符串,jpg图片或者序列化的对象. 使用:get . set . del . incr. decr 等 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello

Redis数据库各种数据结构的内部实现。

Redis数据库是一种非关系型数据库,基于key/value对,运行时加载到内存,对value支持虚拟内存, 支持多种数据结构,支持持久化,以性能著称,可用于存储,缓存,消息队列等场景.主要介绍下Redis运行时维护的数据结构,以展示其工作方式. 1.总体设计. 首先,Redis没有MySQL那样的索引机制,因为其内建一个基于hash的字典,如下图: Redis 计算哈希值和索引值的方法如下: # 使用字典设置的哈希函数,计算键 key 的哈希值 hash = dict->type->hash

用python实现一个redis的zset数据结构

用了redis也有2年多了,常常感叹于redis的优美和精悍,麻雀虽小五脏俱全. 最近手痒冒出用python在内存中实现一个zset数据结构的想法. 思路是这样的: hash + sortedlist 其中hash用于使获取键值的复杂度变成O(1) 而用bisect模块二分法作用于sortedlist实现其它操作O(logN) 下面上代码. #coding=utf-8 from bisect import bisect_left,bisect_right,insort #定义节点 class S