找回密码
 立即注册
首页 业界区 业界 我设计了个【方案】:比redis好10倍的kv库【一统kv】 ...

我设计了个【方案】:比redis好10倍的kv库【一统kv】

顾星 2025-6-6 09:48:50
我设计的redis9.0方案:redis自带中间件
基于ssd磁盘,此我设计了比redis更好的缓存方案。此方案:没有缓存击穿问题。没有缓存雪崩问题。没有缓存污染问题。没有热key问题。
不需要snap和aof。支持任何sql库,sql库不需要带有任何分布式功能。
 基于ssd磁盘,此我设计了比redis更好的缓存方案:在ssd上增加key的lru信息。从ssd到网络存储,到sql。
 特色:数据冷热分层(内存》ssd》hdd》网络存储或其他数据库)
redis 好10倍 一统kv 1.0 博客园
2023-0503,这个方案目前是1.0,方案会持续修补更新,版本号也会变。
世界上为什么没有这种3级数据库?

cpu3级缓存,大家都知道吧。
cpu3级缓存的作用,大家都知道吧。就是分冷热数据,冷数据淘汰。
那么为什么世界上,没有一种【3级,冷热数据自动分层,数据库】?

--------【1级=内存级。lru队列。】--------


内存级。lru队列。队列有容量限制。存储redis兼容的数据类型。队列中的每个键值,都有一个热度值。
客户端来读,已有数据:已有数据直接返回。
客户端来读,但本级无数据:绝不会去读下级队列,而是返回本级没有数据。解决缓存污染问题。
整理队列:只在没有客户端读请求时做。
超出lru队列的冷数据:放入写队列。写后移除。
当内存空余超过多少mb时,读下级队列中,最热的100条数据。把下级热度值一并读取。
内存中,永远只有最热的key。不支持客户端,把key写入内存。
内存中的某些key,有个属性,此属性阻止key写入到ssd磁盘。这样的key断电将丢失。
 
--------【2级=ssd磁盘级。】--------

 
直读请求:
1本级已有数据,返回数据,不写入上级队列。支持限制并发数。
2本级无数据:则放入读取下级队列。定时从下级读取。比如每隔2秒。读取每个数据时,相邻的16k数据一同读取。返回数据,不写入上级队列。
支持对客户端ip,限制并发数。比如,建立一个以客户端ip为key。ip{k1=v1; k2=v2}把已经向下级查找,但未返回的数据,写入到这个key中。
给这个key设置警告容量=50,最大容量=100。则超过100,返回:太频繁的查询。
支持对一批客户端ip,设定限制警告,最大并发数。
写请求:维护一个很小的缓冲区,基本每秒写入。
 
整理队列:
lru队列:队列有容量限制。队列中的每个键值,都有一个热度值。
超出lru队列的冷数据:放入写队列。定时写入下级,写后移除。
几乎必须要有这个功能:从kv到非kv,比如到sql,到存储。
定时计算出本级最热的100个key,算出几个,以供上级读取。

1级2级lru之间,有一个边缘。这个边缘记录在一个变量中。临近此边缘的数据,会被频繁移出,移入。
有一个设定值:
上级写下来的冷数据:标记为最冷-2。
上级写下来的冷数据:标记为最热-100。
ssd中的某些key,有个属性,此属性阻止key写入到下级存储。这样的key断电不会丢失。但迁移时会被丢弃,导致丢失。
通过半夜运行的统计功能插件,实现热key分门别类统计,为数据分片,分集群提供建议。
提供一个管理员命令,手动变更key的热度。

还可以在这个中间件中实现:
1对后端3级库分库分表。
2对后端3级库读写分离。
3对后端3级库:从未分库分表,到分库分表,读写分离转换。
4对后端3级库:从1种分库分表,读写分离,转换到另一种分库分表,读写分离的转换。
5分布式cap,做在此中间件上。不需要后端数据库,带有任何分布式功能。不需要后端数据库,带有主从功能。
问:不需要后端数据库,带有任何分布式功能。为什么?
问:它用什么实现的cap?
答:
中间件自己,通过客户端2步提交,实现了对数据库的cap。
2步提交是一种传统cap的手艺,并不神奇。

6这种库(你叫中间件也可以),支持多种后端nosql,sql库。只需要,用各种语言开发插件即可。
7
* 功能以脚本为接口,采用插件的方式。
* 支持各种语言编写的插件。
* 插件运行后是独立进程。支持各种数据库的客户端。
* 热变更。没有停服的概念。随时启动,停止所有功能。
 
集群:
通过一个标签,如ip,或域名,或项目名,来标识集群peer,最终写入文件名。
对于集群,提供如下管理功能:
1 收。把ssd上的信息,丢弃掉不需要保存的后,从每个集群peer,按照项目备份。
2 放。把备份的恢复到ssd上。
3 整理热key。根据key的热度,在每个peer上平均key。通过这一点,可以达到热key永远平均分布在每个peer。
经过热key重新分布后,在每个peer上的键值对,和项目无法一一对应。即节点1上,有项目125的热key。
没有人能事先知道哪些key热。我的方案通过在ssd上存储key的热度,通过一个每天半夜运行的热key移动程序,达到了热key平均分布在各个集群peer。
--------【3级=网络存储。】--------

 
不分冷热,存有所有数据。
 
--------【3级=任意sql,nosql数据库。数据库不需要带cap,数据库不需要带主从。】--------

 
不分冷热,存有所有数据。与上述3互斥。
 
 
--------【此数据库的特性:】--------

 
1必须有2级存储。即必须使用ssd。
2程序永远只操作redis的kv对象,不关心是否有sql。
后端库sql库不关心kv功能。
因为所有的活,都被这个库中的2级缓存中的,中间件干了。
3对于一个冷读取,至少需要等待3秒:即从3级库hdd磁盘到2级磁盘等2秒,从2级磁盘到1级ssd等1秒。
4对于每个写请求:可选写入:4-1内存表示写入成功,4-2写入ssd表示写入成功,4-3写入hdd磁盘表示成功,4-4写入分布式库表示成功。
4-1会丢数据。丢数据情况为:断电,进程死机,数据被列入队列抛弃。234不会。这其中,最不重要的数据写入4-1,其次大多数写入4-2,剩下所有重要的数据写入4-4。
从4-2,到4-3,或到4-4,只能管理员手动操作。给管理员提供一个命令即可。
5不需要redis的snap,和aof,落盘功能。因为上述234保证了数据安全。
ssd2级磁盘,相当于redis的snap。
hdd3级磁盘,相当于redis的snap的snap。但又不是单纯的snap。这里面有很多种玩法。
5-1 hsnap比ssnap更大。是数据库,这样就不需要任何sql数据库,nosql库。
5-2 hsnap文件的大小,格式,都可以自定义。
5-3 hsnap可以带上域名,服务器ip。这样就成了分布式缓存。如此一来只需要网络上的2个副本,redis3主3从集群也没必要了。

6redis只是缓存,不能当库用。redis不存冷数据,但这个库可以。redis存储空间有限,但这个库可以看做空间无限。
6没有缓存击穿问题。没有缓存雪崩问题。没有缓存污染问题。没有热key问题。

--------【结论】--------


 

内存缓存 ---> ssd硬盘 ---> 网络存储上的文件
内存缓存 ---> ssd硬盘 ---> nosql,sql数据库
您需要登录后才可以回帖 登录 | 立即注册