wedb_embed 0.1.2

Embedded database engine providing Redis-like APIs, built on fjall / 嵌入式数据库引擎,提供类似 Redis 的接口,底层基于 fjall 开发
Documentation
use crate::{
  api::string::conf::{
    DelEx, GetEx, Set, StringLCSArgs, StringLCSResult, StringMSetArgs, StringSetArgs,
  },
  error::Result,
  traits::DbLike,
};

/// 键值与字符串结构操作接口 (Strings / KV)
pub trait Kv: DbLike {
  /// 获取指定键的字符串值(零拷贝元数据反序列化,自动校验 TTL 过期状态,对标 Kvrocks String::Get)
  fn get<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<Vec<u8>>>;
  /// 获取指定键的字符串值及绝对过期毫秒戳
  fn get_with_expire<K: AsRef<[u8]>>(&self, key: K) -> Result<(Option<Vec<u8>>, u64)>;
  /// 设置字符串键值(支持 Set::Ex, Set::Px, Set::Nx, Set::Xx 等全量 Redis 选项)
  fn set<'a, K: AsRef<[u8]>, V: AsRef<[u8]>, O: AsRef<[Set<'a>]>>(
    &self,
    key: K,
    val: V,
    opts: O,
  ) -> Result<Option<Vec<u8>>>;
  /// 支持指定 KeyComposer 的完整参数 String SET 命令
  fn set_args<K: AsRef<[u8]>, V: AsRef<[u8]>>(
    &self,
    key: K,
    val: V,
    args: &StringSetArgs<'_>,
  ) -> Result<Option<Vec<u8>>>;
  fn setex<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<()>;
  fn setnx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<bool>;
  fn setxx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V, expire_ms: u64) -> Result<bool>;
  fn getex<K: AsRef<[u8]>>(&self, key: K, opt: Option<GetEx>) -> Result<Option<Vec<u8>>>;
  fn delex<K: AsRef<[u8]>>(&self, key: K, opt: DelEx<'_>) -> Result<bool>;
  fn getset<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<Option<Vec<u8>>>;
  fn getdel<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<Vec<u8>>>;
  fn incrby_ex<K: AsRef<[u8]>>(
    &self,
    key: K,
    increment: i64,
    expire_ms: u64,
    keep_ttl: bool,
  ) -> Result<i64>;
  fn incr<K: AsRef<[u8]>>(&self, key: K) -> Result<i64>;
  fn decr<K: AsRef<[u8]>>(&self, key: K) -> Result<i64>;
  fn decrby<K: AsRef<[u8]>>(&self, key: K, decrement: i64) -> Result<i64>;
  fn incrby<K: AsRef<[u8]>>(&self, key: K, increment: i64) -> Result<i64>;
  fn incrbyfloat_ex<K: AsRef<[u8]>>(
    &self,
    key: K,
    increment: f64,
    expire_ms: u64,
    keep_ttl: bool,
  ) -> Result<f64>;
  fn incrbyfloat<K: AsRef<[u8]>>(&self, key: K, increment: f64) -> Result<f64>;
  fn strlen<K: AsRef<[u8]>>(&self, key: K) -> Result<usize>;
  fn append<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<usize>;
  fn getrange<K: AsRef<[u8]>>(&self, key: K, start: i64, end: i64) -> Result<Vec<u8>>;
  fn setrange<K: AsRef<[u8]>, V: AsRef<[u8]>>(
    &self,
    key: K,
    offset: usize,
    val: V,
  ) -> Result<usize>;
  fn mget<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<Option<Vec<u8>>>>;
  fn mset<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)]) -> Result<()>;
  fn mset_args<K: AsRef<[u8]>, V: AsRef<[u8]>>(
    &self,
    kvs: &[(K, V)],
    args: StringMSetArgs,
  ) -> Result<bool>;
  /// MSETEX key value [key value ...]
  fn msetex<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)], expire_ms: u64) -> Result<bool>;
  /// MSETNX key value [key value ...]
  fn msetnx<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, kvs: &[(K, V)]) -> Result<bool>;
  /// CAS (Compare And Set):当且仅当 key 当前值与 old_value 匹配时,将其更新为 new_value
  /// 返回值:1 = 成功更新;-1 = key 不存在;0 = 值不匹配(对标 Kvrocks String::CAS)
  fn cas<K: AsRef<[u8]>, V1: AsRef<[u8]>, V2: AsRef<[u8]>>(
    &self,
    key: K,
    old_val: V1,
    new_val: V2,
    expire_ms: u64,
  ) -> Result<i32>;
  /// CAD (Compare And Delete):当且仅当 key 当前值与 val 匹配时删除该 key
  /// 返回值:1 = 成功删除;-1 = key 不存在;0 = 值不匹配(对标 Kvrocks String::CAD)
  fn cad<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, val: V) -> Result<i32>;
  /// 计算指定 key 的哈希摘要(对标 Kvrocks String::Digest)
  fn digest<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<String>>;
  /// 计算两个 key 字符串的最长公共子序列(对标 Kvrocks String::LCS)
  fn lcs<K1: AsRef<[u8]>, K2: AsRef<[u8]>>(
    &self,
    key1: K1,
    key2: K2,
    args: StringLCSArgs,
  ) -> Result<StringLCSResult>;
}