美文网首页
Redis 字符串对象

Redis 字符串对象

作者: wayyyy | 来源:发表于2022-09-28 00:07 被阅读0次

字符串对象

字符串对象的编码可以是:intrawembstr

#define REDIS_STRING 0

#define REDIS_ENCODING_INT 1
#define REDIS_ENCODING_RAW 0
#define REDIS_ENCODING_EMBSTR 8
int

如果以字符串对象保存的是一个整数值,且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在ptr属性里面(void* 转为long*),并将字符串对象的编码设置为REDIS_ENCODING_INT

`int.png
// 只对长度小于或等于 21 字节,并且可以被解释为整数的字符串进行编码
if (len <= 21 && string2l(s,len,&value)) {
    if (server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS) {
        decrRefCount(o);
        incrRefCount(shared.integers[value]);
        return shared.integers[value];  // 这里value < REDIS_SHARED_INTEGERS,直接使用共享的字符串对象。
    } else {  
        if (o->encoding == REDIS_ENCODING_RAW) 
            sdsfree(o->ptr);
        o->encoding = REDIS_ENCODING_INT;
        o->ptr = (void*)value;
        return o;
    }
} 
embstr

如果字符串对象保存的是一个字符串值,并且这个字符串值长度小于等于39字节。

embstr.png
  • 减少内存分配次数
  • 减少内存释放次数
  • 缓存友好
// 尝试将 RAW 编码的字符串编码为 EMBSTR 编码
if (len <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT) {
    robj *emb;

    if (o->encoding == REDIS_ENCODING_EMBSTR) 
        return o;
    emb = createEmbeddedStringObject(s,sdslen(s));
    decrRefCount(o);
    return emb;
}
raw

如果字符串对象保存的是一个字符串值,并且这个字符串值长度大于39字节。


embstr.png

总结起来,就是:

image.png
#0  tryObjectEncoding (o=0x5555556eb058) at object.c:554
#1  0x0000555555595f3b in setCommand (c=0x5555556ebe68) at t_string.c:178
#2  0x0000555555577911 in call (c=0x5555556ebe68, flags=7) at redis.c:2441
#3  0x000055555557842d in processCommand (c=0x5555556ebe68) at redis.c:2766
#4  0x00005555555868c7 in processInputBuffer (c=0x5555556ebe68) at networking.c:1539
#5  0x0000555555586bb5 in readQueryFromClient (el=0x5555556a6248, fd=6, privdata=0x5555556ebe68, 
    mask=1) at networking.c:1631
#6  0x000055555557059a in aeProcessEvents (eventLoop=0x5555556a6248, flags=3) at ae.c:576
#7  0x000055555557075b in aeMain (eventLoop=0x5555556a6248) at ae.c:635
#8  0x000055555557b6c0 in main (argc=1, argv=0x7fffffffe3f8) at redis.c:4079

编码的转换

int -> embstr
embstr -> raw

字符串命令的实现

相关文章

  • Redis' strings

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

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

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

  • redis

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

  • redis中的对象

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

  • redis对象之列表对象

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

  • redis笔记:对象

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

  • Redis对象类型及应用

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

  • 01-redis数据结构与对象

    3. redis数据结构与对象 redis对外支持数据结构 字符串 (string) 字符串列表(list) 字符...

  • 第 8 章(对象)

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

  • 面试题|Java|Redis

    Redis内存模型 Redis内存分配 数据 :Redis存储的数据对象 字符串、哈希、列表、集合、有序集合 进程...

网友评论

      本文标题:Redis 字符串对象

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