1.什么是键值数据库,都有是怎么数据结构组成?

1.什么是键值数据库,都有是怎么数据结构组成?

到底什么是键值数据库 ? 为什么会这么快 ? 例如,用户信息(用户 ID、姓名、年龄、性别等)通常用关系型数据库保存,在这个场景下,一个用户 ID 对应一个用户信息集合,这就是键值数据库的一种数据模型,它同样能完成这一存储需求。

可以存哪些数据?对于键值数据库而言,基本的数据模型是 key-value 模型。不同键值数据库支持的 key 类型一般差异不大,而 value 类型则有较大差别。 value的类型,例如Memcached 仅支持String类型,但Redis的Value类型就包含了String,哈希表(HASH),列表,集合,并且还有自定义的数据结构, Redis 能够在实际业务场景中得到广泛的应用,就是得益于支持多样化类型的 value。 从不同的使用角度来说,不同 value 类型的实现,不仅可以支撑不同业务的数据需求,而且也隐含着不同数据结构在性能空间效率等方面的差异,从而导致不同的 value 操作之间存在着差异。

可以对数据做什么操作?基本操作无外乎增删改查,由于Value类型的区别,造成了更多的操作方式,注意操作是否会造成阻塞PUT:新写入或更新一个 key-value 对;GET:根据一个 key 读取相应的 value 值;DELETE:根据一个 key 删除整个 key-value 对。特殊:查询一个用户在一段时间内的访问记录属于 SCAN 操作,即根据一段 KEY 获取一段内容如果一个用户ID唯一,在键值数据库中判断KEY_ID是否存在,属于 EXISTS操作。

键值对保存在内存还是外存?保存在内存, 好处是读写很快, 毕竟内存的访问速度一般都在百 ns 级别。但是,潜在的风险是一旦掉电,所有的数据都会丢失。保存在外存, 好处可以避免数据丢失,但是受限于磁盘的慢速读写(通常在几 ms 级别),键值数据库的整体性能会被拉低。由于缓存大多数都是用户缓存场景,可以接受数据的丢失,所以做好备份操作,还是使用内存会更好

一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分

采用什么访问模式?一种是通过函数库调用的方式供外部应用使用一种是通过网络框架以 Socket 通信的形式对外提供键值对操作例如 :RocksDB 以动态链接库的形式使用,而 Memcached 和 Redis 则是通过网络框架访问。

如何定位键值对的位置?当 KV数据库 解析了客户端发来的请求,知道了要进行的键值对操作,此时,KV 需要查找所要操作的键值对是否存在, 这依赖于键值数据库的索引模块。索引的作用是让键值数据库根据 key 找到相应 value 的存储位置,进而执行操作。索引的类型有很多,常见的有哈希表、B+ 树、字典树等。不同的索引结构在性能、空间消耗、并发控制等方面具有不同的特征。例如 :Memcached 和 Redis 采用哈希表作为 key-value 索引,而 RocksDB 则采用跳表作为内存中 key-value 的索引内存键值数据库(例如 Redis)采用哈希表作为索引,很大一部分原因在于,其键值数据基本都是保存在内存中的,而内存的高性能随机访问特性可以很好地与哈希表 O(1) 的操作复杂度相匹配。

不同操作的具体逻辑是怎样的?image 对于 GET/SCAN 操作而言,此时根据 value 的存储位置返回 value 值即可;对于 PUT 一个新的键值对数据而言,SimpleKV 需要为该键值对分配内存空间;对于 DELETE 操作,SimpleKV 需要删除键值对,并释放相应的内存空间,这个过程由分配器完成。对于 PUT 和 DELETE 两种操作来说,除了新写入和删除键值对,还需要分配和释放内存,这也就要依赖存储引擎了

如何实现重启后快速提供服务?因为是内存型数据库,所以需要加入持久化功能,持久化有两 :一种方式是: 对于每一个键值对,KV 都对其进行落盘保存,这虽然让 KV 的数据更加可靠,但是, 因为每次都要写盘,KV 的性能会受到很大影响。一种方式是: KV 只是周期性地把内存中的键值数据保存到文件中,这样可以避免频繁写盘操作的性能影响。 但是,一个潜在的代价是 KV 的数据仍然有丢失的风险。

总结

1.Redis 主要通过网络框架进行访问,而不再是动态库了,这也使得 Redis 可以作为一个基础性的网络服务进行访问,扩大了 Redis 的应用范围。2.Redis 数据模型中的 value 类型很丰富,因此也带来了更多的操作接口,例如面向列表的 LPUSH/LPOP,面向集合的 SADD/SREM 等。3.Redis 的持久化模块能支持两种方式:日志(AOF)和快照(RDB),这两种持久化方式具有不同的优劣势,影响到 Redis 的访问性能和可靠性。4.SimpleKV 是个简单的单机键值数据库,但是,Redis 支持高可靠集群和高可扩展集群,因此,Redis 中包含了相应的集群功能支撑模块。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部