当前位置: 首页 > Linux

教你玩转RedisModule模块解读

时间:2023-04-07 00:38:02 Linux

介绍目前Redis的Stable版本是4.0.11,比较关注Redis的童鞋们都知道4.0引入了Module。让我们来看看Redis4.0更新了哪些内容。Redis4.0正式于2017年7月作为GA发布。包含几项重大改进:模块系统、更好的复制(PSYNC2)、驱逐策略的改进、线程DEL/FLUSH、混合RDB+AOF格式、RaspberryPi支持作为主要平台、新的MEMORY命令、RedisCluster对Nat/Docker的支持、主动内存碎片整理、内存使用和性能改进、更快的RedisCluster密钥创建、许多其他数量较少的功能和一个行为修复。简单总结一下:自定义扩展redis模块,当然相对于redislua脚本,还是有一些学习成本的。。。psync2的优点是redis主从切换后,不需要重新fullsync同步,只需要部分同步,有点类似于binlog。具体实现还没有看到。阿里自己是通过timestamp时间戳来实现的。内存命令可以估计非数据命令的内容大小和异步执行。我们知道redis处理请求是单线程的。执行Flush和del数据太大会被阻塞。Redis4.0新增了异步操作功能……今天来玩玩多图预览吧。RedisModule模块可以做什么?1.站在巨人的肩膀上(访问Redis数据空间)官方模块教程https://redis.io/topics/modul...Redis提供了两套数据访问的API,一套是类似Lua的更高级的API脚本,通常用于调用不提供支持Redis命令的API。另一套是底层API,速度非常快,基本和Redis原生命令一样快,也提供了一些处理各种数据结构的函数,是推荐的数据访问方式。高层API使用RedisModule_Call调用Redis命令,如:RedisModuleCallReply*reply;reply=RedisModule_Call(ctx,"INCR","sc",argv[1],"10");底层API使用RedisModule_OpenKey打开并获取Key指针再进行后续处理,如:RedisModuleKey*key;key=RedisModule_OpenKey(ctx,"somekey",REDISMODULE_READ);2.更进一步(实现新的数据结构)对于简单的数据结构,可以使用DMA(直接内存访问)将结构编码存储在Redis的String类型中,如://获取字符串内存指针和然后修改其内容size_tlen;char*myptr=RedisModule_StringDMA(key,&len,REDISMODULE_WRITE);//增加,减少或创建一个字符串RedisModule_StringTruncate(key,1024);API还可以用来注册和实现新的数据结构,可以控制内存的分配和释放、RDB序列化、AOF重写等。这里有一个Redis官方的例子,好奇的同学可以点进去看看。3、灵活扩展(阻塞命令的实现)阻塞命令(Blockingcommands)会阻塞客户端,直到某个预期事件发生才会返回,比如List的BLPOP命令。模块API还提供了实现阻塞命令的功能。Redis内置命令集中有一些阻塞命令。其中最常见的是BLPOP(或对称BRPOP),它阻塞等待列表的元素到达。关于阻塞命令的一个有趣事实是它们不会阻塞整个服务器,而只会阻塞它们的客户端。通常阻塞的原因是我们期望一些外部事件发生:这可能是Redis数据结构的一些变化,例如BLPOP情况、线程中发生的长时间计算、从网络接收一些数据等。详见文档:https://redis.io/topics/modul...4.自由发挥(loadingmodules)有两种加载模块的方式。一种是使用loadmodule/path/to/mymodule在Redis启动时加载的配置文件redis.conf.so中。查看加载的模块:另一种方法是在运行时使用命令MODULELOAD/path/to/panda.so加载它们。使用MODULEUNLOAD熊猫卸载。模块加载时可以传入参数,如:loadmodulepanda.sohellopanda1234,参数会传入模块的OnLoad方法。5.人多力量大(支持RedisCluster)官方文档提供了两个API:RedisModule_IsKeysPositionRequest(ctx);RedisModule_KeyAtPos(ctx,pos);API方法intRedisModule_CreateCommand(RedisModuleCtx*ctx,第一次调用RedisModule_CreateCommand()时需要调用constchar*name,RedisModuleCmdFunccmdfunc,constchar*strflags,intfirstkey,intlastkey,intkeystep);strflags参数的flag之一是getkeys-api,表示该方法是否支持返回参数中的key。一个方法接收多个参数,但并非所有参数都是键。比如LRANGEkeystartstop,只有第一个参数是key。而Redis需要知道一条命令涉及到哪些键,才能在集群中找到对应的服务器并执行该命令。可以参考这个模块的代码https://github.com/RedisLabsM...官方模块仓库(RedisModuleHub)官方模块仓库包含很多优质模块:新的数据结构,比如:rejson提供支持原生JSON格式,允许获取和修改JSON数据中的值RedisGraph增加了对图数据库的支持和对现有数据结构功能的其他扩展,例如:rxkeys提供了根据条目批量获取和删除条目的功能正则表达式rxhashes提供了改变Hash中已有项的值并返回原始值的原子操作rxlists提供了7种新的列表操作方法。一次运行写了一个非常简单的RedisModule用于学习redis-module-panda一个简单的redismodule,JustforfunInspireAndThankshttps://redis.io/topics/modul...https://redislabs.com/communi...https://github.com/erans/redi...https://github.com/dayeshisir...安装1.克隆代码gitclonehttps://github.com/wujunze/redis-module-panda.git2。鸟神3。加载的模块redis版本必须大于4.0检查安装的模块加载模块run127.0.0.1:6379>panda.hellotestcommand卸载模块完整的测试过程代码仓库:https://github.com/wujunze/re...觉得有收获请star,还有下集,ThanksInspire和Thankshttps://redis.io/topics/modul...https://redislabs.com/communi。..https://liangshuang.name/2017...https://github.com/erans/redi...https://github.com/dayeshisir...作者见识少,草草写的。请大家指正。