redis中的字符串类型,分为两种,一种是C语言本身的字符串,一种是自己构建的一个数据类型(simple dynamic string)SDS。C字符串主要用于字符串字面量用于一些无须对字符串修改的地方,比如redis中日志打印;在reids中可以被修改的字符串就用SDS来代替C字符串;redis中使字符串类型的键值对都是SDS作为底层数据实现的,当然键值在redis中都是字符串类型的哦,下面我们见识一下SDS的数据结构图解,水平有限,见谅!
用java代码表示的数据结构
/**
* Redis 中字符串结构
* @author zhenwei
* simple dynamic String
*/
public class SDS {
//当前字符串长度
int len;
//空闲长度
int free;
//字符串存储数组,长度 = len+free
char[] buffer;
}
这个数据结构是对于C字符串做了一些冗余设计,有点类似于空间换时间的概念,SDS的使用场景:所有的key键,以及字符串类型的值数据;
SDS相对C字符串不一样的地方
1.字符串长度,SDS直接获取len属性的复杂度为O(1),C字符串要遍历整个buffer,复杂度为O(n)
2.杜绝缓存区溢出
在C执行strcat(char *dest,const char *src) 方法时,会假设dest已经得到足够大的空间(由开发者分配),可以容下src字符串,一旦假设不成立就会出现缓存溢出的危险,
SDS则杜绝了此问题,在字符串拼接时,会根据free判断当前空间有多少剩余,是否能满足拼接的字符串,然后判断是否进行扩容(增大free空间),所以这部分工作由SDS完成,不需要开发者控制
3.减少字符串修改时内存重新分配的次数
刚才提到当C字符串拼接时,需要开发者提前分配空间来满足字符串的增长;
如果需要缩短字符串,需要释放一不需要的空间;
redis在使用过程中会出现频繁的数据变更,如果想C字符串一样频繁的进行内存分配,而内存分配在系统中是一个比较耗时的操作,应该尽量避免;
redis中的SDS已经提前做了空间的预分配,所有在字符串增长时会降低重新分配的次数,如果新增的字符串空间<free,则不需要做新的空间分配(起码不需要实时的做这个事情,会延迟一下下),否则就分配一部分空间来满足需要
4.惰性释放
上面将字符串拼接时的内存分配,在字符串缩减,比如被截取等情况下,需要进行相应的空间释放,但是SDS中,不清楚后续这个字符串会做什么的数据变更,就将多余的空间作为Free属性保留下来,做未来的扩展,如果真的free很大的时候,也可以调用redis 相应的api 进行手动释放
5.二进制数据安全
C字符串中的字符必须是满足某种编码的,并且除了末尾是一个空字符外,字符串中不能出现空字符串,否则最先被判断为空的就误认为是字符串结尾,所以C字符串只能保存文本,不能保存图片 视频等文件格式的二进制数据;
而redis中并不是以字符数组进行的保存,而是以字节数组的方式对字符串进行保存,,这样就可以兼容各个数据类型,不会出现奇奇怪怪的问题
6.兼容部分C字符串的功能
参考书籍:《Redis设计用于实现》黄健宏
- 大小: 10.9 KB
分享到:
相关推荐
在Redis中,一个`String`可以是任何数据类型,比如简单的字符串、数字甚至是序列化后的复杂数据结构。 #### Redis String的内部实现 Redis中的字符串数据类型主要由`redisObject`(简称为`robj`)结构体表示。`...
Redis是一款高性能的键值存储系统,它以其丰富的数据结构、高效的数据操作以及强大的持久化机制在现代互联网架构中扮演着重要角色。本篇文章主要探讨Redis的核心数据结构和核心原理,以及如何利用IO多路复用技术处理...
Go 语言与 Redis 数据结构的底层实现 Go 语言是现代化的静态类型语言,专门设计用于构建可靠、简单、快速和高效的软件系统。Go 语言的设计目标是提供一种灵活、简洁、可靠的语言,易于开发者使用和维护。 指针类型...
【小林的图解系列之一,图解Redis数据结构】 Redis是一种高性能的内存数据库,其速度之快得益于其数据结构的高效实现。Redis中的数据结构并非仅限于基础的String、List、Hash、Set和Zset等数据类型,而是指它们在...
Redis开发-redis数据结构基础知识及案列(每个数据结构一个案例) redis数据结构基础知识及案列(每个数据结构一个案列) 案例清单 String案例:使用String字符串保存用户对象 List 案例:使用list保存爬虫待爬取...
Redis 是一个高性能的键值存储系统,它的数据结构设计是其高效性和灵活性的关键。Redis 的底层网络模型采用单线程配合epoll事件模型,这使得所有命令的执行是串行的,避免了多线程的上下文切换开销,但同时也意味着...
Redis支持多种数据类型,本篇文章将对Redis的基础数据结构进行讲解,包括string(字符串)、list(列表)、set(集合)、hash(哈希)以及zset(有序集合)。掌握这些基础数据结构对使用Redis至关重要。 首先,字符...
在【大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全】中,你可以找到更多关于数据结构和算法的知识,这些是理解和使用Redis数据结构的基础。通过深入学习和实践,你不仅可以掌握Redis的使用,还能提升自己的...
以下是对Redis数据结构的详细介绍: 1. 字符串(String) 字符串是最基础的数据类型,可以存储任意二进制数据,最长可达1GB。你可以通过`SET`命令设置键值,`GET`命令获取键值。此外,Redis还提供了原子递增`INCR`、...
1. 字符串(String):这是最基础的数据类型,对应数据结构是简单的字符串。在Redis中,字符串可以用来存储各种类型的数据,例如数字、文本等。 2. 列表(List):列表可以存储一组数据,有两种实现方式:压缩列表...
Redis中5种数据结构之String类型:key-value的缓存,支持过期,value不超过512M。 Redis是单线程的,比如SetAll & AppendToValue & GetValues & GetAndSetValue & IncrementValue & IncrementValueBy等等,这些看...
其数据结构丰富,支持字符串、哈希、列表、集合和有序集合等多种类型,使得Redis在处理各种复杂数据操作时表现出色。 1. **Redis的启动过程** Redis的启动主要包括以下步骤: - 首先,检查配置文件(默认为`redis...
Redis 中有五种基本数据结构,分别是 String、List、Set、Hash 和 ZSet。每种数据结构都有其特定的操作指令,下面对 Redis 的五大数据结构操作指令进行详细说明。 String String 是 Redis 中最基本的数据结构,...
在探讨Redis中String数据结构的奥秘前,我们先回顾一下Redis之所以高效的原因。单线程机制避免了上下文切换,基于内存的操作大大提升了访问速度,而多路复用网络模型确保了即使在单线程环境下也能高效处理客户端请求...
在面试中,Redis的数据结构是考察候选人技术深度的重要部分。以下将详细介绍Redis中的主要数据结构及其应用。 1. 字符串(String) Redis中的字符串是最基本的数据类型,可以存储任何可打印的字符序列,包括整数和...
在本资料"05-Redis 核心数据结构 & Redis 6 新特性详解-郭嘉.zip"中,我们将深入探讨Redis的核心数据结构以及最新的Redis 6版本的新特性。 一、Redis核心数据结构 1. 字符串(String):Redis最基础的数据类型,可...
首先,要进行Redis数据的导入和导出,我们需要了解Redis的数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。这些数据类型在Java中都有对应的客户端库支持,如Jedis和...