用 LFS 文件系统存储 key value

有些人问 LFS 能不能存储 key value?

单线程写的时候是可以的,多线程读也是可以的。(嗯,可以考虑在未来增加并发写的功能。)

那么如何做呢?其实 key value 是一个哈希结构,正好,LFS 里支持哈希索引。

支持 key value 代表着,也可以通过文件名读写文件(只是没有文件夹的概念,但文件名依然可以是一个包含文件夹的路径名)。

注:下面的方法可以封装成更通用的接口来使用,这里这么做是为了让大家明白如何做

//set(key, value)
Socket con = LFSConnection.getConnection();
LFSByteArray lb = new LFSByteArray();
lb.putString(FILE_NAME);
lb.putStringBytes("key");
lb.putStringBytes("value");
//大家都已经习惯了封装好的 set(key, value) 形式,其实是可以的
//把这段代码封装一下就可以了(这里的脚本只是为了提供更好的透明度,更深入了解细节)
lb.setStatement(""
	+ "local r = data_open(vars[0]);"
	+ "if (r == 1) then "
	+ "	local key = vars[1];"
	+ "	local value = vars[2];"
	+ "	local keyId = data_read_index(key, -1);"
	+ "	local valueId = data_write(keyId, value, -1);"
	//构建索引
	+ "	if (keyId < 0) then "
	+ "		data_write_index(valueId, key, -1);"
	+ "	end;"
	//设置 state 为 1,表示成功
	+ "	setState(1);"
	+ "end;"
	+ "");
lb.writeTo(con);
lb.clear();

get(key)

//get(key)
Socket con = LFSConnection.getConnection();
LFSByteArray lb = new LFSByteArray();
lb.putString(FILE_NAME);
lb.putStringBytes("key");
lb.setStatement(""
	+ "local r = data_open(vars[0]);"
	+ "if (r == 1) then "
	+ "	local key = vars[1];"
	+ "	local keyId = data_read_index(key, -1);"
	+ "	if (keyId >= 0) then "
	+ "		data_read(keyId);"
	+ "		putBytes(vars.dataData, -1);"
	+ "	else "
	+ "		putNull();"
	+ "	end;"
	+ "end;"
	+ "");
lb.writeTo(con);
byte[] value = lb.get(0);
lb.clear();
时间: 2024-07-30 23:09:09

用 LFS 文件系统存储 key value的相关文章

c++封装的用来存储key value pair的内存池类

问题描述: 1.c++封装的用来存储key, value对的内存池: 2.key 用字符串表达,value可以是各种类型.目前value只支持六种类型,后面会继续扩展: 3.key value pair 内存结构是:key length(1byte) | key string | value type | value |.注意中间|是为了表达区分而加上的,实际内存中并没有.注意当value 是char* 对象是,value前面四个字节表达它的长度: 4.这个类写的很仓促,目前呈现给大家的仅仅是一

文件系统存储数据,与数据库系统存储数据的差别

一.文件系统与数据库系统的概念及其发展 1.文件系统  所谓的文件系统简单地说负责存取和管理文件信息的软件结构.例如电脑的硬盘C.D.E.F盘和可以动的存储设备等.文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法.也指用于存储文件的磁盘或分区,或文件系统种类.操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统.  文件系统由三部分组成:与文件管理有关软件.被管理文件以及实施文件管理所需数据结构.从系统角度来看,文件系统是对文件存储器空间

对象存储、块存储、文件系统存储概念与区别

一.概念及区别 针对不同的应用场景,选择的分布式存储方案也会不同,因此有了对象存储.块存储.文件系统存储.这三者的主要区别在于它们的存储接口: 1.  对象存储: 也就是通常意义的键值存储,其接口就是简单的GET,PUT,DEL和其他扩展,如七牛.又拍,Swift,S3 2. 块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,如Sheepdog,AWS的

大分区使用xfs文件系统存储备份遇到的问题

日前,同事反馈一个问题:在一个大分区(24T)中使用xfs文件系统,用来做历史文件备份,突然提示没有磁盘空间错误,先检查下: [[email protected] ~]# df -hT Filesystem    Type    Size  Used Avail Use% Mounted on /dev/sdb1      xfs     19T   16T  2.4T  88% /backup [[email protected] ~]# df -hi Filesystem          

Linux文件系统存储方式

文件系统作为一个系统的重要组成部分,对于每位程序员来说,都是非常重要的基础知识.与此同时,Linux和Windows上的文件系统的原理又恰恰是不一样的.Windows中采用的是FAT 表的形式,但是今天我主要的讲的是更为经典的Linux本地文件系统上的存储原理,稍稍分析一下他的结构,作为抛砖引玉. 文件系统的数据块管理 我们都知道,文件要被存储在磁盘中,我们都是把以数据块的概念做处理和存储的,如果最后的剩余部分没有达到单位块的大小,也是作为一整块的方式处理.所以问题来了,我们如何去处理这些文件数

Redis百亿级Key存储方案

1 需求背景 该应用场景为AdMaster DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称admckid)的mapping关系,还包括了admckid的人口标签.移动端id(主要是idfa和imei)的人口标签,以及一些黑名单id.ip等数据. 在hdfs的帮助下离线存储千亿记录并不困难,然而DMP还需要提供毫秒级的实时查询.由于cookie这种id本身具有不稳定性,所以很多的真实用户的浏览行为会导致大量的新cookie生成,只有

FAT32文件系统的存储组织结构(二)

前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制.由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下:   我们可以看出,在分区格式化的时候,系统将卷标TEST_FAT32存储在2号簇,即跟目录区,如上面根目录贴图所示.同时,在FDT区2号簇标记位置写入了文件结束符FF FF FF 0F.显然,FAT32文件系统将目录当做普通文件来处理的. 下面我们在根目录下新建一个文件夹TEST1,看会有什么变化:

块存储、对象存储和文件系统: 它们对容器而言意味着什么?

当管理员首次开始使用Docker容器时,通常会使其感到惊讶的是, 容器本身采用的是非永久性存储.当容器被移除时, 容器的存储也被移除了. 当然,如果没有办法实现永久存储,则容器应用程序的使用将会非常受限.幸运的是,有些方法在容器化的环境中可以实现持久存储.尽管容器本身的原生存储是非持久性的,但可以将容器连接到容器外部的存储区.此操作允许持久性数据的存储,因为当容器停止时,该外部存储不会被移除. 决定如何为容器实现持久存储的第一步是确定您将使用的存储系统的基础类型.在这方面, 通常有三种主要选项:

JavaScript系列-----对象基于哈希存储(&lt;Key,Value&gt;之Value篇) (2)

JavaScript系列-----Objectj基于哈希存储<Key,Value>之Value 1.问题提出 在JavaScript系列-----Object之基于Hash<Key,Value>存储之Key篇 (1)中,我们推理出:对象是以Hash结构存储的,对象的属性被表示为多个<Key,Value>键值对. 其中,Key的数据类型是字符串,但是,我们并没有说Value是以什么数据结构存储的,在本文中,我们将继续讨论:Value的存储类型-----博文的核心 既然在J