redis的类型检查:
redis中有些命令只能作用于特定类型的对象上,比如:set、get、append、strlen只能对字符串键执行。hdel、hset、hget、hlen等命令只能对哈希执行。rpush、lpush、linsert、llen等命令只能对列表键执行。sadd、spop、sinsert、scard等只能对集合键执行。zadd、zcard、zrank、zscore等命令只能对有序集合键执行。
类型检查的实现:类型特定命令所进行的类型检查是通过redisObject结构的type属性来实现的。在执行一个特定命令之前,服务器会先检查输入的数据键的值对象是否执行命令锁需的类型,如果是的话,服务器就会对键执行特定的命令。否则,服务器会拒绝执行,并向客户端返回错误。
命令多态: 上篇博客讲过,同一个类型底层是的实现方式可能会不一样。比如:列表对象有ziplist和linkedlisk两种编码可用,其中前者使用压缩列表的API来实现列表命令,后者用双端链表的API来实现列表命令。对列表执行统一个命令llen,会根据底层的编码方式选择正确的命令来获取列表的长度。
内存回收:
因为C语言并不具备自动内存回收功能,所以Redis在自己的对象系统中构建一个引用计数技术实现的内存回收机制。通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收,每个对象的的引用计数由redisObject结构的refcount属性记录。对象的引用计数行会随着对象的状态二不断的变化。当创建一个新对象,它的引用计数会被初始化为1,当对象被一个新程序使用时,它的引用计数增1,当对象不在被一个程序使用时,它的引用计数减1.当对象的引用计数为0时,该对象占用的内存会被释放。
对象共享:
目前来说,Redis会在初始化服务器时,创建一万个字符串对象,这些对象包含了从0到9999的所有整数值,当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象,而不是新创建对象。
对象的空转时长:
redisObject对象记录了一个lru属性,记录了该对象最后一次被命令程序访问的时间,通过object idletime命令可以打印出给定键的空转时间,这个时间就是用当前时间减去对象的lru时间计算出来的。
数据库:
Redis服务器会初始化默认16个数据库。数据库的信息保存在redisServer结构中。
struct redisServer {