当前位置: 首页 > news >正文

redis字符串若干记录

1、字符串

redis字符串支持二进制安全、redis中的健都为字符串类型、redis中所有的健和值都为redisObject变量

  • SDS
len:已用字节长度
alloc:已申请字节长度
flag:低三位代表sdshdr类型
buf:字符串内容
- 根据len判断SDS的类型 (SDS_TYPE_5 || SDS_TYPE_8|| SDS_TYPE_16|| SDS_TYPE_32|| SDS_TYPE_64)- SDSHDR5存放字节长度小于32(2的5次方)- SDS可以在常数时间内获取字符串的长度,并使用预分配内存机制减少内存拷贝次数。
  • SDS扩容机制

    • 1、判断当前长度是否符合要求,由于sdshdr.len记录了字符长度,时间复杂度为O(1)

    • 2、预分配比参数要求多的空间,新的长度若小于SDS_MAX_PREALLOC(1024*1024),则新长度扩容2倍,否则+SDS_MAX_PREALLOC

    • 3、扩容后重新计算sdshdr类型

    • 4、如果还是同一类型,则使用s_realloc函数申请内存;否则由于sds类型已经变动,需要移动整个sds,直接分配新的内存。

    • 5、更新alloc属性

字符串编码

  1. OBJ_ENCODING_EMBSTR(长度大于或小于OBJ_ENCODING_EMBSTR_SIZE_LIMIT=44字节)
    1. redis针对短字符串的优化,内存申请和释放只需要一次内存操作
    2. redisObject、sdshdr结构保存在一块连续的内存中,减少内存碎片
  2. OBJ_ENCODING_RAW(大于OBJ_ENCODING_EMBSTR_SIZE_LIMIT=44字节)
    1. redisObject、sdshdr结构保存在不同的内存中
  3. OBJ_ENCODING_INT
    1. 将数值字符串转换为整型,降低占用的内存空间
      1. 如:“123456789012“占用了12字节,在redistribution中转换为long类型,只用8字节。
      2. 在redis保存字符串时,会尝试将字符串转换为OBJ_ENCODING_INT,不行则根据长度保存为OBJ_ENCODING_EMBSTROBJ_ENCODING_RAW
  4. 这三种编码为的是尽可能地节省内存

http://www.mrgr.cn/news/777.html

相关文章:

  • CPU缓存一致性机制详解
  • css如何使一个盒子水平垂直居中
  • 鸿蒙关于可以实现滚动效果的容器组件的相关知识
  • 《广东省消费品召回管理办法》所称的消费品缺陷,是指因设计、制造、警示等原因,致使同一批次、型号或者类别的消费品中___的危及人身、财产安全的不合理危险。()
  • 和等于 k 的最长子数组长度(LeetCode)
  • SpringMVC
  • 二、开发环境和第一个OpenTK程序
  • Mininet应用实践
  • RedisTempate序列化的json字符串,如何反序列化
  • 【SpringBoot】SpringBoot中的异常处理和异常跳转页面
  • 【Python爬虫】技术深度探索与实践
  • C#学习总结
  • SQL基础——MySQL的索引
  • 这是啥设计模式-组合模式
  • Mysql-约束
  • Unity的UI设计
  • 使用旧笔记本电脑搭建私人NAS
  • JVM -垃圾回收器
  • vue 后台管理 指定项目别名
  • [LitCTF 2024]浏览器也能套娃?