[![Build Status](https://travis-ci.org/redis/hiredis.png)](https://travis-ci.org/redis/hiredis)
# HIREDIS
Hiredis is a minimalistic C client library for the [Redis](http://redis.io/) database.
It is minimalistic because it just adds minimal support for the protocol, but
at the same time it uses an high level printf-alike API in order to make it
much higher level than otherwise suggested by its minimal code base and the
lack of explicit bindings for every Redis command.
Apart from supporting sending commands and receiving replies, it comes with
a reply parser that is decoupled from the I/O layer. It
is a stream parser designed for easy reusability, which can for instance be used
in higher level language bindings for efficient reply parsing.
Hiredis only supports the binary-safe Redis protocol, so you can use it with any
Redis version >= 1.2.0.
The library comes with multiple APIs. There is the
*synchronous API*, the *asynchronous API* and the *reply parsing API*.
## UPGRADING
Version 0.9.0 is a major overhaul of hiredis in every aspect. However, upgrading existing
code using hiredis should not be a big pain. The key thing to keep in mind when
upgrading is that hiredis >= 0.9.0 uses a `redisContext*` to keep state, in contrast to
the stateless 0.0.1 that only has a file descriptor to work with.
## Synchronous API
To consume the synchronous API, there are only a few function calls that need to be introduced:
redisContext *redisConnect(const char *ip, int port);
void *redisCommand(redisContext *c, const char *format, ...);
void freeReplyObject(void *reply);
### Connecting
The function `redisConnect` is used to create a so-called `redisContext`. The
context is where Hiredis holds state for a connection. The `redisContext`
struct has an integer `err` field that is non-zero when an the connection is in
an error state. The field `errstr` will contain a string with a description of
the error. More information on errors can be found in the **Errors** section.
After trying to connect to Redis using `redisConnect` you should
check the `err` field to see if establishing the connection was successful:
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c != NULL && c->err) {
printf("Error: %s\n", c->errstr);
// handle error
}
### Sending commands
There are several ways to issue commands to Redis. The first that will be introduced is
`redisCommand`. This function takes a format similar to printf. In the simplest form,
it is used like this:
reply = redisCommand(context, "SET foo bar");
The specifier `%s` interpolates a string in the command, and uses `strlen` to
determine the length of the string:
reply = redisCommand(context, "SET foo %s", value);
When you need to pass binary safe strings in a command, the `%b` specifier can be
used. Together with a pointer to the string, it requires a `size_t` length argument
of the string:
reply = redisCommand(context, "SET foo %b", value, (size_t) valuelen);
Internally, Hiredis splits the command in different arguments and will
convert it to the protocol used to communicate with Redis.
One or more spaces separates arguments, so you can use the specifiers
anywhere in an argument:
reply = redisCommand(context, "SET key:%s %s", myid, value);
### Using replies
The return value of `redisCommand` holds a reply when the command was
successfully executed. When an error occurs, the return value is `NULL` and
the `err` field in the context will be set (see section on **Errors**).
Once an error is returned the context cannot be reused and you should set up
a new connection.
The standard replies that `redisCommand` are of the type `redisReply`. The
`type` field in the `redisReply` should be used to test what kind of reply
was received:
* **`REDIS_REPLY_STATUS`**:
* The command replied with a status reply. The status string can be accessed using `reply->str`.
The length of this string can be accessed using `reply->len`.
* **`REDIS_REPLY_ERROR`**:
* The command replied with an error. The error string can be accessed identical to `REDIS_REPLY_STATUS`.
* **`REDIS_REPLY_INTEGER`**:
* The command replied with an integer. The integer value can be accessed using the
`reply->integer` field of type `long long`.
* **`REDIS_REPLY_NIL`**:
* The command replied with a **nil** object. There is no data to access.
* **`REDIS_REPLY_STRING`**:
* A bulk (string) reply. The value of the reply can be accessed using `reply->str`.
The length of this string can be accessed using `reply->len`.
* **`REDIS_REPLY_ARRAY`**:
* A multi bulk reply. The number of elements in the multi bulk reply is stored in
`reply->elements`. Every element in the multi bulk reply is a `redisReply` object as well
and can be accessed via `reply->element[..index..]`.
Redis may reply with nested arrays but this is fully supported.
Replies should be freed using the `freeReplyObject()` function.
Note that this function will take care of freeing sub-replies objects
contained in arrays and nested arrays, so there is no need for the user to
free the sub replies (it is actually harmful and will corrupt the memory).
**Important:** the current version of hiredis (0.10.0) free's replies when the
asynchronous API is used. This means you should not call `freeReplyObject` when
you use this API. The reply is cleaned up by hiredis _after_ the callback
returns. This behavior will probably change in future releases, so make sure to
keep an eye on the changelog when upgrading (see issue #39).
### Cleaning up
To disconnect and free the context the following function can be used:
void redisFree(redisContext *c);
This function immediately closes the socket and then free's the allocations done in
creating the context.
### Sending commands (cont'd)
Together with `redisCommand`, the function `redisCommandArgv` can be used to issue commands.
It has the following prototype:
void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
It takes the number of arguments `argc`, an array of strings `argv` and the lengths of the
arguments `argvlen`. For convenience, `argvlen` may be set to `NULL` and the function will
use `strlen(3)` on every argument to determine its length. Obviously, when any of the arguments
need to be binary safe, the entire array of lengths `argvlen` should be provided.
The return value has the same semantic as `redisCommand`.
### Pipelining
To explain how Hiredis supports pipelining in a blocking connection, there needs to be
understanding of the internal execution flow.
When any of the functions in the `redisCommand` family is called, Hiredis first formats the
command according to the Redis protocol. The formatted command is then put in the output buffer
of the context. This output buffer is dynamic, so it can hold any number of commands.
After the command is put in the output buffer, `redisGetReply` is called. This function has the
following two execution paths:
1. The input buffer is non-empty:
* Try to parse a single reply from the input buffer and return it
* If no reply could be parsed, continue at *2*
2. The input buffer is empty:
* Write the **entire** output buffer to the socket
* Read from the socket until a single reply could be parsed
The function `redisGetReply` is exported as part of the Hiredis API and can be used when a reply
is expected on the socket. To pipeline commands, the only things that needs to be done is
filling up the output buffer. For this cause, two commands can be used that are identical
to the `redisCommand` family, apart from not returning a reply:
void redisAppendCommand(redisContext *c, const char *format, ...);
void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
After calling either function one or more times, `redisGetReply` can be used to receive the
subsequent replies. The return value
没有合适的资源?快使用搜索试试~ 我知道了~
回合制卡牌战斗游戏服务器架构和业务源码(跨平台,框架和主逻辑C++,登录支付php)
共2120个文件
h:524个
svn-base:277个
cpp:199个
7 下载量 167 浏览量
2023-03-15
10:42:18
上传
评论 4
收藏 90.93MB ZIP 举报
温馨提示
有看不懂代码的可以私聊作者,必回复(代码是作者写的,所以底层框架,主逻辑都明白) 1.回合制卡牌战斗服务器源码,底层库包含常用的工具类,线程库,网络库,数据库操作,主逻辑。 2.服务器架构分为登录支付的web服务器,gateway网关服务器,gameserver游戏逻辑服务器,game server连接mysql数据库,所有的战斗,地图中的任务移动计算都由服务器计算和判断,最后将战斗结果以战报的形式发给客户端来表现。 3.游戏的核心玩法为卡牌收集,九宫格的回合制战斗,包含了装备系统,背包系统,成就系统,排行榜,竞技场,工会,工会战斗,世界boss,活动,签到,任务系统,邮件系统,其他丰富的副本推进玩法,已上线经过验证的项目。 4.单个服务器8G内存,4核CPU的配置可承载两个区,每个区负载六千人同时在线
资源推荐
资源详情
资源评论
收起资源包目录
回合制卡牌战斗游戏服务器架构和业务源码(跨平台,框架和主逻辑C++,登录支付php) (2120个子文件)
libutils.so.0.0.1 709KB
README-5.1 2KB
README-5.1 2KB
configure.ac 5KB
configure.ac 3KB
Makefile.am 21KB
Makefile.am 15KB
Makefile.am 9KB
bill.php.bak 94KB
gsagent.php.bak 6KB
serverinfo.php.bak 3KB
activity.php.bak 209B
announcement.php.bak 195B
extract_includes.bat 4KB
make.bat 48B
toluabind.c 503KB
toluabind.c 503KB
toluabind_default.c 499KB
toluabind_default.c 499KB
sds.c 39KB
sds.c 39KB
hiredis.c 37KB
hiredis.c 37KB
test.c 25KB
async.c 22KB
async.c 22KB
tvariablebind.c 17KB
tolua_map.c 17KB
tolua_map.c 17KB
tarraybind.c 14KB
tolua_event.c 14KB
tolua_event.c 14KB
tolua_is.c 12KB
tolua_is.c 12KB
net.c 12KB
net.c 12KB
dict.c 10KB
dict.c 10KB
tolua_push.c 5KB
tolua_push.c 5KB
tolua.c 4KB
tolua.c 4KB
tolua_to.c 3KB
tolua_to.c 3KB
tmodulebind.c 3KB
tdirectivebind.c 2KB
tvariable.c 779B
tarray.c 632B
tmodule.c 294B
gtest.cbproj 10KB
gtest_unittest.cbproj 9KB
gtest_main.cbproj 8KB
gtest-all.cc 334KB
descriptor.pb.cc 285KB
gtest_unittest.cc 227KB
descriptor.cc 183KB
gtest.cc 174KB
descriptor_unittest.cc 167KB
test_util.cc 166KB
test_util_lite.cc 87KB
parser_unittest.cc 79KB
gtest_pred_impl_unittest.cc 76KB
cpp_message.cc 64KB
extension_set.cc 58KB
python-proto2.cc 58KB
parser.cc 52KB
gtest-death-test.cc 49KB
command_line_interface_unittest.cc 49KB
text_format.cc 49KB
java_message.cc 48KB
generated_message_reflection.cc 48KB
gtest-printers_test.cc 48KB
cpp_unittest.cc 48KB
command_line_interface.cc 48KB
text_format_unittest.cc 44KB
python_generator.cc 43KB
gtest-death-test_test.cc 42KB
strutil.cc 42KB
coded_stream_unittest.cc 40KB
repeated_field_unittest.cc 39KB
wire_format.cc 38KB
gtest-port_test.cc 38KB
plugin.pb.cc 38KB
tokenizer_unittest.cc 37KB
tokenizer.cc 35KB
java_message_field.cc 33KB
wire_format_unittest.cc 33KB
gtest-param-test_test.cc 32KB
gtest_output_test_.cc 32KB
extension_set_unittest.cc 30KB
zero_copy_stream_unittest.cc 28KB
java_primitive_field.cc 27KB
gtest-port.cc 27KB
coded_stream.cc 27KB
extension_set_heavy.cc 26KB
java_string_field.cc 26KB
type_traits_unittest.cc 24KB
gtest-filepath_test.cc 23KB
descriptor_database_unittest.cc 23KB
structurally_valid.cc 22KB
共 2120 条
- 1
- 2
- 3
- 4
- 5
- 6
- 22
资源评论
前网易架构师-高司机
- 粉丝: 8087
- 资源: 200
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Flume进阶-自定义拦截器jar包
- Dubins曲线算法讲解和在运动规划中的使用.pdf
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.dta
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.xlsx
- Reeds+Shepp曲线算法讲解和实现.pdf
- 毕业设计基于SpringBoot+MyBatisPlus+MySQL+Vue的外卖配送信息系统源代码+数据库
- 词向量(Word Embeddings)是自然语言处理(NLP)领域的一种重要技术.txt
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
- 时代的sdddsddsddsd
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功