From 610be4b2d082e7a1727ddaad23cb93d1cb2f0ef6 Mon Sep 17 00:00:00 2001 From: Ali Keles <83716339+akeles85@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:10:34 +0000 Subject: [PATCH] Readme update (#1189) * initial commit * Update README.md * Update README.md * review fixes * Update README.md * license updated * Update README.md * Update README.md * review fixes * fixes --- README.md | 162 ++++++++++++++++++++++++++++++++-- sample_project/CMakeLists.txt | 12 +++ sample_project/client.cpp | 15 ++++ 3 files changed, 180 insertions(+), 9 deletions(-) create mode 100644 sample_project/CMakeLists.txt create mode 100644 sample_project/client.cpp diff --git a/README.md b/README.md index 7e861a02c1..34ec999f85 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,166 @@ -[![codecov](https://codecov.io/gh/hazelcast/hazelcast-cpp-client/branch/master/graph/badge.svg)](https://codecov.io/gh/hazelcast/hazelcast-cpp-client) +

+ + logo + +

Hazelcast C++ Client

+

-# Async Hazelcast C++ Client -Hazelcast is an open-source distributed in-memory data store and computation platform. It provides a wide variety of distributed data structures and concurrency primitives. +

+ + Chat on Slack + + + + Follow on Twitter + + + Chat on Slack + +

+ +--- + +# What is Hazelcast? + +[Hazelcast](https://hazelcast.com/) is a distributed computation and storage platform for consistently low-latency querying, +aggregation and stateful computation against event streams and traditional data sources. It allows you to quickly build +resource-efficient, real-time applications. You can deploy it at any scale from small edge devices to a large cluster of +cloud instances. + +A cluster of Hazelcast nodes share both the data storage and computational load which can dynamically scale up and down. +When you add new nodes to the cluster, the data is automatically rebalanced across the cluster, and currently running +computational tasks (known as jobs) snapshot their state and scale with processing guarantees. + +For more info, check out Hazelcast [repository](https://github.com/hazelcast/hazelcast). + + +# Hazelcast C++ Client hazelcast-cpp-client is the official C++ library API for using the Hazelcast in-memory database platform. It requires C++11 support. -The library can be installed using package managers [Conan](https://github.com/hazelcast/hazelcast-cpp-client/blob/master/Reference_Manual.md#111-conan-users) and [Vcpkg](https://github.com/hazelcast/hazelcast-cpp-client/blob/master/Reference_Manual.md#112-vcpkg-users) or directly [from source code](https://github.com/hazelcast/hazelcast-cpp-client/blob/master/Reference_Manual.md#113-install-from-source-code-using-cmake) using [CMake](https://cmake.org/). -* [Hazelcast Community Slack - C++ Client Channel](https://hazelcastcommunity.slack.com/channels/cpp-client) -* Google Groups: https://groups.google.com/forum/#!forum/hazelcast -* Stack Overflow: https://stackoverflow.com/questions/tagged/hazelcast +## Installation +### Hazelcast +Hazelcast C++ client requires a working Hazelcast cluster to run. This cluster handles the storage and +manipulation of the user data. + +A Hazelcast cluster consists of one or more cluster members. These members generally run on multiple virtual or +physical machines and are connected to each other via the network. Any data put on the cluster is partitioned to +multiple members transparent to the user. It is therefore very easy to scale the system by adding new members as +the data grows. Hazelcast cluster also offers resilience. Should any hardware or software problem causes a crash +to any member, the data on that member is recovered from backups and the cluster continues to operate without any +downtime. + +The quickest way to start a single member cluster for development purposes is to use our +[Docker images](https://hub.docker.com/r/hazelcast/hazelcast/). + +```bash +docker run -p 5701:5701 hazelcast/hazelcast +``` + +This command fetches the latest Hazelcast version. You can find all available tags +[here](https://hub.docker.com/r/hazelcast/hazelcast/tags). + +You can also use our ZIP or TAR [distributions](https://hazelcast.com/open-source-projects/downloads/) +as described [here](Reference_Manual.md#12-starting-hazelcast-cluster). + +### Client + +#### Vcpkg Users +Hazelcast C++ client package is available for [Vcpkg](https://github.com/microsoft/vcpkg) users. The package name is `hazelcast-cpp-client`. + +Please see [getting started](https://github.com/microsoft/vcpkg#getting-started) on how to use Vcpkg package manager with your application. In summary, + +If you use Linux or Mac: + +```sh +git clone https://github.com/microsoft/vcpkg +./vcpkg/bootstrap-vcpkg.sh +./vcpkg/vcpkg install "hazelcast-cpp-client[openssl]" --recurse +``` + +If you use Windows: + +```bat +git clone https://github.com/microsoft/vcpkg +.\vcpkg\bootstrap-vcpkg.bat +.\vcpkg\vcpkg install "hazelcast-cpp-client[openssl]:x64-windows" --recurse +``` +The above code snippet will install `hazelcast-cpp-client` with its `boost` and `openssl` dependencies. + +After the installation, the library is available for usage. For example, if you are using CMake for your builds, you can use the following cmake build command with the `CMAKE_TOOLCHAIN_FILE` cmake option to be the `vcpkg.cmake`. +```bat +cmake -B [build directory] -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake +cmake --build [build directory] +``` + +##### Other Methods + +You can also install the hazelcast-cpp-client with [conan](https://conan.io/) and from source code. You can more information from [Reference Manual](https://github.com/akeles85/hazelcast-cpp-client/blob/readme_update/Reference_Manual.md#11-installing). + +## Overview + +### Usage + +There is an example project in [sample_project](https://github.com/akeles85/hazelcast-cpp-client/tree/readme_update/sample_project) directory. You can run the example as below: + +If you use Linux or Mac: + +```sh +cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake +cmake --build build +./build/client +``` + +If you use Windows: + +```bat +cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]\scripts\buildsystems\vcpkg.cmake && ^ +cmake --build build && ^ +.\build\Debug\client +``` + +The sample code creates a client, the client automatically connects to the cluster. +It creates a map named `personnel_map` and puts the records inside it. +It then gets all the entries from the cluster and prints them. +```c++ +#include +int main() { + auto hz = hazelcast::new_client().get(); // Connects to the cluster + + auto personnel = hz.get_map("personnel_map").get(); + personnel->put("Alice", "IT").get(); + personnel->put("Bob", "IT").get(); + personnel->put("Clark", "IT").get(); + std::cout << "Added IT personnel. Logging all known personnel" << std::endl; + for (const auto &entry : personnel->entry_set().get()) { + std::cout << entry.first << " is in " << entry.second << " department." << std::endl; + } + + return 0; +} +``` + +## Features + +* Distributed, partitioned and queryable in-memory key-value store implementation, called [Map](examples/distributed-map/basic/FillMap.cpp) +* Eventually consistent cache implementation to store a subset of the Map data locally in the memory of the client, called [Near Cache](examples/distributed-map/near-cache) +* Additional data structures and simple messaging constructs such as [Set](examples/distributed-collections/set), [MultiMap](https://github.com/hazelcast/hazelcast-cpp-client/blob/master/examples/distributed-map/multimap/MultimapPut.cpp), [Queue](examples/distributed-collections/blockingqueue), [Topic](examples/distributed-topic) +* Cluster-wide unique ID generator, called [FlakeIdGenerator](https://github.com/hazelcast/hazelcast-cpp-client/tree/master/examples/learning-basics/unique-names) +* Distributed, CRDT based counter, called [PNCounter](examples/distributed-primitives/crdt-pncounter) +* Distributed concurrency primitives from CP Subsystem such as [FencedLock](examples/cp/fenced_lock.cpp), [Semaphore](examples/cp/counting_semphore.cpp), [AtomicLong](examples/cp/atomic_long.cpp) +* Integration with [Viridian](https://viridian.hazelcast.com/) (Hazelcast Cloud) +* Support for serverless and traditional web service architectures with **Unisocket** and **Smart** operation modes +* Ability to listen client lifecycle, cluster state and distributed data structure events +* and [many more](https://hazelcast.com/clients/cplusplus/#client-features). ## Documentation You can find the detailed documentation at the [documentation site](https://hazelcast.github.io/hazelcast-cpp-client/doc-index.html) and the [API reference](https://hazelcast.github.io/hazelcast-cpp-client/api-index.html). -## License +## Copyright -hazelcast-cpp-client library is an open source project using the [Apache 2 License](https://github.com/hazelcast/hazelcast-cpp-client/blob/master/LICENSE). +Copyright (c) 2008-2023, Hazelcast, Inc. All Rights Reserved. +Visit [www.hazelcast.com](http://www.hazelcast.com) for more information. diff --git a/sample_project/CMakeLists.txt b/sample_project/CMakeLists.txt new file mode 100644 index 0000000000..6f62e8496c --- /dev/null +++ b/sample_project/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.10) + +project(HazelcastClientSample) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(hazelcast-cpp-client CONFIG REQUIRED) + + +add_executable(client client.cpp) +target_link_libraries(client PRIVATE hazelcast-cpp-client::hazelcast-cpp-client) \ No newline at end of file diff --git a/sample_project/client.cpp b/sample_project/client.cpp new file mode 100644 index 0000000000..b6c855fbd8 --- /dev/null +++ b/sample_project/client.cpp @@ -0,0 +1,15 @@ +#include +int main() { + auto hz = hazelcast::new_client().get(); // Connects to the cluster + + auto personel = hz.get_map("personel_map").get(); + personel->put("Alice", "IT").get(); + personel->put("Bob", "IT").get(); + personel->put("Clark", "IT").get(); + std::cout << "Added IT personel. Logging all known personel" << std::endl; + for (const auto &entry : personel->entry_set().get()) { + std::cout << entry.first << " is in " << entry.second << " department." << std::endl; + } + + return 0; +} \ No newline at end of file