redis源码命令分析--关键字keys命令
2014-03-24 23:05
555 查看
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
命令主要执行主要函数:
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
命令主要执行主要函数:
1) 调用getExpire获取对应key的过期时间的微秒值,即判断redisServer->db[index]->expires是否存在
2) 调用lookupKeyRead检测redisServer->db[index]->dict对应的key是否存在
3) 根据ttlCommand和pttlCommand第二个参数不同,格式1中的微秒值返回
RANDOMKEY 返回一个随机的key
命令:randomkey
redis协议:*$1\r\n$8\r\nrandomkey\r\n
命令主要执行主要函数:
命令: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 |
参数只支持整数或负整数字符串
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
命令主要执行主要函数:
ttlCommand | ttlGenericCommand --- getExpire --- lookupKeyRead |
pttlCommand |
2) 调用lookupKeyRead检测redisServer->db[index]->dict对应的key是否存在
3) 根据ttlCommand和pttlCommand第二个参数不同,格式1中的微秒值返回
RANDOMKEY 返回一个随机的key
命令:randomkey
redis协议:*$1\r\n$8\r\nrandomkey\r\n
命令主要执行主要函数:
相关文章推荐
- Redis源码剖析和注释(二十)--- 网络连接库剖析(client的创建/释放、命令接收/回复、Redis通信协议分析等)
- redis源码分析(一)复习redis命令、持久化方案、主从同步原理、配置
- redis源码分析(六)、redis命令学习总结—Redis 集合(Set)
- redis源码命令分析--列表lists
- redis源码分析(七)、redis命令学习总结—Redis 有序集合(sorted set)
- Redis源码分析系列二十:3 命令"ping"---pingCommand
- redis源码分析(三)redis命令学习总结—string字符串
- redis源码分析(四)、redis命令学习总结—链表List
- redis源码分析(五)、redis命令学习总结—哈希Hash
- Redis 源码分析 (一)Redis竟然用 C 语言进行面向对象编程
- 关于redis的keys命令的性能问题
- Redis命令参考(Keys & String)
- (十一)Redis集群JedisCluster实现keys命令方法
- Redis源码分析(十四)--- rdb.c本地数据库操作
- Zebra-VTYSH源码分析和改造(三):添加定制命令
- Linux c 开发 - Memcached源码分析之命令解析(2)
- memcached源码分析-----get命令处理流程
- redis源码分析 -- cs结构分析之客户端
- DEFAULT_KEYS_SHORTCUT 功能的验证 及其 源码实现分析
- Redis keys命令