您的位置:首页 > 数据库 > Redis

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

命令主要执行主要函数:

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 返回一个随机的key

命令:randomkey

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

命令主要执行主要函数:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: