漫话Redis源码之九十八

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

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

这里需要关注的就是hash_set, 前面的注释已经比较明确了:

/* If a string is ":deleted:", the special value for deleted hash fields is* returned; otherwise the input string is returned. */
static RedisModuleString *value_or_delete(RedisModuleString *s) {if (!strcasecmp(RedisModule_StringPtrLen(s, NULL), ":delete:"))return REDISMODULE_HASH_DELETE;elsereturn s;
}/* HASH.SET key flags field1 value1 [field2 value2 ..]** Sets 1-4 fields. Returns the same as RedisModule_HashSet().* Flags is a string of "nxa" where n = NX, x = XX, a = COUNT_ALL.* To delete a field, use the value ":delete:".*/
int hash_set(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {if (argc < 5 || argc % 2 == 0 || argc > 11)return RedisModule_WrongArity(ctx);RedisModule_AutoMemory(ctx);RedisModuleKey *key = RedisModule_OpenKey(ctx, argv[1], REDISMODULE_WRITE);size_t flags_len;const char *flags_str = RedisModule_StringPtrLen(argv[2], &flags_len);int flags = REDISMODULE_HASH_NONE;for (size_t i = 0; i < flags_len; i++) {switch (flags_str[i]) {case 'n': flags |= REDISMODULE_HASH_NX; break;case 'x': flags |= REDISMODULE_HASH_XX; break;case 'a': flags |= REDISMODULE_HASH_COUNT_ALL; break;}}/* Test some varargs. (In real-world, use a loop and set one at a time.) */int result;errno = 0;if (argc == 5) {result = RedisModule_HashSet(key, flags,argv[3], value_or_delete(argv[4]),NULL);} else if (argc == 7) {result = RedisModule_HashSet(key, flags,argv[3], value_or_delete(argv[4]),argv[5], value_or_delete(argv[6]),NULL);} else if (argc == 9) {result = RedisModule_HashSet(key, flags,argv[3], value_or_delete(argv[4]),argv[5], value_or_delete(argv[6]),argv[7], value_or_delete(argv[8]),NULL);} else if (argc == 11) {result = RedisModule_HashSet(key, flags,argv[3], value_or_delete(argv[4]),argv[5], value_or_delete(argv[6]),argv[7], value_or_delete(argv[8]),argv[9], value_or_delete(argv[10]),NULL);} else {return RedisModule_ReplyWithError(ctx, "ERR too many fields");}/* Check errno */if (result == 0) {if (errno == ENOTSUP)return RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);elseRedisModule_Assert(errno == ENOENT);}return RedisModule_ReplyWithLongLong(ctx, result);
}int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {REDISMODULE_NOT_USED(argv);REDISMODULE_NOT_USED(argc);if (RedisModule_Init(ctx, "hash", 1, REDISMODULE_APIVER_1) ==REDISMODULE_OK &&RedisModule_CreateCommand(ctx, "hash.set", hash_set, "",1, 1, 1) == REDISMODULE_OK) {return REDISMODULE_OK;} else {return REDISMODULE_ERR;}
}

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



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

相关文章

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

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命