Redis 源码学习- Redis命令

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
119 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
44 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
233 3
|
11天前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
24 0
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
24 3
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
1月前
|
缓存 NoSQL Redis
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
46 3
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
205 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习