赞
踩
1. 关联数组:和普通数组一样的结构,区别在于没有普通数组一样的约束或者说规范
(1)key(下标)不限于整数,可以是字符串
(2)value可以是实数、字符串、列表及整数等类型
(2)key和value都不要求是同一类型
例子:
键值数据库基于关联数组这一结构构建,但是键值数据库不仅支持内存存储,还支持持久化到硬盘中
2.命名空间:由键值对构成的集合,相当于数据库或桶
3.分区:根据键名,把数据分割成不同的单元,存储在集群中的不同服务器上,实现负载均衡
用到的只是增加和删除,不需要设计复杂的数据模型、纲要,也不需要为每个属性指定数据类型。动态添加时不需要修改原有数据库的定义
把数据不保存在内存中,在RAM中读取和写入速度要快很多,当然也可以选择持久化
因为是存在内存中,有时需要释放来存储新的数据,最常用的算法:LRU(Least Recently Used,最久未使用算法)
可缩放性:根据系统负载量,随时添加或删除服务器
缩放的两种方式:
(1)主从式复制
主服务器处理写入请求和读取请求,并把珠吉路的数据复制到集群中的其他服务器里。从服务器只响应读取请求,遵从树形结构
应用情况:希望服务器能快速相应查询请求,而对写入请求响应能力没有太多要求
优点:简洁,其他服务器只需与主服务器通信,而且不用协调写入冲突
缺点:主服务器作为独木桥,一旦故障,整个集群无法处理写入请求(解决:从服务器遵守协议,若主服务器故障,一台从服务器升为主服务器)
(2)无主式复制
对于诸如网上购票这种需要大量读取和写入请求的情况,主从不适合,采用无主式复制,它遵从一种环形或网状结构
这种情况下每台服务器都可以吧自己活得新数据复制到其他服务器里面,可以指定哪几台作为它的副本存储服务器。
键最好以命名空间为前缀,这样确保了它的唯一性
可以采用实体+标识符+属性的方式,以冒号隔开
如 customer:1:name
在采用无主式复制的集群情况下,如何避免读取和写入不会污染数据?比如订电影票,不同的服务器可能将同一个座位卖给不同的人
方法:
由易到难:数字定位→用hash函数来定位值(分区键)
数字定位,比如,键为1,那就把它放到第一个服务器里面,由它来负责写入。同理,键为2,由第二个服务器来处理
hash定位:利用之前说的命名空间作为前缀的键,将其做hash运算,得到唯一(绝大多数情况)的定长的hash值。可以利用hash值对服务器数量作取余运算,这样可以将键对应到不同的服务器上执行写操作
值可以是任何类型,对于值的约束取决于具体使用的kv数据库
kv数据库只支持根据键查找值,一般不支持查询语言
有的kv数据库提供文本搜索功能,如Riak
(1)命名:有具体意义且明确,分隔符的使用(通常是":");如果处理与范围有关,则应把范围标识信息放入键中,比如日期
redis的键名不仅支持字符串,还支持列表、集合、有序集合、hash
(2)分区:可以按键名分区;也可以按hash分区
总的来说,值的设计考虑的是内存读取的时间和空间
有几个原则:
(1)把频繁读取的值组合起来,用一个键名去读取,节省磁盘读取时间
(2)即使对于属于同一个实体的信息(大型的数据结构,嵌套结构等),最好独立出其中读取频繁的属性,节省内存空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。