文章目录
Redis 命令参考
https://github.com/doocs/technical-books#database
1. 数据结构
memcached和redis性能差不多(10-30w qps)
Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型(Redis 6.0 引入了多线程 IO )
redis提供更丰富的附加功能:发布订阅模型、Lua脚本、事务等
redis过期数据的删除策略有惰性删除和定期删除,而Memcached 只有惰性删除
我们知道一般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
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 数据结构的定义
/