hiredis-win32+libevent

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 16:43:23

决定用redis作为cache服务器,要求其服务端和客户端都支持跨平台win和linux
但我发现redis(/作者)对windows态度极差,不考虑,不支持
微软公司的闲人们主动靠过去,推出win版。这么一来,redis的
服务端linux版和win版都有了,我就在我的win7上部署了一个win版的redis服务器做调试用,余不累赘,以后另起课题讨论
客户端用hiredis,其
    win版(/往后简称winV)在
       
https://github.com/texnician/hiredis-win32
    原版master(往后简称masterV)在
       
https://github.com/redis/hiredis


下载来之,解开,对比它两:
    1、winV的examples.h/c直接和核心代码混在根目录上,组织乱
    2、winV全面用预编译宏_WIN32来区分平台代码,另辟代码分别实现各个接口,网络方面的改动最大
    3、winV除了新辟的代码,其它的
        3.1 winV删除了keepalive的接口
        3.2 其它的跟masterV区别不大,有些许改动

确保能编译winV
    1、新建目录examples,把examples.h/c全赶进去
    2、先不管winV其新辟的代码,把其它的改动,从masterV merge到 winV里
    3、建立vc工程hiredis4win.vcxproj/sln(/下载包里没有),把除了test/example之外的所有代码文件加入进去
    4、编译hiredis4win.vcxproj,发现一堆问题:
        4.1 微软的c编译器(/c89)不支持c99,而hiredis直接在c99标准上做的,这引起n多的问题:
            4.1.1 结构体的初始化的点语法
            4.1.2 c89不支持关键字bool
            4.1.3 c89的变量声明必须置于作用域的最前头
            4.1.4 c89不支持inline
        4.2 linux和win的平台差异
            4.2.1 win下没有函数
                    va_copy
                    gettimeofday
            4.2.2 linux如下函数
                    snprintf
                    strtoll(x,y,z)
                    strtoull(x,y,z)
                    vsnprintf
                    strcasecmp
                    strncasecmp
                在win下相应有同样签名函数
                    _snprintf
                    _strtoi64(x,y,z)
                    _strtoui64(x,y,z)
                    _vsnprintf
                    _stricmp
                    strnicmp
            4.4.3 ...

确保能链接hiredis的test
    1、建立hiredis_test.vcxproj/sln,把test.c加入该工程
    2、确保hiredis_test.vcxproj能编译链接

运行调试hiredis_test
    1、在本地机上运行redis的win版
    2、运行过程中,shift+F5中断之,结果下次运行的时候,老是报错:
        "Database #9 is not empty, test can not continue\n"
       打开redis服务器控制台,把db#9清空就好了
    3、测试进行到
        Testing against TCP connection
       的时候,发生死锁。问题因由:
        winV函数redisContextSetTimeout的实现,用错setsockopt。强制类型转换是原罪!

运行hiredis_test的release版
    1、死锁
    2、因由:test.c用的assert,在vc的release下是被discard的

让hiredis支持异步调用
    1、hiredis的异步支持,其adapter有三个选择
        ae
        libev
        libevnet
        我选择libevent;livevent的编译介绍在
http://my.oschina.net/jacobin/blog/146567
    2、把adapters/libevent.h分拆开声明和实现,实现在libevent.c(/新建)里。除了redisLibeventAttach,其它函数都是内部函数static

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!