Redis-第九章节-动态字符串
目录
- 概述
- 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-第九章节-动态字符串的更多相关文章
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- 深入理解Redis之简单动态字符串
目录 SDS SDS与C字符串的区别 SDS获取字符串长度复杂度为O(1),C字符串为O(N) SDS杜绝了缓存区溢出 减少修改字符串时带来的内存重分配次数 二进制安全 Redis没有直接使用C语言传 ...
- 深入理解Redis 数据结构—简单动态字符串sds
Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库.缓存和消息中间件.其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 st ...
- 【Redis】简单动态字符串SDS
C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"; // 也可以添加 ...
- redis之简单动态字符串(SDS)
O(N):时间复杂度 N的值越大 时间复杂度随N的平方增大 O(1):就是说N很大的时候,复杂度基本不增长了.基本就是常量了. 在Redis数据库里 包含字符串值的键值对 在底层都是由SDS实现的. ...
- SDS——动态字符串
Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并 ...
- 简单动态字符串-redis设计与实现
简单动态字符串 Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds. 本章将对 sds 的实现 ...
- Redis自定义动态字符串(sds)模块(一)
Redis开发者在开发过程中没有使用系统的原始字符串,而是使用了自定义的sds字符串,这个模块的编写是在文件:sds.h和sds.c文件中.Redis自定义的这个字符串好像也不是很复杂,远不像ngin ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
随机推荐
- NATAPP--实现SSH内网穿透
NATAPP--实现SSH内网穿透 1. 关于Natapp 2. 使用Natapp 3. Natapp安装和配置 4. XShell连接 相关参考博文原文地址: CSDN:KevenPotter:NA ...
- JavaWeb——JSP,JSP指令,注释
什么是JSP JSP原理 JSP页面中的java代码服务器是如何执行的 Web服务器在调用jsp时会给jsp提供一些什么java对象 JSP执行过程 JSP页面的元素包括 JSP模版元素 JSP脚本片 ...
- 基础知识——TCP协议
七层网络模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层. 五层网络模型: 1. 应用层:确定进程之间通信的性质以满足用户需求.(各种传输协议) 2. 运输层:负责主机间不同进程的通信 ...
- java 验证表单工具类,史上最全
package com.wiker.utils; import java.util.regex.*; /** * * @version 1.0 * @author wiker * @since JDK ...
- Java开发中POJO和JSON互转时如何忽略隐藏字段
1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Ja ...
- c++11新特性实战(二):智能指针
c++11添加了新的智能指针,unique_ptr.shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated). 但是在实际的使用过程中,很多人都会有这样的问题: ...
- 设计模式(十)——组合模式(HashMap源码解析)
1 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统方案解决学校院系展示 3 传统方案解决 ...
- 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态
题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...
- hdu1004 Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...