文档章节

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

looqy
 looqy
发布于 2018/10/19 16:46
字数 677
阅读 18
收藏 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
粉丝 9
博文 32
码字总数 12019
作品 0
朝阳
程序员
私信 提问
Redis 深度历险:核心原理与应用实践

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

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

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

飓风2000
2014/04/06
0
0
使用Redis单实例实现分布式锁

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

阿里加多
2018/06/10
0
0
45节课从零到一掌握 Redis 核心原理与应用实践

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

江江也叫Glowin
2018/12/09
0
0
Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011734144/article/details/86086749 首先这里是原文: https://mp.weixin.qq.com/s?biz=MzA4NTg1MjM0Mg==&...

田野上的希望
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

漏洞防御与修复工作

漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术和管理...

linuxprobe16
58分钟前
1
0
MicroPython技术及应用前景

1 Micropython技术是什么? MicroPython极精简高效的实现了Python3语言。它包含Python标准库的一小部分,能在单片机和受限环境中运行。 1.1 MicroPython发展 由剑桥大学的理论物理学家乔治....

bodasisiter
今天
4
0
跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

本节详细讲解使用Hystrix的通用方式。 简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要...

周立_ITMuch
今天
2
0
🛠️Hanjst/汉吉斯特更新加JavaScript运行时优化等

这是 Hanjst/汉吉斯特 发布以来的首个主要升级更新版本。这次的主要升级更新的内容包括移除HTML Comments注释行, 优化在 Hanjst include模板文件时的JavaScript运行时环境。 Hanjst 在设计和...

wadelau
今天
3
0
OSChina 周六乱弹 —— 舔狗是没有好下场的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听什么# #今天听这个# 分享 Nirvana 的歌曲《Smells Like Teen Spi...》 《Smells Like Teen Spi...》- Nirvana 手机党少...

小小编辑
今天
616
14

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部