1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
//! redis-raw-rs is a minimal Redis client library implementation. //! It exposes a general purpose interface to Redis. //! //! The crate is called `redis_raw` and you can depend on it via cargo: //! //! ```ini //! [dependencies] //! redis_raw = "*" //! ``` //! //! If you want to use the git version: //! //! ```ini //! [dependencies] //! redis_raw = { version = "*", git = "git@github.com:aminroosta/redis-raw-rs.git" } //! ``` //! //! # Basic Operation //! //! `redis_raw` exposes two API levels: a low- and a lower-level part! //! The `low-level` part does not expose all the functionality of redis and //! might take some liberties in how it speaks the protocol. The `lower-level` //! part of the API allows you to express any request on the redis level. //! You can fluently switch between both API levels at any point. //! //! ## Connection Handling //! //! For connecting to redis you can use `tokio::net::TcpStream` which can be //! converted to (or from) `RedisConnection`. //! //! ```rust,no_run //! use redis_raw::RedisConnection; //! use tokio::net::TcpStream; //! //! async fn do_something() //! -> std::result::Result<(), Box<dyn std::error::Error>> { //! //! let stream = TcpStream::connect("127.0.0.1:6379").await?; //! let mut con: RedisConnection = stream.into(); //! //! /* do something here */ //! //! Ok(()) //! } //! # fn main() {} //! ``` //! //! ## Executing Lower-Level Commands //! //! To execute lower-level commands you can use the `write()` and `read()` functions //! which allow you to make redis requests and parse redis (RESP) responses. //! These functions correspond to the underlying socket's read and write operations. //! //! The `read()` function parses the RESP response as `redis_raw::Value`. //! `Value` Represents a redis [RESP protcol response](https://redis.io/topics/protocol#resp-protocol-description). //! //! ```rust,no_run //! use redis_raw::{RedisConnection, RedisResult, Value } //! //! fn do_something(con: &mut RedisConnection) -> RedisResult<Value> { //! con.write("set key vvv\r\n").await? //! con.read().await //! } //! ``` //! //! ## Executing Low-Level Commands //! //! The low-level interface is similar. The `command()` function does a //! `write()` and a `read()` and converts the `Value` into requested type. //! //! ```rust,no_run //! use redis_raw::{RedisConnection, RedisResult, Value } //! //! fn do_something(con: &mut RedisConnection) -> RedisResult<String> { //! con.command::<()>("set key value\r\n".to_owned()).await?; //! con.command::<i64>("append key !!!\r\n".to_owned()).await?; //! con.command::<String>("get key\r\n".to_owned()).await //! } //! ``` //! //! Here is another example, to find out the correct result type see [redis docs](https://redis.io/commands). //! //! ```rust,no_run //! use redis_raw::{RedisConnection, RedisResult, Value } //! //! fn do_something(con: &mut RedisConnection) -> RedisResult<Vec<String>> { //! for i in 1..10 { //! con.command::<i64>(format!("zadd myset {} {}\r\n", i, i*i)).await?; //! } //! con.command::<Vec<String>>("zrange myset 0 -1\r\n".to_owned()).await //! } //! ``` //! //! The following return types are supported: //! `()`, `i64`, `String`, `Vec<i64>`, and `Vec<String>` //! pub use crate::connection::RedisConnection; pub use crate::serialize::decode; pub use crate::types::{RedisError, RedisResult, Value}; mod connection; mod serialize; mod types;