登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP网盘
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
我设计了个【方案】:比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数据库
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
顾星
2025-6-6 09:48:50
关注
0
粉丝关注
11
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
黎瑞芝
9990
杭环
9988
4
猷咎
9988
5
凶契帽
9988
6
接快背
9988
7
氛疵
9988
8
恐肩
9986
9
虽裘侪
9986
10
里豳朝
9986
查看更多