目录

  • 概述
  • SDS(动态字符串)
  • SDS(动态字符串)与c语言字符串的区别

1、概述

String类型底层实现的简单动态字符串sds,是可以修改的字符串。它采用预分配冗余空间的方式来减少内存的频繁分配。

2、SDS动态字符串

动态字符串是以 \0 为分隔符。最大容量是redis主动分配的一块内存空间,实际存储内容是具体的存的数据。

3、SDS(动态字符串)与c语言字符串的区别

1、获取存储长度不同

c语言:c语言不记录长度信息,如果要获取字符串的长度,需要遍历所有的字符串,才能获取字符串的长度。获取长度的复杂度为 O(n)

sds(动态字符串):sds存储了字符串的长度,获取长度的复杂度为 O(1)

2、缓存溢出

c语言:c语言不记录长度,在执行strcat函数时,假设分配了内存,存储的内容比已经分配的内存多时,这个时候就会出现缓冲区溢出现象。

sds(动态字符串):sds存储内容时,先检查内容的存储是否能够存储下实际的值,如果不能存储实际的值,就先扩展缓存区域,再将值存储到缓冲区域中。

3、内存的开辟和释放

c语言:需要自己主动释放或者扩展内存,如果不能够主动释放或者扩展内存,就会出现缓冲溢出或者泄露。

sds(动态字符串):sds采取下面的方式

1、空间预分配

  // 先进行内存区域进行扩展,然后在执行下面的代码
public void test(){
if(len < 1M){
//程序分配和len属性一样的大小未使用的空间。
}else if(len > 1M){
//程序分配1M 未使用的空间。
}
}

2、惰性空间释放

在修改字符串时,如果实际的内容要比老的数据小,先不将缓冲区的空闲内存释放掉,等下次存储内容时再进行空间的释放或者扩展。

4、二进制安全

c语言:C语言必须存储指定的格式数据。

sds(动态字符串):SDS不会对数据限制。

-END-



您好,我是一个Java小白,希望和大家一起在技术的道路上一快快乐的学习。希望与您在网络的世界上会面。

Redis-第九章节-动态字符串的更多相关文章

  1. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  2. 深入理解Redis之简单动态字符串

    目录 SDS SDS与C字符串的区别 SDS获取字符串长度复杂度为O(1),C字符串为O(N) SDS杜绝了缓存区溢出 减少修改字符串时带来的内存重分配次数 二进制安全 Redis没有直接使用C语言传 ...

  3. 深入理解Redis 数据结构—简单动态字符串sds

    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库.缓存和消息中间件.其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 st ...

  4. 【Redis】简单动态字符串SDS

    C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"; // 也可以添加 ...

  5. redis之简单动态字符串(SDS)

    O(N):时间复杂度 N的值越大 时间复杂度随N的平方增大 O(1):就是说N很大的时候,复杂度基本不增长了.基本就是常量了. 在Redis数据库里 包含字符串值的键值对 在底层都是由SDS实现的. ...

  6. SDS——动态字符串

    Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并 ...

  7. 简单动态字符串-redis设计与实现

    简单动态字符串 Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds. 本章将对 sds 的实现 ...

  8. Redis自定义动态字符串(sds)模块(一)

    Redis开发者在开发过程中没有使用系统的原始字符串,而是使用了自定义的sds字符串,这个模块的编写是在文件:sds.h和sds.c文件中.Redis自定义的这个字符串好像也不是很复杂,远不像ngin ...

  9. Redis数据结构之简单动态字符串SDS

    Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...

随机推荐

  1. NATAPP--实现SSH内网穿透

    NATAPP--实现SSH内网穿透 1. 关于Natapp 2. 使用Natapp 3. Natapp安装和配置 4. XShell连接 相关参考博文原文地址: CSDN:KevenPotter:NA ...

  2. JavaWeb——JSP,JSP指令,注释

    什么是JSP JSP原理 JSP页面中的java代码服务器是如何执行的 Web服务器在调用jsp时会给jsp提供一些什么java对象 JSP执行过程 JSP页面的元素包括 JSP模版元素 JSP脚本片 ...

  3. 基础知识——TCP协议

    七层网络模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层. 五层网络模型: 1. 应用层:确定进程之间通信的性质以满足用户需求.(各种传输协议) 2. 运输层:负责主机间不同进程的通信 ...

  4. java 验证表单工具类,史上最全

    package com.wiker.utils; import java.util.regex.*; /** * * @version 1.0 * @author wiker * @since JDK ...

  5. Java开发中POJO和JSON互转时如何忽略隐藏字段

    1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Ja ...

  6. c++11新特性实战(二):智能指针

    c++11添加了新的智能指针,unique_ptr.shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated). 但是在实际的使用过程中,很多人都会有这样的问题: ...

  7. 设计模式(十)——组合模式(HashMap源码解析)

    1 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统方案解决学校院系展示 3 传统方案解决 ...

  8. 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态

    题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...

  9. hdu1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  10. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...