redis源码命令分析--关键字keys命令

  • DEL key [key ...]删除一个key

                  命令:del key1 key2 key3

                  redis协议:*$4\r\n$3\r\ndel\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n$4\r\nkey3\r\n

                  命令主要执行主要函数: delCommand    ------------  dbDelete  ------------   dictDelete

                          1)尝试删除redisServer->db[index]->dict 和redisServer->db[index]->expires两个字典中key的数据

                          2)redisServer ->dirty++



  • EXISTS key查询一个key是否存在
              命令:exists key1

              redis协议:*$2\r\n$6\r\nexists\r\n$4\r\nkey1\r\n

             命令主要执行主要函数:existsCommand   ---  expireIfNeeded   ---  dbExists  ---  dictFind

                       1)expireIfNeeded判断redisServer->db[index]->expires中对应的key是否过期,过期则调用dbDelete (参见del命令说明)

                       2)dbExists调用dictFind查询指定的key是否存在

                                           


  • EXPIRE key seconds设置一个key的过期的秒数
             命令: EXPIRE mykey 10

             redis协议:*$3\r\n$6\r\nexpire\r\n$5\r\nmykey\r\n$2\r\n10\r\n

             命令主要执行主要函数:

expireCommand expireGenericCommand  --  getLongLongFromObjectOrReply  ---  dictFind  ---   setExpire
expireatCommand
pexpireCommand
pexpireatCommand
          

                      1)getLongLongFromObjectOrReply主要是获取命令行传入设置时间的值(int  time

                                        参数只支持整数或负整数字符串

                      2)expireGenericCommand 会获取命令行传入设置时间(int  time)格式为unix微秒时间,根据命令的不同,格式方式有四种

                                       expire       :time*1000+系统当前的微秒时间

                                       expireat    :time*1000+0

                                       pexpire      :time*+系统当前的微秒时间

                                       pexpireat   :time+0

                      3) 调用dictFind查找对应的key

                      4)如果time大于系统当前的微秒时间,则调用setExpire设置对应key的过期时间

                      5)如果time小于系统当前的微秒时间 且为 master不在loading数据状态,会创建一个模拟的redisClient对象,并执行del命令。



  • EXPIREAT key timestamp设置一个UNIX时间戳的过期时间

             参见EXPIRE命令


  • PERSIST key移除key的过期时间
              参见 EXPIRE命令


  • PEXPIRE key milliseconds设置一个key的过期的毫秒数

             参见EXPIRE命令


  • KEYS pattern查找所有匹配给定的模式的键

           命令:keys ab*

           redis协议:*$2\r\n$4\r\nkeys\r\n$3\r\nab*\r\n

           命令主要执行主要函数:keysCommand  ---  dictGetSafeIterator  ---  dictNext   ---   stringmatchlen  ---   expireIfNeeded   ---   dictReleaseIterator

                1)dictGetSafeIterator获取redisServer->db[index]->dict的安全迭代器,通过dictNext  可以循环获取字典中所有key的对象

                 2)判断每个key的对象与参数正则是否匹配,匹配且expireIfNeeded没有过期,则添加到回复队列中

                 3)关闭迭代器


  • MOVE key db移动一个key到另一个数据库

              命令:move key 1

              redis协议:*$3\r\n$4\r\nmove\r\n$3\r\nkey\r\n$1\r\n1\r\n

             命令主要执行主要函数:moveCommand  ---  selectDb   ---   lookupKeyWrite  ---   dbAdd  ---  dbDelete

                  1)调用selectDb检测目标DB是否存在,并且与源DB是否相同

                  2)调用lookupKeyWrite查询源DB是否存在相应的key,不存在则报错

                  3)调用lookupKeyWrite查询目标DB是否存在相应的key,存在则报错

                  4)调用dbAdd添加key到目标DB中

                  5)调用dbDelete删除源DB中相应的key

                 6)redisServer ->dirty++


  • PERSIST key移除key的过期时间

            命令:persist mykey

            redis协议:*$2\r\n$7\r\npersist\r\n$5\r\nmykey\r\n

            命令主要执行主要函数:persistCommand   ---   dictFind  ---   removeExpire  ---   dictDelete

                 1)调用dictFind查询redisServer->db[index]->dict对应的key,不存在则报错

                  2)调用removeExpire删除redisServer->db[index]->expires对应key,如果不存在,则报错

                  3)redisServer ->dirty++


  • TTL key获取key的有效时间(单位:秒)
            命令:ttl mykey

           reids协议:*$2\r\n$3\r\nttl\r\n$5\r\nmykey\r\n

          命令主要执行主要函数:

         

ttlCommandttlGenericCommand  ---  getExpire  ---   lookupKeyRead
pttlCommand

          1)  调用getExpire获取对应key的过期时间的微秒值,即判断redisServer->db[index]->expires是否存在

          2)  调用lookupKeyRead检测redisServer->db[index]->dict对应的key是否存在

          3) 根据ttlCommand和pttlCommand第二个参数不同,格式1中的微秒值返回


              

             命令:randomkey

            redis协议:*$1\r\n$8\r\nrandomkey\r\n

            命令主要执行主要函数:


        


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值