Redis源码学习


Redis 命令参考

Redis 设计与实现

https://github.com/doocs/technical-books#database

在这里插入图片描述

1. 数据结构

【大课堂】Redis 简介——为什么选择Redis

memcached和redis性能差不多(10-30w qps)

Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型(Redis 6.0 引入了多线程 IO )

redis提供更丰富的附加功能:发布订阅模型、Lua脚本、事务等

redis过期数据的删除策略有惰性删除和定期删除,而Memcached 只有惰性删除

最详细的Redis五种数据结构详解(理论+实战)

吊打面试官-Redis 为什么那么快?数据结构篇

我们知道一般cpu从内存中读取数据会先读取到 cache line(缓存行),
一个缓存行基本占64个字节,其中redisObject最少占16个字节(根据属性的类型计算得出),所以如果要读取一个 redisObject,会发现只读取了16个字节,剩下的48个字节的空间相当于浪费,所以为了提高性能(主要减少了内存读取的次数),所以再RedisObject空间后又开辟48个字节的连续空间,将ptr指向的值存入其中,注意此处存入的是字符串类型,48个字节对应的是sdshdr8存储结构。而
sdshdr8 在不存入数据的情况下,最少要 4 个字节(其中一个字节是字符串尾部的’\0’),那么还剩余 44 个字节,所以如果在 44 个字节以内字符串就可以放在缓存行里面,从而减少了内存I/O次数

typedef struct redisObject {
   

    // 类型
    unsigned type:4;

    // 编码
    unsigned encoding:4;

    // 对象最后一次被访问的时间
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */

    // 引用计数
    int refcount;

    // 指向实际值的指针
    void *ptr;

} robj;

在这里插入图片描述

127.0.0.1:6379> OBJECT encoding names
"embstr"
127.0.0.1:6379> set key 234
OK
127.0.0.1:6379> OBJECT encoding key
"int"
127.0.0.1:6379> type key
string

举一个简单的例子,你在Redis中设置一个字符串key 234,然后查看这个字符串的存储类型就会看到为int类型,非整数型的使用的是embstr储存类型,具体操作如下图所示:

在这里插入图片描述

1.1 string type

【大课堂】Redis中字符串的表示

1.1.1 string的3种encoding方式

1.1.1.1 int encoding

指的是 int64

127.0.0.1:6379> set int_test 9223372036854775807
OK
127.0.0.1:6379> OBJECT encoding int_test
"int"
127.0.0.1:6379> set int_test 9223372036854775808
OK
127.0.0.1:6379> OBJECT encoding int_test
"embstr"
1.1.1.2 embstr encoding

字符串长度小于等于32B

1.1.1.3 raw encoding

sds对象

1.1.2 sds

sds的优点

1.2 hash

1.2.1 hash 数据结构的定义

【大课堂】Redis底层数据存储原理

/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值