Redis设计与实现(二)--单机数据库

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 {
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值