漫话Redis源码之九十九

2024-02-06 09:32
文章标签 源码 redis 九十九 漫话

本文主要是介绍漫话Redis源码之九十九,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里是movable keys command的一个sample, 比较简单:

#include "redismodule.h"
#include <strings.h>
#include <assert.h>
#include <unistd.h>
#include <errno.h>#define UNUSED(V) ((void) V)/* A sample movable keys command that returns a list of all* arguments that follow a KEY argument, i.e.*/
int getkeys_command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{int i;int count = 0;/* Handle getkeys-api introspection */if (RedisModule_IsKeysPositionRequest(ctx)) {for (i = 0; i < argc; i++) {size_t len;const char *str = RedisModule_StringPtrLen(argv[i], &len);if (len == 3 && !strncasecmp(str, "key", 3) && i + 1 < argc)RedisModule_KeyAtPos(ctx, i + 1);}return REDISMODULE_OK;}/* Handle real command invocation */RedisModule_ReplyWithArray(ctx, REDISMODULE_POSTPONED_ARRAY_LEN);for (i = 0; i < argc; i++) {size_t len;const char *str = RedisModule_StringPtrLen(argv[i], &len);if (len == 3 && !strncasecmp(str, "key", 3) && i + 1 < argc) {RedisModule_ReplyWithString(ctx, argv[i+1]);count++;}}RedisModule_ReplySetArrayLength(ctx, count);return REDISMODULE_OK;
}int getkeys_fixed(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{int i;RedisModule_ReplyWithArray(ctx, argc - 1);for (i = 1; i < argc; i++) {RedisModule_ReplyWithString(ctx, argv[i]);}return REDISMODULE_OK;
}/* Introspect a command using RM_GetCommandKeys() and returns the list* of keys. Essentially this is COMMAND GETKEYS implemented in a module.*/
int getkeys_introspect(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
{UNUSED(argv);UNUSED(argc);if (argc < 3) {RedisModule_WrongArity(ctx);return REDISMODULE_OK;}int num_keys;int *keyidx = RedisModule_GetCommandKeys(ctx, &argv[1], argc - 1, &num_keys);if (!keyidx) {if (!errno)RedisModule_ReplyWithEmptyArray(ctx);else {char err[100];switch (errno) {case ENOENT:RedisModule_ReplyWithError(ctx, "ERR ENOENT");break;case EINVAL:RedisModule_ReplyWithError(ctx, "ERR EINVAL");break;default:snprintf(err, sizeof(err) - 1, "ERR errno=%d", errno);RedisModule_ReplyWithError(ctx, err);break;}}} else {int i;RedisModule_ReplyWithArray(ctx, num_keys);for (i = 0; i < num_keys; i++)RedisModule_ReplyWithString(ctx, argv[1 + keyidx[i]]);RedisModule_Free(keyidx);}return REDISMODULE_OK;
}int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {UNUSED(argv);UNUSED(argc);if (RedisModule_Init(ctx,"getkeys",1,REDISMODULE_APIVER_1)== REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"getkeys.command", getkeys_command,"getkeys-api",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"getkeys.fixed", getkeys_fixed,"",2,4,1) == REDISMODULE_ERR)return REDISMODULE_ERR;if (RedisModule_CreateCommand(ctx,"getkeys.introspect", getkeys_introspect,"",0,0,0) == REDISMODULE_ERR)return REDISMODULE_ERR;return REDISMODULE_OK;
}

这篇关于漫话Redis源码之九十九的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683855

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3