文档章节

Redis知识总结--string的内部实现

looqy
 looqy
发布于 10/19 16:46
字数 677
阅读 14
收藏 1

SDS(Simple Dynamic String)

String的数据结构是一个字节数组,但简单的获取数组长度的时间复杂度就是O(n),这对于单线程的redis来讲是不能接受的,因此string在redis中的实现是SDS类,SDS类的结构总体如下(C已忘,只能用java大致表达下):

public class SDS {
  // string内容的真实长度,为了节约内存,这里是个泛型
  // 当内容较少时,使用byte或short
  private T length;
  // 为string分配的内存空间大小,同样为了节约内存,用了泛型
  private T capacity;
  // string的真实内容,使用字节数组存储
  private byte[] content;
  // 特殊标记,不知道干嘛的
  private byte flags;
}

如上,长度直接保存下来了--虽然两者没什么关联,但我想到了mysql的Myisam引擎,也是直接将表的数据条数直接保存下来--这样要获取长度直接取值即可;

embded 和 RAW

使用debug object命令会发现,不同长度的string的encoding有embed和raw两种类型,也是为了节省空间,64字节及以下的string会使用embed存储,以上使用RAW存储(不同redis版本下可能会有不同的界限),之所以使用64为界是因为内存分配函数malloc等都是一次分配2的若干次幂大小的内存,另外即使分配64字节给string使用,content也只有44字节的内存可以存储,原因正是因为下面的redis头对象也占了坑

RedisObject

public class RedisObject {
  // 数据类型,只使用4bit
  private int4 type;
  // 数据的encoding类型,只使用4bit
  private int4 encoding;
  // 数据的lru信息,只使用24bit
  private int24 lru;
  // 该数据的引用计数,使用32bit
  private int32 refcount;
  // 这是个指针,指向数据对象,在64位操作系统下,使用8个字节
  private Poniter *p;
}

可以发现,对象头至少使用16个字节,而假使SDS的三个辅助属性都只使用1字节的话,content也就只剩下64-19=45字节的空间可以使用了,还有一个字节用来保存字符串的结尾字符,这个字符通常使用的是null,而在redis中使用的是\0,\0使用了1个字节,content的可用有效字符就仅剩44字节了

© 著作权归作者所有

共有 人打赏支持
looqy
粉丝 2
博文 29
码字总数 8755
作品 0
朝阳
程序员
私信 提问
使用Redis单实例实现分布式锁

一、前言 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就...

阿里加多
06/10
0
0
Redis 深度历险:核心原理与应用实践

内容介绍 Redis 是互联网技术架构在存储系统中使用最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的、竞争激烈的大型互联网公司(比如 ...

技术小能手
08/01
0
0
redis使用总结-redis命令使用

redis五种数据类型的使用 1、String 常用命令: set,get,decr,incr,mget 等。 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。 实现方式...

飓风2000
2014/04/06
0
0
Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

转自: http://www.cnblogs.com/edwinchen/p/3816938.html redis源码 https://github.com/antirez/redis redis中文注释版本源码 https://github.com/huangz1990/annotatedredis_source 一、概......

fz00x0zf
2016/11/26
58
0
一个今日头条的面试题——LRU原理和Redis实现

很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU。 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略。LRU ... Least Recent Us...

Java架构
08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
0
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
2
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
0
0
Python的安装及文件类型、变量

一、为什么学习python 服务于大数据、人工智能、自动化运维。 简单易学 代码简洁 薪资高 近几年越来越火 二、Python的安装 linux 系统默认安装, CentOS7 默认安装了python2.7 安装ipython y...

枫叶云
昨天
1
0
JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
昨天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部