Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
9ab996c
New version
Jan 30, 2015
a4e325d
Update README.md
nekipelov Jan 30, 2015
cfae0db
Support for binary arguments
Mar 25, 2015
baad1fe
Merge branch 'unstable' of https://github.com/nekipelov/redisclient i…
Mar 25, 2015
f73307d
name shadowing fix (no bugs just less warnings)
burner Apr 2, 2015
cbc9c06
Merge pull request #8 from burner/name_shadowing_fix
nekipelov Apr 2, 2015
989062c
another name clash and some const
burner Apr 7, 2015
9dea257
Merge pull request #9 from burner/name_clash
nekipelov Apr 9, 2015
72d0ee3
simplified example
Apr 14, 2015
f7bedec
new example
Apr 14, 2015
b77748d
Shadow warnings
Apr 14, 2015
524f6f3
CMake project files
Apr 14, 2015
cfcca93
Update .travis.yml
nekipelov Apr 14, 2015
17dadc9
Update .travis.yml
nekipelov Apr 14, 2015
aa8356a
Fix compilation error with boost 1.46
Apr 15, 2015
f4d4df9
Merge branch 'unstable' of github.com:nekipelov/redisclient into unst…
Apr 15, 2015
57e3842
Update .travis.yml
nekipelov Apr 15, 2015
898328c
Update .travis.yml
nekipelov Apr 15, 2015
3a720a2
Update .travis.yml
nekipelov Apr 15, 2015
dc18d5e
result name clash
burner Apr 14, 2015
93a96a3
Merge pull request #10 from burner/result_name_clash
nekipelov Apr 27, 2015
2b37be0
README.md updated
Apr 30, 2015
edb3952
Merge branch 'unstable' of github.com:nekipelov/redisclient into unst…
Apr 30, 2015
54549cf
isOk and isError methods for RedisValue
Apr 30, 2015
9e57c46
tcp_nodelay for sync client
Apr 30, 2015
9fb4de0
New version: 0.4.0
Apr 30, 2015
064dbed
Fix issue #11
Jun 4, 2015
8f7be0a
added project files
Feb 18, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Qt Creator files
*.o
*.so
examples/example[1-4]
tests/parsertest
tests/parsertest
/redisclient.pro.user
18 changes: 15 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,19 @@ language: cpp
compiler:
- gcc

before_script:
- sudo apt-get install -qq libboost-dev libboost-test-dev libboost-system-dev
before_install:
- if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
- sudo apt-get update -qq

install:
- if [ "$CXX" == "g++" ]; then sudo apt-get install -qq g++-4.8; fi
- if [ "$CXX" == "g++" ]; then sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50; fi
- sudo apt-get install -qq libboost1.48-dev libboost-test1.48-dev libboost-system1.48-dev
- dpkg -l "libboost*" | sort

script:
- mkdir build && cd build
- cmake ..
- make
- make test

script: make && make test && make -C examples example1
58 changes: 58 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
cmake_minimum_required(VERSION 2.6)

PROJECT(RedisClient)

FIND_PACKAGE(Boost COMPONENTS unit_test_framework system REQUIRED)

SET(CMAKE_CXX_FLAGS "-W -Wall -Wextra -Wshadow -fPIC -pthread")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -DDEBUG ")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

SET(SOURCES
src/redisclient/impl/redisvalue.cpp
src/redisclient/impl/redissyncclient.cpp
src/redisclient/impl/redisparser.cpp
src/redisclient/impl/redisclientimpl.cpp
src/redisclient/impl/redisasyncclient.cpp
)

SET(HEADERS
src/redisclient/config.h
src/redisclient/version.h
src/redisclient/redisvalue.h
src/redisclient/redissyncclient.h
src/redisclient/redisparser.h
src/redisclient/redisclient.h
src/redisclient/redisbuffer.h
src/redisclient/redisasyncclient.h
src/redisclient/impl/redisclientimpl.h
)

INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/src
${Boost_INCLUDE_DIRS}
)

ADD_EXECUTABLE(parsertest tests/parsertest.cpp ${SOURCES} ${HEADERS})
ADD_LIBRARY(redisclient STATIC ${HEADERS} ${SOURCES})

TARGET_LINK_LIBRARIES(parsertest
${Boost_LIBRARIES}
)

TARGET_LINK_LIBRARIES(redisclient
${Boost_LIBRARIES}
)

INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/src DESTINATION include)

ADD_CUSTOM_TARGET(test)
ADD_CUSTOM_COMMAND(TARGET test
POST_BUILD
COMMAND ./parsertest
COMMENT "Run tests"
VERBATIM
)

ADD_SUBDIRECTORY(examples)
28 changes: 0 additions & 28 deletions Makefile

This file was deleted.

153 changes: 114 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,90 +1,165 @@
redisclient
===========

Build status: [![Build Status](https://travis-ci.org/nekipelov/redisclient.svg?branch=master)](https://travis-ci.org/nekipelov/redisclient)
Build status: [![Build Status](https://travis-ci.org/nekipelov/redisclient.svg?branch=unstable)](https://travis-ci.org/nekipelov/redisclient)

Current version: 0.3.2
Current version: 0.4.1

Boost.asio based Redis-client header-only library. Simple but powerfull.

Get/set example:

#include "redisclient.h"

static const std::string redisKey = "unique-redis-key-example";
static const std::string redisValue = "unique-redis-value";
#include <redisclient/redissyncclient.h>

int main(int, char **)
{
const char *address = "127.0.0.1";
const int port = 6379;
boost::asio::ip::address address = boost::asio::ip::address::from_string("127.0.0.1");
const unsigned short port = 6379;

boost::asio::io_service ioService;
RedisClient redis(ioService);
RedisSyncClient redis(ioService);
std::string errmsg;

if( !redis.connect(address, port, errmsg) )
{
std::cerr << "Can't connect to redis: " << errmsg << std::endl;
return EXIT_FAILURE;
}

RedisValue result;

result = redis.command("SET", "key", "value");

if( result.isError() )
{
std::cerr << "SET error: " << result.toString() << "\n";
return EXIT_FAILURE;
}

result = redis.command("GET", "key");

if( !redis.connect(address, port) )
if( result.isOk() )
{
std::cerr << "Can't connecto to redis" << std::endl;
std::cout << "GET " << key << ": " << result.toString() << "\n";
return EXIT_SUCCESS;
}
else
{
std::cerr << "GET error: " << result.toString() << "\n";
return EXIT_FAILURE;
}
}

Async get/set example:

#include <redisclient/redisasyncclient.h>

redis.command("SET", redisKey, redisValue, [&](const Value &v) {
std::cerr << "SET: " << v.toString() << std::endl;
static const std::string redisKey = "unique-redis-key-example";
static const std::string redisValue = "unique-redis-value";

redis.command("GET", redisKey, [&](const Value &v) {
std::cerr << "GET: " << v.toString() << std::endl;
void handleConnected(boost::asio::io_service &ioService, RedisAsyncClient &redis,
bool ok, const std::string &errmsg)
{
if( ok )
{
redis.command("SET", redisKey, redisValue, [&](const RedisValue &v) {
std::cerr << "SET: " << v.toString() << std::endl;

redis.command("GET", redisKey, [&](const RedisValue &v) {
std::cerr << "GET: " << v.toString() << std::endl;

redis.command("DEL", redisKey, [&](const Value &v) {
ioService.stop();
redis.command("DEL", redisKey, [&](const RedisValue &) {
ioService.stop();
});
});
});
});
}
else
{
std::cerr << "Can't connect to redis: " << errmsg << std::endl;
}
}

int main(int, char **)
{
boost::asio::ip::address address = boost::asio::ip::address::from_string("127.0.0.1");
const unsigned short port = 6379;

boost::asio::io_service ioService;
RedisAsyncClient redis(ioService);

redis.asyncConnect(address, port,
boost::bind(&handleConnected, boost::ref(ioService), boost::ref(redis), _1, _2));

ioService.run();

return 0;
}



Publish/subscribe example:

#include "redisclient.h"
#include <redisclient/redisasyncclient.h>

static const std::string channelName = "unique-redis-channel-name-example";

int main(int, char **)
void subscribeHandler(boost::asio::io_service &ioService, const std::vector<char> &buf)
{
const char *address = "127.0.0.1";
const int port = 6379;
std::string msg(buf.begin(), buf.end());

boost::asio::io_service ioService;
RedisClient publisher(ioService);
RedisClient subscriber(ioService);
if( msg == "stop" )
ioService.stop();
}

if( !publisher.connect(address, port) || !subscriber.connect(address, port) )
{
std::cerr << "Can't connecto to redis" << std::endl;
return EXIT_FAILURE;
}
void publishHandler(RedisAsyncClient &publisher, const RedisValue &)
{
publisher.publish(channelName, "First hello", [&](const RedisValue &) {
publisher.publish(channelName, "Last hello", [&](const RedisValue &) {
publisher.publish(channelName, "stop");
});
});
}

subscriber.subscribe(channelName, [&](const std::string &msg) {
std::cerr << "Message: " << msg << std::endl;
int main(int, char **)
{
boost::asio::ip::address address = boost::asio::ip::address::from_string("127.0.0.1");
const unsigned short port = 6379;

if( msg == "stop" )
ioService.stop();
});
boost::asio::io_service ioService;
RedisAsyncClient publisher(ioService);
RedisAsyncClient subscriber(ioService);

publisher.publish(channelName, "First hello", [&](const Value &) {
publisher.publish(channelName, "Last hello", [&](const Value &) {
publisher.publish(channelName, "stop");
});
publisher.asyncConnect(address, port, [&](bool status, const std::string &err)
{
if( !status )
{
std::cerr << "Can't connect to to redis" << err << std::endl;
}
else
{
subscriber.asyncConnect(address, port, [&](bool status, const std::string &err)
{
if( !status )
{
std::cerr << "Can't connect to to redis" << err << std::endl;
}
else
{
subscriber.subscribe(channelName,
boost::bind(&subscribeHandler, boost::ref(ioService), _1),
boost::bind(&publishHandler, boost::ref(publisher), _1));
}
});
}
});

ioService.run();

return 0;
}


Also you can build the library like a shared library. Just use
-DREDIS_CLIENT_DYNLIB and -DREDIS_CLIENT_BUILD to build redisclient
and -DREDIS_CLIENT_DYNLIB to build your project.
43 changes: 43 additions & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
cmake_minimum_required(VERSION 2.6)

FIND_PACKAGE(Boost COMPONENTS system REQUIRED)

SET(CMAKE_CXX_FLAGS "-W -Wall -Wextra -fPIC -pthread -std=c++11")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -DDEBUG ")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

SET(REDISCLIENT_SOURCES
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redisvalue.cpp
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redissyncclient.cpp
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redisparser.cpp
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redisclientimpl.cpp
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redisasyncclient.cpp
${CMAKE_SOURCE_DIR}/src/redisclient/config.h
${CMAKE_SOURCE_DIR}/src/redisclient/version.h
${CMAKE_SOURCE_DIR}/src/redisclient/redisvalue.h
${CMAKE_SOURCE_DIR}/src/redisclient/redissyncclient.h
${CMAKE_SOURCE_DIR}/src/redisclient/redisparser.h
${CMAKE_SOURCE_DIR}/src/redisclient/redisclient.h
${CMAKE_SOURCE_DIR}/src/redisclient/redisbuffer.h
${CMAKE_SOURCE_DIR}/src/redisclient/redisasyncclient.h
${CMAKE_SOURCE_DIR}/src/redisclient/impl/redisclientimpl.h
)

INCLUDE_DIRECTORIES(
${Boost_INCLUDE_DIRS}
${CMAKE_SOURCE_DIR}/src/
)

SET(EXAMPLES
async_pubsub2.cpp
async_pubsub.cpp
async_set_get2.cpp
async_set_get.cpp
sync_set_get.cpp
)

FOREACH(EXAMPLE ${EXAMPLES})
GET_FILENAME_COMPONENT(EXECUTABLE ${EXAMPLE} NAME_WE)
ADD_EXECUTABLE(${EXECUTABLE} ${EXAMPLE} ${REDISCLIENT_SOURCES})
TARGET_LINK_LIBRARIES(${EXECUTABLE} ${Boost_LIBRARIES})
ENDFOREACH(EXAMPLE)
Loading