简单ttl懒删除支持

This commit is contained in:
1iaan
2026-04-04 22:31:00 +08:00
parent 6ede44bd80
commit 78519fbfe5
11 changed files with 375 additions and 98 deletions

View File

@@ -4,8 +4,9 @@
#ifndef __KV_STORE_H__
#define __KV_STORE_H__
#include "diskuring/diskuring.h"
#include <stdio.h>
#include "diskuring/diskuring.h"
#include "common/config.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
@@ -121,24 +122,26 @@ int kvs_array_exist(kvs_array_t *inst, char *key);
typedef uint8_t KEY_TYPE; // key
// 固定部分结构
typedef struct {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint32_t key_len;
uint32_t value_len;
} rbtree_node_fixed;
typedef struct {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint64_t expire_at_ms;
uint32_t key_len;
uint32_t value_len;
} rbtree_node_fixed;
// 完整节点结构(用于类型定义,实际内存大小由分配时确定)
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint32_t key_len;
uint32_t value_len;
// 动态数据key[key_len] + value[value_len]
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
uint64_t expire_at_ms;
uint32_t key_len;
uint32_t value_len;
// 动态数据key[key_len] + value[value_len]
// 不存储为结构体成员,通过指针运算访问
} rbtree_node;
@@ -149,13 +152,21 @@ typedef struct _rbtree {
typedef struct _rbtree kvs_rbtree_t;
int kvs_rbtree_create(kvs_rbtree_t *inst);
void kvs_rbtree_destroy(kvs_rbtree_t *inst);
int kvs_rbtree_set(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
void* kvs_rbtree_get(kvs_rbtree_t *inst, const void *key, uint32_t key_len, uint32_t *out_valuelen);
int kvs_rbtree_del(rbtree *inst, const void *key, uint32_t key_len);
int kvs_rbtree_mod(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
int kvs_rbtree_exist(kvs_rbtree_t *inst, const void *key, uint32_t key_len);
int kvs_rbtree_create(kvs_rbtree_t *inst);
void kvs_rbtree_destroy(kvs_rbtree_t *inst);
int kvs_rbtree_set(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
int kvs_rbtree_set_ex(kvs_rbtree_t *inst, const void *key, uint32_t key_len,
const void *value, uint32_t value_len, uint64_t expire_at_ms);
void* kvs_rbtree_get(kvs_rbtree_t *inst, const void *key, uint32_t key_len, uint32_t *out_valuelen);
int kvs_rbtree_del(rbtree *inst, const void *key, uint32_t key_len);
int kvs_rbtree_mod(kvs_rbtree_t *inst, const void *key, uint32_t key_len, const void *value, uint32_t value_len);
int kvs_rbtree_exist(kvs_rbtree_t *inst, const void *key, uint32_t key_len);
rbtree_node *rbtree_search(rbtree *T, const uint8_t *key, uint32_t keylen);
typedef int (*kvs_rbtree_visit_cb)(rbtree_node *node, void *arg);
rbtree_node *rbtree_search_with_visit(rbtree *T, const uint8_t *key, uint32_t keylen,
kvs_rbtree_visit_cb cb, void *arg);
const uint8_t *kvs_rbtree_node_key_ptr(const rbtree_node *node);
const uint8_t *kvs_rbtree_node_value_ptr(const rbtree_node *node);
int kvs_rbtree_save(iouring_ctx_t *uring, kvs_rbtree_t *inst, const char* filename);
int kvs_rbtree_load(kvs_rbtree_t *inst, const char* filename);
@@ -292,13 +303,18 @@ extern kvs_array_t global_array;
extern kvs_rbtree_t global_rbtree;
#endif
#if ENABLE_HASH
extern kvs_hash_t global_hash;
#endif
#endif
#if ENABLE_HASH
extern kvs_hash_t global_hash;
#endif
extern AppConfig global_cfg;
uint64_t kvs_now_ms(void);
int ttl_delete_schedule(const void *key, uint32_t key_len);
int ttl_delete_drain(int budget);
#endif