Giter Club home page Giter Club logo

redis-rs's Introduction

redis-rs

Rust crates.io Chat

Redis-rs is a high level redis library for Rust. It provides convenient access to all Redis functionality through a very flexible but low-level API. It uses a customizable type conversion trait so that any operation can return results in just the type you are expecting. This makes for a very pleasant development experience.

The crate is called redis and you can depend on it via cargo:

[dependencies]
redis = "0.22.3"

Documentation on the library can be found at docs.rs/redis.

Note: redis-rs requires at least Rust 1.59.

Basic Operation

To open a connection you need to create a client and then to fetch a connection from it. In the future there will be a connection pool for those, currently each connection is separate and not pooled.

Many commands are implemented through the Commands trait but manual command creation is also possible.

extern crate redis;
use redis::Commands;

fn fetch_an_integer() -> redis::RedisResult<isize> {
    // connect to redis
    let client = redis::Client::open("redis://127.0.0.1/")?;
    let mut con = client.get_connection()?;
    // throw away the result, just make sure it does not fail
    let _ : () = con.set("my_key", 42)?;
    // read back the key and return it.  Because the return value
    // from the function is a result for integer this will automatically
    // convert into one.
    con.get("my_key")
}

Async support

To enable asynchronous clients, enable the relevant feature in your Cargo.toml, tokio-comp for tokio users or async-std-comp for async-std users.

# if you use tokio
redis = { version = "0.22.3", features = ["tokio-comp"] }

# if you use async-std
redis = { version = "0.22.3", features = ["async-std-comp"] }

TLS Support

To enable TLS support, you need to use the relevant feature entry in your Cargo.toml.

redis = { version = "0.22.3", features = ["tls"] }

# if you use tokio
redis = { version = "0.22.3", features = ["tokio-native-tls-comp"] }

# if you use async-std
redis = { version = "0.22.3", features = ["async-std-tls-comp"] }

then you should be able to connect to a redis instance using the rediss:// URL scheme:

let client = redis::Client::open("rediss://127.0.0.1/")?;

Cluster Support

Support for Redis Cluster can be enabled by enabling the cluster feature in your Cargo.toml:

redis = { version = "0.22.3", features = [ "cluster"] }

Then you can simply use the ClusterClient, which accepts a list of available nodes. Note that only one node in the cluster needs to be specified when instantiating the client, though you can specify multiple.

use redis::cluster::ClusterClient;
use redis::Commands;

fn fetch_an_integer() -> String {
    let nodes = vec!["redis://127.0.0.1/"];
    let client = ClusterClient::new(nodes).unwrap();
    let mut connection = client.get_connection().unwrap();
    let _: () = connection.set("test", "test_data").unwrap();
    let rv: String = connection.get("test").unwrap();
    return rv;
}

Async Redis Cluster support can be enabled by enabling the cluster-async feature, along with your preferred async runtime, e.g.:

redis = { version = "0.22.3", features = [ "cluster-async", "tokio-std-comp" ] }

use redis::cluster::ClusterClient;
use redis::AsyncCommands;

async fn fetch_an_integer() -> String {
    let nodes = vec!["redis://127.0.0.1/"];
    let client = ClusterClient::new(nodes).unwrap();
    let mut connection = client.get_async_connection().await.unwrap();
    let _: () = connection.set("test", "test_data").await.unwrap();
    let rv: String = connection.get("test").await.unwrap();
    return rv;
}

JSON Support

Support for the RedisJSON Module can be enabled by specifying "json" as a feature in your Cargo.toml.

redis = { version = "0.22.3", features = ["json"] }

Then you can simply import the JsonCommands trait which will add the json commands to all Redis Connections (not to be confused with just Commands which only adds the default commands)

use redis::Client;
use redis::JsonCommands;
use redis::RedisResult;
use redis::ToRedisArgs;

// Result returns Ok(true) if the value was set
// Result returns Err(e) if there was an error with the server itself OR serde_json was unable to serialize the boolean
fn set_json_bool<P: ToRedisArgs>(key: P, path: P, b: bool) -> RedisResult<bool> {
    let client = Client::open("redis://127.0.0.1").unwrap();
    let connection = client.get_connection().unwrap();

    // runs `JSON.SET {key} {path} {b}`
    connection.json_set(key, path, b)?
    
    // you'll need to use serde_json (or some other json lib) to deserialize the results from the bytes
    // It will always be a Vec, if no results were found at the path it'll be an empty Vec
}

Development

To test redis you're going to need to be able to test with the Redis Modules, to do this you must set the following environment variables before running the test script

  • REDIS_RS_REDIS_JSON_PATH = The absolute path to the RedisJSON module (Usually called librejson.so).

If you want to develop on the library there are a few commands provided by the makefile:

To build:

$ make

To test:

$ make test

To run benchmarks:

$ make bench

To build the docs (require nightly compiler, see rust-lang/rust#43781):

$ make docs

We encourage you to run clippy prior to seeking a merge for your work. The lints can be quite strict. Running this on your own workstation can save you time, since Travis CI will fail any build that doesn't satisfy clippy:

$ cargo clippy --all-features --all --tests --examples -- -D clippy::all -D warnings

To run fuzz tests with afl, first install cargo-afl (cargo install -f afl), then run:

$ make fuzz

If the fuzzer finds a crash, in order to reproduce it, run:

$ cd afl/<target>/
$ cargo run --bin reproduce -- out/crashes/<crashfile>

redis-rs's People

Contributors

mitsuhiko avatar marwes avatar badboy avatar jaymell avatar gferon avatar ayosec avatar djc avatar davidbm avatar dbrgn avatar weihanglo avatar evdokimovs avatar utkarshgupta137 avatar arthurlm avatar 0xwof avatar doyshinda avatar jwilm avatar swilcox3 avatar wraithan avatar doumanash avatar terkwood avatar mattcollier avatar emschwartz avatar gavrie avatar theglenn88 avatar nihohit avatar przygienda avatar tsnoam avatar tilblechschmidt avatar yoav-steinberg avatar hadashia avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.