美文网首页缓存架构redis
redis对象之字符串对象

redis对象之字符串对象

作者: 0爱上1 | 来源:发表于2018-11-10 09:40 被阅读7次

承接上文redis对象

参考文献:黄健宏《Redis设计与实现》

前言

上文中描述了对象结构的几个属性,其中type表示redis五种对象类型,而encoding属性就是其对象类型的具体编码实现

字符串对象的编码实现可以是int,raw,embstr 三种,下面具体描述这三种编码实现的区别


编码实现方式

int

如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象就会将整数值保存在对象属性的ptr中,并经encoding属性设置为int

raw

如果一个字符串对象保存的是一个字符串值,并且该字符串的长度大于39字节,那么redis就会采用一个SDS来保存该字符串,并将encoding属性设置为raw

embstr

重点是embstr编码实现,如果一个字符串对象保存的是一个字符串值,并且该字符串值的长度小于等于39字节,那么redis会采用embstr编码的方式来保存这个字符串值

何为embstr?

embstr编码是一种专门用来保存短字符串的优化编码方式

至于为什么说是一种优化编码方式呢?因为和raw编码方式一样,embstr编码方式的实现也是使用redisObject对象接口以及sdshdr结构来表示字符串对象的,不同之处在于raw方式会调用两次内存分配来分别创建redisObject结构和sds结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的内存空间,这个连续的内存空间中一次包含这两个结构

采用一次内存分配的好处?
  • 创建embstr字符串对象,内存调用只需要一次,更快

  • 释放embstr字符串对象,只需要一次内存释放即可,更快

  • 由于是一块连续的内存空间,所以相比于raw方式的可以更好的利用缓存带来的优势。

既然embstr编码有这么多好处,那其缺点是什么呢?

缺点:
  • embstr编码的字符串是只读的,redis没有为其编写任何的修改程序

那么当我们对一个embstr编码的字符串进行修改时,redis是如何处理呢?


编码的转换

当我们对一个embstr编码的字符串对象进行修改时,redis会进行编码的转换

何为编码转换?

  • 当我们对于int编码的字符串对象修改,将其修改为一个不再是整数值,而是一个字符串值时,redis就会将该字符串对象的编码从int转为raw

  • 当我们对于embstr编码的字符串对象执行修改时,由于embstr编码字符串对象是只读的,redis也会将其转为raw编码的字符串对象后再执行修改命令


总结

  • redis对象系统中的字符串对象的编码实现方式有三种,分别是int,embstr,raw

  • 当redis字符串对象保存的值是整数值,且可以采用long类型表示时,redis会采用int编码方式来作为底层实现

  • 特殊的embstr编码的字符串对象是一次内存内存调用,速度更快,但是其是只读的

  • 当对只读的embstr字符串对象修改时,redis会进行编码转换,将embstr编码格式的转为raw格式的,再执行修改命令

相关文章

  • redis对象之列表对象

    承接上文redis对象之字符串对象 参考文献:黄健宏《Redis设计与实现》 前言 列表对象是redis对象系统中...

  • Redis' strings

    Redis字符串基本操作命令 底层实现 Redis中,字符串对象是一个基础对象,所有键值均是字符串对象。Redis...

  • Redis对象类型和底层数据结构

    Redis对象类型(类型常量:对象名称) REDIS_STRING: 字符串对象 REDIS_LIST: ...

  • redis中的对象

    redis的对象包含5种对象: 字符串对象 列表对象 哈希对象 集合对象 有序集合对象 redis对象的好处 针对...

  • redis

    类型常量 对象的名称REDIS_STRING 字符串对象REDIS_LIST 列表对象REDIS_H...

  • redis笔记:对象

    本人博客同步发表,排版更佳 对象的类型 redis中的对象包括: 字符串对象 REDIS_STRING 列表对象 ...

  • redis对象之字符串对象

    承接上文redis对象 参考文献:黄健宏《Redis设计与实现》 前言 上文中描述了对象结构的几个属性,其中typ...

  • Redis对象类型及应用

    Redis数据对象类型  Redis共有五种数据对象,包括:字符串、列表、hash表、集合、有序集合。每种对象都至...

  • Redis对象与数据结构

    Redis中,我们打交道最多的是对象类型,如字符串对象、列表对象等。 字符串对象使用方式比如set name "J...

  • 第 8 章(对象)

    Redis Object Redis 基于之前的那些数据结构创建了一个系统对象,这个系统包含字符串对象、列表对象、...

网友评论

    本文标题:redis对象之字符串对象

    本文链接:https://www.haomeiwen.com/subject/wotzxqtx.html