让redis支持动态库

redis的命令列表是写死在代码里面,编译后就没法修改(跟nginx一个德行)

硬编码一些额外的方法到redis中

最初写的一个hello world级的测试命令

void wendalCommand(redisClient *c) {
    struct timeval tv;           // 从timeCommand拷贝的...
    addReplyMultiBulkLen(c,3);   // 共返回3个结果
    addReplyBulkCString(c, "Hi,Wendal"); // 输出个字符串啦
    gettimeofday(&tv,NULL);              // 获取时间, 也是从timeCommand拷贝的
    addReplyBulkLongLong(c,tv.tv_sec);   // 不解释了
    addReplyBulkLongLong(c,tv.tv_usec);  // 不解释了}

然后在redisCommandTable中声明一个新的命令,就搞定了

{"wendal", wendalCommand,1,"rR",0,NULL,0,0,0,0,0}

做得更灵活?上动态库,哈哈

so,我声明了2个新的命令, 加载/卸载动态库

    {"loadlib",loadlibCommand,2,"wmaR",0,NULL,0,0,0,0,0},
    {"unloadlib",unloadlibCommand,2,"wmaR",0,NULL,0,0,0,0,0}

其中, 加载动态库,就是接受一个路径,并执行其redis_lib_init方法

// 简化版的loadlibCommandvoid loadlibCommand(redisClient *c) {
    void *handle;
    char *error;
    int (*redis_lib_init)(redisClient*, dict*);
    int re;
    
    handle = dlopen(c->argv[1]->ptr, RTLD_LAZY);
    if (!handle) {
        addReplyError(c, dlerror());
        return;
    }
    redis_lib_init = dlsym(handle, "redis_lib_init"); // 查找redis_lib_init
    if ((error = dlerror()) != NULL)  {
        dlclose(handle);
        addReplyError(c, error);
        return;
    }
    re = redis_lib_init(c, server.commands); // 执行之, 返回0就成功
    if (re) {
        dlclose(handle);
        addReplyError(c, "lib init error");
        return;
    }
    addReply(c,shared.ok);
    server.dirty ++;                        // 使dirty自增,这样就能同步到slave了}

redis动态库示例

禁用flushdb命令

#include <redis.h>static void* flushdb;extern int redis_lib_init(redisClient *c) {
    flushdb = dictFetchValue(server.commands, sdsnew("FLUSHDB")); // 命令列表就是server.commands中,一个dict
    if (!flushdb) return 1; // 找不到? 被其他库删掉了?
    dictDeleteNoFree(server.commands, sdsnew("FLUSHDB")); // 删除但不要执行free
    return 0;}extern void redis_lib_depose(redisClient *c) {
    dictAdd(server.commands, sdsnew("FLUSHDB"), flushdb); // 卸载的时候就赋值回去,呵呵
    return;}

项目地址

https://raw.github.com/wendal/redis_plugins

https://raw.github.com/wendal/redis

转载于:https://my.oschina.net/kuerant/blog/205085

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率更高,时间更短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求时,各个工作线程处于休眠状态。有读写请求时,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列中。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务时,执行下一个工作任务,同时把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命中,返回数据给玩家,redis命中失败,mysql中查找数据,然后写入数据到redis中,返回数据给用户。7、用户写数据策略:用户先从redis中删除数据,然后写数据到mysql中,最后再把数据写入到redis中,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值