wedb_embed 0.1.2

Embedded database engine providing Redis-like APIs, built on fjall / 嵌入式数据库引擎,提供类似 Redis 的接口,底层基于 fjall 开发
Documentation
use rapidhash::RapidHashMap as HashMap;

use crate::{
  api::zset::{
    ZScanResult, ZSetKeyMemberScore, ZSetMemberScore,
    conf::{Aggregate, RangeLexSpec, RangeScoreSpec, ZAdd, ZRangeSpec},
  },
  error::Result,
  traits::DbLike,
};

/// 有序集合结构操作接口 (Sorted Sets)
pub trait ZSet: DbLike {
  fn ziter<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_rev<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_members<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_members_rev<K: AsRef<[u8]>, F>(&self, key: K, f: F) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_range_byscore<K: AsRef<[u8]>, F>(
    &self,
    key: K,
    spec: &RangeScoreSpec,
    f: F,
  ) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_range_byscore_rev<K: AsRef<[u8]>, F>(
    &self,
    key: K,
    spec: &RangeScoreSpec,
    f: F,
  ) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_range_bylex<K: AsRef<[u8]>, F>(&self, key: K, spec: &RangeLexSpec, f: F) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  fn ziter_range_bylex_rev<K: AsRef<[u8]>, F>(
    &self,
    key: K,
    spec: &RangeLexSpec,
    f: F,
  ) -> Result<()>
  where
    F: FnMut(&[u8], f64) -> bool;
  /// 获取有序集合全部成员与分数(按分数由小到大排序,同分数按 member 字典序升序)
  fn zget_all<K: AsRef<[u8]>>(&self, key: K) -> Result<Vec<ZSetMemberScore>>;
  fn zadd<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    score_members: &[(f64, M)],
    conf_li: impl AsRef<[ZAdd]>,
  ) -> Result<usize>;
  fn zrem<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, members: &[M]) -> Result<usize>;
  fn zscore<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<f64>>;
  /// ZMSCORE key member [member ...] (单次元数据检查与缓冲池点查,极致性能)
  fn zmscore<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    members: &[M],
  ) -> Result<Vec<Option<f64>>>;
  /// ZMGET key member [member ...] (对标 Apache Kvrocks ZSet::MGet)
  fn zmget<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    members: &[M],
  ) -> Result<HashMap<Vec<u8>, f64>>;
  fn zcard<K: AsRef<[u8]>>(&self, key: K) -> Result<u64>;
  fn zcount<K: AsRef<[u8]>>(&self, key: K, spec: &RangeScoreSpec) -> Result<u64>;
  /// ZLEXCOUNT key min max(基于字典序精准范围遍历与计数,零全量慢扫)
  fn zlexcount<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<u64>;
  fn zincrby<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    increment: f64,
    member: M,
  ) -> Result<f64>;
  fn zrank<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<u64>>;
  /// ZRANK key member [WITHSCORE] (对标 Redis 7.2 / Kvrocks ZSet::Rank,单遍迭代获取排名与分数)
  fn zrank_with_score<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    member: M,
  ) -> Result<Option<(u64, f64)>>;
  fn zrevrank<K: AsRef<[u8]>, M: AsRef<[u8]>>(&self, key: K, member: M) -> Result<Option<u64>>;
  /// ZREVRANK key member [WITHSCORE]
  fn zrevrank_with_score<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    member: M,
  ) -> Result<Option<(u64, f64)>>;
  fn zrange<K: AsRef<[u8]>>(&self, key: K, start: i64, stop: i64) -> Result<Vec<ZSetMemberScore>>;
  /// ZREVRANGE key start stop (基于逆序流式截取,达到上限即终止,零冗余内存分配)
  fn zrevrange<K: AsRef<[u8]>>(
    &self,
    key: K,
    start: i64,
    stop: i64,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZRANGEBYSCORE key min max [LIMIT offset count](基于保序十六进制分数前缀精准范围遍历,零全量慢扫)
  fn zrangebyscore<K: AsRef<[u8]>>(
    &self,
    key: K,
    spec: &RangeScoreSpec,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZREVRANGEBYSCORE key max min [LIMIT offset count](基于保序十六进制分数前缀逆序精准范围遍历,零全量慢扫)
  fn zrevrangebyscore<K: AsRef<[u8]>>(
    &self,
    key: K,
    spec: &RangeScoreSpec,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZRANGEBYLEX key min max [LIMIT offset count](基于字典序精准范围遍历,零全量慢扫)
  fn zrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<Vec<Vec<u8>>>;
  /// ZRANGEBYLEX key min max [LIMIT offset count](返回 member 与 score,基于字典序精准范围遍历)
  fn zrangebylex_with_scores<K: AsRef<[u8]>>(
    &self,
    key: K,
    spec: &RangeLexSpec,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZREVRANGEBYLEX key max min [LIMIT offset count](基于字典序逆序精准范围遍历,零全量慢扫)
  fn zrevrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<Vec<Vec<u8>>>;
  /// ZREVRANGEBYLEX key max min [LIMIT offset count](逆序返回 member 与 score,基于字典序逆序精准范围遍历)
  fn zrevrangebylex_with_scores<K: AsRef<[u8]>>(
    &self,
    key: K,
    spec: &RangeLexSpec,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// 统一 ZRANGE 范围查询(支持 BYSCORE / BYLEX / REV / LIMIT / WITHSCORES,对标 Redis 6.2+ / Kvrocks)
  fn zrange_spec<K: AsRef<[u8]>>(
    &self,
    key: K,
    start_or_min: &[u8],
    stop_or_max: &[u8],
    spec: &ZRangeSpec,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZPOPMIN key [count](单批次读取并删除极小值,原子高效)
  fn zpopmin<K: AsRef<[u8]>>(&self, key: K, count: usize) -> Result<Vec<ZSetMemberScore>>;
  /// ZPOPMAX key [count](基于逆序单遍流式精准截取,零冗余内存分配,原子高效)
  fn zpopmax<K: AsRef<[u8]>>(&self, key: K, count: usize) -> Result<Vec<ZSetMemberScore>>;
  /// BZPOPMIN key [key ...] (检查多键并弹出第一个非空的最小值)
  fn bzpopmin<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Option<ZSetKeyMemberScore>>;
  /// BZPOPMAX key [key ...] (检查多键并弹出第一个非空的最大值)
  fn bzpopmax<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Option<ZSetKeyMemberScore>>;
  /// ZRANDMEMBER key [count] (对标 Apache Kvrocks ExtractRandMemberFromSet)
  fn zrandmember<K: AsRef<[u8]>>(&self, key: K, count: i64) -> Result<Vec<ZSetMemberScore>>;
  /// ZREMRANGEBYRANK key start stop (单遍流式扫描与删除,零二次点查,对标 Kvrocks RangeByRank with_deletion)
  fn zremrangebyrank<K: AsRef<[u8]>>(&self, key: K, start: i64, stop: i64) -> Result<usize>;
  /// ZREMRANGEBYSCORE key min max (基于保序十六进制分数前缀精准范围遍历与删除,零二次点查,对标 Kvrocks RangeByScore with_deletion)
  fn zremrangebyscore<K: AsRef<[u8]>>(&self, key: K, spec: &RangeScoreSpec) -> Result<usize>;
  /// ZREMRANGEBYLEX key min max (基于字典序精准范围遍历与删除,零二次点查,对标 Kvrocks RangeByLex with_deletion)
  fn zremrangebylex<K: AsRef<[u8]>>(&self, key: K, spec: &RangeLexSpec) -> Result<usize>;
  /// 覆盖写入有序集合数据(对标 Apache Kvrocks ZSet::Overwrite)
  fn overwrite_zset<K: AsRef<[u8]>, M: AsRef<[u8]>>(
    &self,
    key: K,
    score_members: &[(M, f64)],
  ) -> Result<usize>;
  /// ZDIFF numkeys key [key ...] [WITHSCORES]
  fn zdiff<K: AsRef<[u8]>>(&self, keys: &[K]) -> Result<Vec<ZSetMemberScore>>;
  /// ZDIFFSTORE destination numkeys key [key ...]
  fn zdiffstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(&self, dst: D, keys: &[K]) -> Result<usize>;
  /// ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
  fn zunion<K: AsRef<[u8]>>(
    &self,
    keys_weights: &[(K, f64)],
    aggregate: Aggregate,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
  fn zunionstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(
    &self,
    dst: D,
    keys_weights: &[(K, f64)],
    aggregate: Aggregate,
  ) -> Result<usize>;
  /// ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
  fn zinter<K: AsRef<[u8]>>(
    &self,
    keys_weights: &[(K, f64)],
    aggregate: Aggregate,
  ) -> Result<Vec<ZSetMemberScore>>;
  /// ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
  fn zinterstore<D: AsRef<[u8]>, K: AsRef<[u8]>>(
    &self,
    dst: D,
    keys_weights: &[(K, f64)],
    aggregate: Aggregate,
  ) -> Result<usize>;
  /// ZINTERCARD numkeys key [key ...] [LIMIT limit](基于基数升序优先扫描与 O(1) 存在性探针,提前中断)
  fn zintercard<K: AsRef<[u8]>>(&self, keys: &[K], limit: usize) -> Result<usize>;
  /// ZSCAN key cursor [MATCH pattern] [COUNT count] (流式分页扫描,按 member 字典序遍历,低内存占用)
  fn zscan<K: AsRef<[u8]>>(
    &self,
    key: K,
    cursor: u64,
    pattern: Option<&[u8]>,
    count: Option<usize>,
  ) -> Result<ZScanResult>;
}