Redis 源码学习- Redis命令

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

Redis命令

redis.h中定了命令的数据结构,并且在redis.c中定义了命令表。

Redis命令数据结构
struct redisCommand {
  
    char *name;

    redisCommandProc *proc;
    
    int arity;
 
    char *sflags;  /* Flags as string representation, one char per flag. */
 
    int flags;  /* The actual flags, obtained from the 'sflags' field. */

    /* Use a function to determine keys arguments in a command line.
     * Used for Redis Cluster redirect. */
    redisGetKeysProc *getkeys_proc;

    int firstkey;  /* The first argument that's a key (0 = no keys) */
    
    int lastkey;  说/* The last argument that's a key */
    
    int keystep;  /* The step between first and last key */

    long long microseconds, calls;
};
Redis命令表定义
/* 
 * 命令表
 */
 struct redisCommand redisCommandTable[] = {
    {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
    {"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
    ... // 后面的省略
};
解析

命令的基本结构由命令名称(name)和实现函数(proc)组成。

arity表示为参数的个数,可以用 -N 表示 >= N。sflags是一个用来表示FLAG的字符串,每个标志一个字符。命令中的FLAG首先是设置在sflags上,之后初始化服务器时调用redis.c中的populateCommandTable()函数从 sflags 属性中计算出真正的 FLAG 到 flags 属性中。

getkeys_proc是从命令中判断命令的键参数。在Redis 集群转向时使用。一个可选的函数,用于从命令中取出key参数,仅在以下三个参数都不足以表示key参数时使用。

firstkey为第一个 key 参数的位置;lastkey为最后一个 key 参数的位置;keystep为key参数步长,从 first 参数和 last 参数之间,所有 key 的步数(step)。比如说, MSET 命令的格式为 MSET key value [key value ...],它的 step 就为 2。

microseconds记录执行这个命令耗费的总微秒数,初始化为 0。calls记录命令被执行的总次数,初始化为 0。

FLAG含义解析

w: write command (may modify the key space).
写入命令,可能会修改 key space

r: read command (will never modify the key space).
读命令,不修改 key space

m: may increase memory usage once called. Don't allow if out of memory.
可能会占用大量内存的命令,调用时对内存占用进行检查

a: admin command, like SAVE or SHUTDOWN.
管理用途的命令,比如 SAVE 和 SHUTDOWN

p: Pub/Sub related command.
发布/订阅相关的命令

f: force replication of this command, regardless of server.dirty.
无视 server.dirty ,强制复制这个命令。

s: command not allowed in scripts.
不允许在脚本中使用的命令

R: random command. Command is not deterministic, that is, the same command
with the same arguments, with the same key space, may have different results. For instance SPOP and RANDOMKEY are two random commands.
随机命令。命令是非确定性的:对于同样的命令,同样的参数,同样的键,结果可能不同。比如 SPOP 和 RANDOMKEY 就是这样的例子。

S: Sort command output array if called from script, so that the output is deterministic.
如果命令在 Lua 脚本中执行,那么对输出进行排序,从而得出确定性的输出。

l: Allow command while loading the database.
允许在载入数据库时使用的命令。

t: Allow command while a slave has stale data but is not allowed to server this data. Normally no command is accepted in this condition but just a few.
允许在附属节点带有过期数据时执行的命令。
这类命令很少有,只有几个。

M: Do not automatically propagate the command on MONITOR.
不要在 MONITOR 模式下自动广播的命令。

k: Perform an implicit ASKING for this command, so the command will be accepted in cluster mode if the slot is marked as 'importing'.
为这个命令执行一个显式的ASKING,使得在集群模式下,一个被标示为importing的槽可以接收这命令。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
16 0
|
4天前
|
NoSQL API Redis
Redis源码(1)基本数据结构(上)
Redis源码(1)基本数据结构
21 2
|
2天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
4天前
|
NoSQL Redis 数据库
Redis中的常用命令非常丰富,涵盖了各种数据类型的基本操作以及服务器管理和维护的相关指令
【5月更文挑战第15天】Redis常用命令包括通用(如PING、SELECT)、键操作(KEYS、EXISTS、DEL)、字符串(SET、GET)、哈希(HSET、HGET)、列表(LPUSH、LPOP)、集合(SADD、SMEMBERS)和有序集合(ZADD、ZRANGE)等。这些命令用于数据操作及服务器管理,满足不同场景需求。了解更多命令,建议参考Redis官方文档。
12 2
|
4天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
20 1
|
4天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
34 0
|
4天前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
10 0
|
4天前
|
存储 NoSQL API
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(上)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
18 1
|
4天前
|
NoSQL API Redis
Redis源码、面试指南(3)数据对象类型编码(下)
Redis源码、面试指南(3)数据对象类型编码
11 1
|
4天前
|
存储 NoSQL API
Redis源码、面试指南(3)数据对象类型编码(上)
Redis源码、面试指南(3)数据对象类型编码
17 2