redis 五种基本数据类型的内部编码

目录

 

字符串类型的内部编码:

哈希类型的内部编码:

列表类型的内部编码:

集合类型的内部编码:

有序集合类型的内部编码:

数据初始化

测试结果:


字符串类型的内部编码:

  1. int 8个字节的长整型
  2. embstr: 小于等于39个字节的字符串
  3. raw: 大于39个字节的字符串

redis会根据当前值的类型长度去判断选用那种内部编码实现;

哈希类型的内部编码:

  1. ziplist(压缩列表): 当哈希元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64字节),redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀
  2. hashtable(哈希表): 当哈希类型无法满足ziplist的条件时, redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1);

列表类型的内部编码:

  1. ziplist(压缩列表): 当列表元素个数小于list-max-ziplist-entries配置(默认512个),同时所有值都小于list-max-ziplist-value配置(默认64字节),redis会使用ziplist作为列表的内部实现来减少内存的使用
  2. linkedlist(链表): 当列表类型无法满足ziplist的条件的时候.redis会采用linkedlist作为链表的内部实现;
  3. quicklist : 在redis3.2 版本后,一种新的数据结构,结合了ziplist和quicklist的优点,所以采用redis3.2以后版本的列表的内部编码都采用了quicklist;

集合类型的内部编码:

  1. intset(整数集合): 当集合元素个数小于set-max-ziplist-entries配置(默认512个),redis会使用intset作为集合的内部实现来减少内存的使用
  2. hashtable(哈希表): 当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现

有序集合类型的内部编码:

  1. ziplist(压缩列表): 当列表元素个数小于zset-max-ziplist-entries配置(默认128个),同时所有值都小于zset-max-ziplist-value配置(默认64字节),redis会使用ziplist作为列表的内部实现来减少内存的使用
  2. skiplist(跳跃表): 当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降

数据初始化

@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseSpringDateRedisTest {

    @Autowired
    protected RedisTemplate redisTemplate;


    public ValueOperations getForValue() {
        return redisTemplate.opsForValue();
    }

    public SetOperations getForSet() {
        return redisTemplate.opsForSet();
    }

    public ListOperations getForList() {
        return redisTemplate.opsForList();
    }

    public ZSetOperations getForZSet() {
        return redisTemplate.opsForZSet();
    }

    public HashOperations getForHash() {
        return redisTemplate.opsForHash();
    }

    public HyperLogLogOperations getForHyperLogLog() {
        return redisTemplate.opsForHyperLogLog();
    }

    public GeoOperations getForGeo() {
        return redisTemplate.opsForGeo();
    }

    public ClusterOperations getForCluster() {
        return redisTemplate.opsForCluster();
    }
}

public class EncodingTest extends BaseSpringDateRedisTest {

    private static final String LIST_KEY = "list:key:one";
    private static final String KEY_TWO = "list:key:two";
    private static final String KEY_THREE = "list:key:three";
    static final String person = "hash:common:person";
    static final String tag = "hash:common:tag";

    @Test
    public void dataInit() {

        // String 内部编码 int embstr raw
        //8个字节 39个字节 大于39个字节
        getForValue().set( "string:key:one","9988" );
        getForValue().set( "string:key:two","北龙归心号苍穹,竞曰风云山河" );
        getForValue().set( "string:key:three","星耀自古晦明时,不持太阿误剑诗!十方萧索无涯·千古夕阳有主·诗仙纵横·刀剑茫茫去不还" );
        // hash 内部编码
        // ziplist  元素个数小于512, 每个元素值小于64字节
        // hashtable
        getForHash().put( tag,"name","苦海女神龙" );
        getForHash().put("hash:common:key","hashtable",
                "一腔热肠,两坛吊儿,三五知己,醉了十部幽曲。六弦古琴,七觑红尘,八九豪情,乱了四方风云,一排轻筏,两处闲情,三五鸿雁,别了十里清溪。六发绝招,七具尸体,八九回合,杀了四年仇人");


        // 链表---  其实ziplist linkedlist 在3.2版本后就被quicklist 代替, quicklist 结合了前两者的优点
        //1. 元素个数小于 512个;
        //2. 元素值小于64字节
        getForList().rightPush( LIST_KEY, "998" );

        // 元素值大于64字节
        getForList().leftPush( KEY_TWO, "烟波 瀰漫掩樯橹 眨眼汹涌吞噬 没江底酆都\n" +
                "屠苏 落喉几朝暮 冬去春寒未了 伴冷夜暗雨\n" +
                "刀斧 剑芒遍五湖 遥祭散骸豪骨 焉回首眷顾" );

        // 元素个数超过512个
        for (int i = 0; i < 513; i++) {
            getForList().leftPush( KEY_THREE, i + "" );

        }

        //集合
        // intset 元素个数小于512
        // hashtable
        getForSet().add( "set:key:one","1","2" );

        for (int i = 0; i < 513; i++) {
            getForSet().add( "set:key:two",i+"" );
        }


        // 有序集合: ziplist
        //1. 元素个数小于 128个;
        //2. 每个元素值小于64字节
        getForZSet().add( "zset:key:one", "rabbit", 99.0 );

        // skipList
        // 元素个数超过128个
        for (int i = 0; i < 129; i++) {
            getForZSet().add( "zset:key:two", "noddles" + i, 88.88 );
        }
    }
}


测试结果:

redis 五种基本数据类型的内部编码_第1张图片

你可能感兴趣的:(Redis)