内存KV缓存/数据库,可以选择它? | 1分钟系列

2023-11-30 14:38

本文主要是介绍内存KV缓存/数据库,可以选择它? | 1分钟系列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

互联网业务,绝大部分场景,会使用缓存服务

《选redis还是memcache,源码怎么说?》

《选redis还是mc,面试官究竟想考察啥?》

《memcache内核的知识点,值得收藏》

但有时候,确实会使用到进程内存缓存/数据库,这个时候,LevelDB就能派上用场了。

啥是LevelDB?

LevelDB是Google开发的,一个速度非常块的KV存储库(storage library),它支持字符串的key与字符串的value,并且这种映射关系按key排序(ordered mapping)。

LevelDB有什么特点?
(1)key和value可以是字符串或者字节流;
(2)数据默认按key排列,有序存储;
画外音:调用方可以重载排序方法,以实现自定义排序。
(3)简单易用,基本操作只有3种:
    - Put(key, value)
    - Get(key)
    - Delete(key)
(4)提供原子批量修改接口;
(5)支持数据快照;
(6)支持数据自动压缩;

画外音:使用的是snappy压缩算法。
(7)开源,文档很详尽,Google出品很可靠;

LevelDB有什么局限?

(1)LevelDB不是一个SQL数据库,没有关系型的存储模型,不支持SQL语句,不支持索引;
(2)同时只能有一个进程(当然,这个进程可以是多线程的)访问一个特定的数据库;
(3)LevelDB只是一个lib库,没有实现什么client-server网络通讯什么的,当然用户可以自己将lib包装一层,实现自己的server;

LevelDB的性能如何?

内存缓存的特点就是快。

Google也进行了一系列测试:测试库共100w行记录,每条记录16字节的key,100字节的value,压缩后的value大概50字节。

写性能
顺序写:平均每次操作耗时1.765微秒,即支持每秒大概55w次顺序写操作;
顺序写+每次都刷盘:平均每次操作耗时268.409微妙,即支持每秒大概3700次的刷盘写操作;
随机写:平均每次操作耗时2.460微秒,即支持每秒大概40w次随机写操作;
更新写:平均每次操作耗时2.380微秒,性能和随机写差不多;

读性能
随机读:平均每次操作耗时16.677微秒,即支持每秒大概6w次随机读操作;
顺序读:平均每次操作耗时0.476微秒,即支持每秒大概210w次顺序读操作;
逆序读:平均每次操作耗时0.724微秒,即支持每秒大概130w次逆序读操作;


上述性能都是在没有打开“压缩”功能下的结果,如果打开“压缩”选项,性能会有所提升。

画外音:Google非常诚实的提到,由于100w行的数据量很小,这些数据是能够完全放入内存。

如果仅限于方案调研,上面的内容应该够用了;如果想了解LevelDB内部的细节,未来再撰文吧。

知识星球-刚开始玩

相关推荐

《回表查询?索引覆盖?| 1分钟系列》

《优化工具,迅猛定位低效SQL | 1分钟系列》

《数据库允许空值(null)是悲剧的开始 | 1分钟系列》

《两类非常隐蔽的全表扫描 | 1分钟系列》

调研

你采用啥实现内存KV缓存‍,"Map+Lock"自己玩么?

这篇关于内存KV缓存/数据库,可以选择它? | 1分钟系列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437411

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

SQL Server中,添加数据库到AlwaysOn高可用性组条件

1、将数据添加到AlwaysOn高可用性组,需要满足以下条件: 2、更多具体AlwaysOn设置,参考:https://msdn.microsoft.com/zh-cn/library/windows/apps/ff878487(v=sql.120).aspx 注:上述资源来自MSDN。

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt