既生 Redis 何生 LevelDB ?

redis zset 基于leveldb redis zset 阅读详情

了解 Redis 的同学都知道它是一个纯内存的数据库,凭借优秀的并发和易用性打下了互联网项的半壁江山。Redis 之所以高性能是因为它的纯内存访问特性,而这也成了它致命的弱点 —— 内存的成本太高。所以在绝大多数场合,它比较适合用来做缓存,长期不被访问的冷数据被淘汰掉,只有热的数据缓存在内存中,这样就不会浪费太多昂贵的内存空间。

但是 Redis 的诱惑太大了,用它来做持久存储使用起来太方便了。要是内存的价格低廉,真恨不得把所有的数据都堆到 Redis 中,但是技术的选择总是要考虑到现实世界的成本问题。那如何才能享受到 Redis 作为持久层易用性的同时还可以节省内存成本呢?

LevelDB 来了!

640?wx_fmt=png

它是 Google 开源的 NOSQL 存储引擎库,是现代分布式存储领域的一枚原子弹。在它的基础之上,Facebook 开发出了另一个 NOSQL 存储引擎库 RocksDB,沿用了 LevelDB 的先进技术架构的同时还解决了 LevelDB 的一些短板。你可以将 RocksDB 比喻成氢弹,它比 LevelDB 的威力更大一些。现代开源市场上有很多数据库都在使用 RocksDB 作为底层存储引擎,比如大名鼎鼎的 TiDB。

640?wx_fmt=png

Redis 缓存有什么问题?

当我们将 Redis 拿来做缓存用时,背后肯定还有一个持久层数据库记录了全量的冷热数据。Redis 和持久层数据库之间的数据一致性是由应用程序自己来控制的。应用程序会优先去缓存中获取数据,当缓存中没有数据时,应用程序需要从持久层加载数据,然后再放进缓存中。当数据更新发生时,需要将缓存置为失效。

function getUser(String userId) User {
  User user = redis.get(userId);
  if user == null {
    user = db.get(userId);
    if user != null {
      redis.set(userId, user);
    }
  }
  return user;
}

function updateUser(String userId, User user) {
  db.update(userId, user);
  redis.expire(userId);
}

640?wx_fmt=png

严格来说我们还需要仔细考虑缓存一致性问题,比如在 updateUser 方法中,数据库正确执行了更新,但是缓存 redis 因为网络抖动等原因置为失效没有成功,那么缓存中的数据就成了过期数据。如果你将设置缓存和更新持久存的先后顺序反过来,也还是会有其它问题,这个读者可以自行思考一下。

640?wx_fmt=png


在多进程高并发场合也会导致缓存不一致,比如一个进程对某个 userId 调用 getUser() 方法,因为缓存里没有,它需要从数据库里加载。结果刚刚加载出来,正准备要设置缓存,这时候发生了内存 fullgc 代码暂停了一会,而正在此时另一个进程调用了 updateUser 方法更新了数据库,将缓存置为失效(其实缓存里本来就没有数据)。然后前面那个进程终于 fullgc 结束要开始设置缓存了,这时候进缓存的就是过期的数据。

LevelDB 是如何解决的?

LevelDB 将 Redis 缓存和持久层合二为一,一次性帮你搞定缓存和持久层。有了 LevelDB,你的代码可以简化成下面这样

function getUser(String userId) User {
  return leveldb.get(userId);
}

function updateUser(String userId, User user) {
  leveldb.set(userId, user);
}

LevelDB 具体是什么?

前面我们说道它是一个 NOSQL 存储引擎,它和 Redis 不是一个概念。Redis 是一个完备的数据库,而 LevelDB 它只是一个引擎。如果将数据库必须成一辆高级跑车,那么存储引擎就是它的发动机,是核心是心脏。有了这个发动机,我们再给它包装上一系列的配件和装饰,就可以成为数据库。不过也不要小瞧了配件和装饰,做到极致那也是非常困难,将 LevelDB 包装成一个简单易用的数据库需要加上太多太多精致的配件。LevelDB 和 RocksDB 出来这么多年,能够在它的基础上做出非常一个完备的生产级数据库寥寥无几。

在使用 LevelDB 时,我们还可以将它看成一个 Key/Value 内存数据库。它提供了基础的 Get/Set API,我们在代码里可以通过这个 API 来读写数据。你还可以将它看成一个无限大小的高级 HashMap,我们可以往里面塞入无限条 Key/Value 数据,只要磁盘可以装下。

正是因为它只能算作一个内存数据库,它里面装的数据无法跨进程跨机器共享。在分布式领域,LevelDB 要如何大显身手呢?

640?wx_fmt=png


这就需要靠包装技术了,在 LevelDB 内存数据库的基础上包装一层网络 API。当不同机器上不同的进程要来访问它时,都统一走网络 API 接口。这样就形成了一个简易的数据库。如果在网络层我们使用 Redis 协议来包装,那么使用 Redis 的客户端就可以读写这个数据库了。

640?wx_fmt=png

如果要考虑数据库的高可用性,我们在上面这个单机数据库的基础上再加上主从复制功能就可以变身成为一个主从结构的分布式 NOSQL 数据库。在主从数据库前面加一层转发代理(负载均衡器如 LVS、F5 等),就可以实现主从的实时切换。

如果你需要的数据容量特别大以至于单个机器的硬盘都容不下,这时候就需要数据分片机制将整个数据库的数据分散到多台机器上,每台机器只负责一部分数据的读写工作。数据分片的方案非常多,可以像 Codis 那样通过转发代理来分片,也可以像 Redis-Cluster 那样使用客户端转发机制来分片,还可以使用 TiDB 的 Raft 分布式一致性算法来分组管理分片。最简单最易于理解的还是要数 Codis 的转发代理分片。

640?wx_fmt=png


当数据量继续增长需要新增节点时,就必须将老节点上的数据部分迁移到新节点上,管理数据的均衡和迁移的又是一个新的高级配件 —— 数据均衡器。

看到这里读者应该可以从整体上理解了分布式数据库中 LevelDB 所处的地位。下一节我们开始全面了解一下 LevelDB 的内存数据库特性。

640?wx_fmt=png

订阅「码洞」公众号,阅读更多 LevelDB 相关内容

华为云企业级Redis:从SSDB、LevelDB、RocksDB迁移到高斯Redis 【摘要】 云数据库GaussDB(for Redis)作为华为云旗下企业级Redis,致力于为客户提供稳定可靠、超高并发,且能够极速弹性扩容的KV存储服务。 GaussDB(for Redis)是一款基于计算存储分离架构,兼容Redis生态的云原生NoSQL数据库,基于共享存储池的多副本强一致机制,支持持久化存储。在保障数据库的高兼容、搞性价比、高可靠、无损扩容等特点的同时,GaussDB(for Redis)团队针对不同的数据库产品,为用户提供了多种数据迁移方案,本期将详细介绍SSDB、LevelDB和R 阅读详情

相关推荐

redis-storage:把leveldb嵌入到redis.实现真正的数据持久存储

最新版本 redis:2.6.14 leveldb:1.10.0 snappy:1.1.0 更新说明 新增配置项: rl:ttl 0 ( 单位:秒,大于0时会强制设置redis里key的过期时间,仅对rl系列命令有效) rl:ttlcheck 0 (当key的ttl在小于此值时被读取到,则过期期间重设置为rl:ttl ) rl系列命令:(同时操作redis和leveldb系列命令) =======string数据操作====== rl_get key (从redis或leveldb取值, 优先顺序:redis > leveldb) rl_getset key (返回同rl_get, 当leveldb有值,redis无值时,会回写到redis) rl_mget k1 k2 k3 (取redis和leveldb的并集,优先级:

【数据库】Redis和RocksDB、levelDB的区别

区别 Redis 是一个服务,独立的进程,用户的程序需要与它建立连接才能向它发请求,读写数据。 RocksDB 和LevelDB 是一个库,嵌入在用户的程序中,用户程序直接调用接口读写数据。 Redis 是一个远程内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(就 CPU 而言)。 Redis 集群是可扩展的(就 CPU 而言)。Roc...

小鱼菜鸟的博客 1万+

RedisLV:利用LevelDB实时保存数据的Redis服务

why save方式保存数据耗内存 aof方式保存数据恢复慢 RedisLV优点 数据落地不会带来额外的内存消耗 服务启动快 RedisLV缺点 redis更改数据操作同时更改leveldb, 导致损耗部分性能 Redis命令支持状况(yes: 支持; no: 不支持) Key DEL yes DUMP yes EXISTS yes EXPIRE no EXPIREAT no KEYS yes MIGRATE no MOVE no OBJECT yes PERSIST no PEXPIRE no PEXPIREAT no PTTL no RANDOMKEY yes RENAME no RENAMENX no RESTORE no SORT yes TTL no TYPE yes SCAN yes Hash HDEL yes HEXISTS yes HGET yes HGETALL yes

Redis-Leveldb: 一个高效、可靠的数据存储解决方案

Redis-Leveldb: 一个高效、可靠的数据存储解决方案 Redis 和 LevelDB 都是广泛使用的数据存储系统,而 Redis-Leveldb 是一个将两者结合的项目。它基于开源的 Redis 源码,并在其中集成了 LevelDB 的持久化功能。这使得 Redis-Leveldb 成为一个既拥有 Redis 的高性能内存缓存特性,又具有 LevelDB 的稳定持久化特性的强大数据库。 ...

gitblog_00020的博客 710

6种流行NoSql数据库性能对比和适用场景

通过一段时间的整理,完成了6种常用流行的NoSql数据库资料的整合,包括使用等等,是一个全面的介绍!

HSPICE用户必看:用Sigrity Broadband SPICE解决复杂封装建模的3个技巧

本文为HSPICE用户分享了三个使用Sigrity Broadband SPICE解决复杂封装建模难题的实战技巧。通过将宽频带S参数高效转换为时域SPICE模型,能显著提升仿真速度、保障收敛性,并精准分析谐振、返回路径不连续及超多端口PDN等关键问题,助力实现高效稳定的系统级信号与电源完整性分析。

metal的博客 601

redis\memcahce\mongodb\leveldb总结

redis memcache mongodb leveldb 简要介绍 Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。 Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争, 但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造...

ws1296931325的博客 1166

【项目分享】RailTracker: 火车票务数据采集与分析

从12306使用爬虫爬取火车站及车次信息、火车票价 通过本项目,我们将带领访问者手把手完成火车票数据采集、数据清洗、数据集成、可视化的一整个流程!

zhushatong的博客 3345

几款主流 NoSql 数据库的对比

最近小组准备启动一个 node 开源项目,从前端亲和力、大数据下的IO性能、可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型。 我们最终把选项范围缩窄在HBase、Redis、MongoDB、Couchbase、LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比。 鉴于缺乏项目中的实战经验沉淀,本文内容和观点主要还是从各平台资料搜...

dcof99817的博客 4394

捷联惯导总结--初始对准,位置标定,INS姿态更新,GPS/INS组合

惯导及组合导航回顾  2018.09.16 今天和17系的同学一起把惯导的流程捋了一遍,为了加深自己的记忆,这里在前面把心得大致列出来。 我们这里只考虑捷联式惯导及松组合 首先拿到惯性传感器(加速度计和陀螺仪)需要对其进行标定,是为了求出零偏,比例因子,交轴耦合这些误差。这些误差有的虽然在出厂时会给出,但是考虑到实际环境不同,还是要做标定。一般采用的是六位置旋转法,针对加速度计和陀螺仪同时...

赤豆几维 5万+

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 416

既生 Redis 何生 LevelDB?

了解 Redis 的同学都知道它是一个纯内存的数据库,凭借优秀的并发和易用性打下了互联网项的半壁江山。Redis 之所以高性能是因为它的纯内存访问特性,而这也成了它致命的弱点 —— 内存的成本太高。所以在绝大多数场合,它比较适合用来做缓存,长期不被访问的冷数据被淘汰掉,只有热的数据缓存在内存中,这样就不会浪费太多昂贵的内存空间。 但是 Redis 的诱惑太大了,用它来做持久存储使用起来太方便了。...

xingduan5153的博客 1642

基于 LSTM 的船舶轨迹预测,单步预测

基于 LSTM 的船舶轨迹预测,单步预测

fyuhao的博客 1万+

LevelDB简介

LevelDB一、LevelDB1. 什么是LevelDBLevelDb 的特点LSM 基本原理2. 既生 Redis 何生 LevelDB ?二、参考 一、LevelDB 1. 什么是LevelDB LevelDB是Google传奇工程师Jeff Dean和Sanjay Ghemawat开源的KV存储引擎。 Jeff Dean:Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。 Sanjay Ghemawat:Google大规模分布式平台GFS,Bigtable和MapRe

西京刀客 2666

Flow Match 原理 及应用

Flow Matching(流匹配)是生成模型的范式革命——用确定性ODE替代随机扩散过程,在自动驾驶轨迹预测中实现10倍采样加速和更高生成质量。更快的采样速度:通常只需 10-50 步就能生成高质量样本更稳定的训练:避免了传统扩散模型中复杂的噪声调度理论基础:基于连续正规化流(Continuous Normalizing Flows)核心思想:Flow Matching 通过学习一个 向量场(vector field) 来直接建模从噪声分布到目标分布的连续变换路径。

@bangbang的博客 103

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 402

Redis-LevelDB 项目推荐

Redis-LevelDB 项目推荐 项目基础介绍和主要编程语言 Redis-LevelDB 是一个基于 Google 的 LevelDB 的 Redis 协议兼容前端。该项目的主要编程语言是 C++,同时也使用了 Perl 和 Makefile 进行辅助开发。Redis-LevelDB 允许用户将 LevelDB 用作 Redis 服务器,从而提供高效的键值存储解决方案。 项目核心功能 Redi...

gitblog_00466的博客 420

【国产MCU】-认识CH32V307及开发环境搭建

CH32V307是[沁恒](https://www.wch.cn/)推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。

视觉与物联智能 2346

突破性能瓶颈:LevelDB与Redis的技术选型实战指南

你是否还在为高并发存储场景下的性能问题头疼?当面对TB级数据存储与毫秒级响应的双重需求时,如何在嵌入式数据库与内存数据库之间做出最优选择?本文将通过实测数据与场景化分析,帮你彻底搞懂LevelDB与Redis的底层差异,掌握在日志存储、缓存系统、边缘计算等场景下的技术选型方法论。读完本文你将获得: - 10组关键指标对比表格 - 3种典型业务场景的选型决策树 - 2套性能优化实战配置(附代码片段)...

gitblog_00646的博客 930

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Redis vs LevelDB vs etcd:谁才是稳定值存储的终极选择?

对比Redis、LevelDB与etcd在稳定值的存储场景下的性能与适用性,分析其架构差异、读写延迟及数据持久化机制。涵盖高并发、分布式系统中的选型建议,帮助开发者做出更优决策。值得收藏

CodeVibe的博客 757

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LevelDb(一):LevelDb简介

1. leveldb简介 2. hello world 2.1 leveldb源码下载和编译 2.2 hello world程序 1. leveldb简介 LevelDb是google的工程师Jeff Dean和Sanjay Ghemawat这两位大神级别的工程师发起的开源项目,这两位是Google重量级的工程师,为数甚少的Google Fellow之二。Jeff Dean其人是Google大规模分布式平台Bigtable和MapReduce主要设计和实现者,Sanjay ...

蓬莱道人的博客 6362

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leveldb学习:leveldb实现原理

LevelDb日知录之一:LevelDb LevelDb由两位是Google公司重量级的工程师:Jeff Dean和Sanjay Ghemawa 发起。 Jeff Dean:Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。 Sanjay Ghemawat:Google大规模分布式平台GFS,Bigtable和MapReduce主要设计和实现工程师。 这二...

guangyacyb的博客 2208
上一篇: 为什么在太空飞船里计算机性能都特别低?
下一篇: 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值