redis字符串若干记录

1、字符串

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

  • SDS
Bash 复制代码
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_EMBSTR 或OBJ_ENCODING_RAW。
  4. 这三种编码为的是尽可能地节省内存
相关推荐
风翼靓崽15 分钟前
centos7以mysql为例自建yum源
数据库·mysql·adb
码农阿豪31 分钟前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
数据库·sql·mongodb
秋饼34 分钟前
Redis 全面解析:从数据结构到主从/哨兵/集群、分布式锁与面试高频考点,代码到原理一次讲透
数据库·redis·分布式·面试·后端开发
二月夜36 分钟前
Redis 高频面试题全解:缓存三大问题、大 key 治理与分布式锁之争(2026 招聘 JD 真题复盘)
redis·分布式·后端·缓存
X1A0RAN43 分钟前
Jenkins CI 流水线优化实践:基于提交指纹的任务缓存
缓存·ci/cd·jenkins
秋名RG1 小时前
一条 SQL 语句在 MySQL 中的执行过程详解
数据库·sql·mysql
Canmag 兴隆磁性1 小时前
钕铁硼磁片取向方向检测自动化方案:从人工目检到流水线在线分选的工程实践
运维·数据库·自动化·工业自动化·钕铁硼·自动化检测·磁材料
yangmu32031 小时前
安全审批与日志审计:从“谁批准”到“谁执行”的全链路闭环
数据库
樱花落木兰1 小时前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
R²AIN SUITE1 小时前
多云或私有云环境怎么选项目管理工具?RainSuite等5种产品的8项部署验证
服务器·网络·数据库