最近有这样一个需求:服务端(c++实现运行在windows下)在不断采集数据,当有客户端连接来时把收集到的数据发给客户端。功能很简单,但我怕直接写socket考虑不全一些异常情况,于是就建议装个redis然后服务端将采集的数据发给redis,然后客户端再从redis上取,这样开发会更高效一些。没想到,这是挖了个天坑,redis在windows下压根不直接支持hiredis库,费了好大劲最后才搞出来一个可行的,这里记录一下该过程,别以后又不会了。
开发环境
- 操作系统:win7
- 开发环境:vs2010
针对以上环境,我到https://github.com/MicrosoftArchive/redis/tree/2.6这个地址下载了可用vs2010编译的源码。
编译
编译过程还是比较简单的,到msvs目录下打开hiredis工程编译一下就出来hiredis.lib
文件了,windows下使用时要一起把ws2_32.lib
也加上。
直接上个实例代码看看。
实例
1 |
|
填坑
主要解决如下问题:
- 如果工程是
md/mdd
的话,就改成mt/mtd
- 要把
win32fixes.c、win32fixes.h、fmacros.h
这几个文件拷贝到工程下 - windows下建socket需要先加类似
WSAStartup(MAKEWORD(2,2),&wsaData)
的代码 - 设置好相应的include路径和lib路径
问题
当向发布的消息过快过多时,使用客户端redis-cli
的subscribe
命令订阅时,出现错误:Error: 远程主机强迫关闭了一个现有的连接。
这个问题应该是服务端的限制,在redis.conf
配置文件下有一项client-output-buffer-limit pubsub 32mb 8mb 60
,意思是Redis订阅客户端订阅buffer超过32M或持续60秒超过8M,订阅立即被关闭。修改此项应该能解决问题。
python
c语言操作redis不麻烦,但人们都习惯越简单越好,于是我们试试python来操作redis。
安装支持模块:pip install redis
不多废话,直接上代码:
1 | import redis |
更多操作还是要看官网https://pypi.org/project/redis/
总结
通过上面这些操作应该差不多了,这是凭记忆总结的,可能会有遗漏,再补充。