首页 > 数据库 >Redis数据结构之动态字符串SDS

Redis数据结构之动态字符串SDS

时间:2023-11-14 23:33:33浏览次数:36  
标签:动态 SDS Redis C语言 字符串 数据结构 1M

动态字符串SDS

我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。

不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:

V获取字符串长度的需要通过运算

V非二进制安全

V不可修改

Redis数据结构之动态字符串SDS_Redis

Redis构建了一种新的字符串结构,称为简单动态字符串( Simple Dynamic String) ,简称SDS

例如,我们执行命令:

Redis数据结构之动态字符串SDS_Redis动态字符串_02

那么Redis将在底层创建两个SDS,其中一个是包含"name" 的SDS,另一个是包含“虎哥“的SDS。

Redis是C语言实现的,其中SDS是一个结构体(类似JAVA中的类),源码如下:

Redis数据结构之动态字符串SDS_字符串_03

例如,一个包含字符串"name" 的sds结构如下:

Redis数据结构之动态字符串SDS_Redis动态字符串_04

SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为"hi" 的SDS:

Redis数据结构之动态字符串SDS_字符串_05

假如我们要给SDS追加一段字符串",Amy",这里首先会申请新内存空间:

◆如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1;

◆如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1,称为内存预分配

Redis数据结构之动态字符串SDS_字符串_06

优点

①获取字符 串长度的时间复杂度为0(1)

②支持动态扩容

③减少内存分配次数

④二进制安全

标签:动态,SDS,Redis,C语言,字符串,数据结构,1M
From: https://blog.51cto.com/AmbitionGarden/8380114

相关文章

  • Redis
    Redis1、什么是Redis?Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:202⚫Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。⚫Redis不仅仅支持简单的......
  • 服务器docker中redis和mysql连不上解决方法
    问题描述mysql报错:ERROR2013(HY000):LostconnectiontoMySQLserverat'readinginitialcommunicationpacket',systemerror:0redis报错:(总之就是本地连不上docker中的redis)通过本地Windows下telnet连服务器端口,会直接跳到没有输入telnet的画面,本地Windows能够ssh到......
  • SpringBoot系列之集成Redission入门与实践教程
    Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用软件环境:JDK1.8SpringBoot2.2.1Maven3.2+Mysql8.0.26redisson-spring-boot-starter3.15.......
  • Cygwin工具制作Redis服务端Window版本
    文章目录前言一、cygwin是什么?二、cygwin安装Redis源码编译前言在学习到redis,经常需要用到一个redis服务端,如果有买服务器或者本机可以支持经常开虚拟机,也是可以的,如果不具备这些条件,还是本机window系统直接安装一个redis服务端方便。不过新的版本,在微软维护的redis版本库已经很......
  • Redis系列之常见数据类型应用场景
    文章目录String简单介绍常见命令应用场景Hash简单介绍常见命令应用场景List简单介绍常见命令应用场景Set简单介绍常见命令应用场景SortedSet(Zset)简单介绍常见命令应用场景Bitmap简单介绍常见命令应用场景附录Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、S......
  • Redis系列之实现分布式自增主键
    软件环境JDK1.8SpringBoot2.2.1Maven3.2+Mysql8.0.26redis6.2.14MybatisPlus3.4.3.4开发工具IntelliJIDEAsmartGit一、实现原理使用Redis来实现分布式的主键自增主要是依赖于Redis的INCR命令,调用INCR命令的对应key,其数值是实现递增加一,所以利用这个性质,将redis独立部署起来......
  • Redission获取Redis时间
    RScriptscript=redissonClient.getScript(StringCodec.INSTANCE);longcurrentTime=script.eval(RScript.Mode.READ_WRITE,"localtime=redis.call('TIME')"+"localmilliseconds=tim......
  • 数据结构图的基本知识题
    判断题1.在n个结点的无向图中,若边数大于n-1,则该图必是连通图。​ TF解释:以下两种说法是对的:在n个结点的无向图中,若该图是连通图,则其边数大于等于n-1,在n个结点的无向图中,若边数大于(n-2)(n-1)/2,则该图必是连通图就是说连通是比较强的条件......
  • redis 类型List增删查改效率
    Redis的List数据类型是一个双向链表,支持在列表的两端进行高效的插入和删除操作。下面是关于RedisList类型的增删查改操作的效率说明:1.增加元素(左侧和右侧添加):左侧添加(LPUSH)和右侧添加(RPUSH)都是O(1)时间复杂度的操作,它们可以在常数时间内完成,不受列表长度的影响。批量添加元素(例......
  • SpringBoot定义拦截器+自定义注解+Redis实现接口防刷(限流)
    实现思路在拦截器Interceptor中拦截请求通过地址+请求uri作为调用者访问接口的区分在Redis中进行计数达到限流目的简单实现定义参数访问周期最大访问次数禁用时长#接口防刷配置,时间单位都是秒.如果second秒内访问次数达到times,就禁用lockTime秒access:lim......