概述
简介
键值对数据库系统:一个针对关联数组、字典或hash表提供高吞吐数据存储、读取和管理服务的数据库系统。
关联数组包含很多记录,每个记录可以有不同的属性。
技术特点
- 高性能:哈希算法快速查询
- 支持多种数据类型的键值存储:键值可以是任何内容
- 支持持久化操作:内存->硬盘
- 可拓展性:分片机制
- 高可用性:主从机制
- 支持事务管理:操作的原子性
- pub/sub消息订阅、key过期
- 操作简单:丰富API
- 多种语言API
键值数据存储逻辑架构
数据以键值对形式存储,键是值数据的唯一标识。
采用驻留内存的方式提供键值数据的高性能访问。
键值数据库系统通过唯一标识记录的键key来迅速存储和读取单行记录中的数据,实现对键值数据的高并发读取服务。
键值操作
Set(key,value) 将value存储到key对应内存空间中,如果key已有value,替换旧的value
get(key) 读取key对应的数据
del(key) 删除key对应的键值数据
数据结构
- string(字符串)
最基本数据存储结构类型。
string是二进制安全的,也就是说string可以是任何数据,即二进制数组数据对象,string类型的值最大可存储512MB。
常用于常规的KV缓存应用及常规计数的应用场景。
- list(列表)
是简单的双向字符串列表,按照插入顺序排序。左头右尾,可插入取出,最多可存储2^32 -1个数据。
可应用于存储并获取最新的评论列表等。 3. set(集合)
string类型的无序集合,且不允许有重复的属性,通过哈希表实现,因此添加删除查询的复杂度都是O(1),最多存储2^32 -1个数据。
- hash(哈希)
值是一个键值对集合。hash是一个stirng类型的field和value的映射表Map,适合存储对象。每个哈希可存储2^32 -1个数据。
redis称其内部Map的key为field,也就是通过key和field操作对应的属性数据。
- zset(有序集合)
和set一样也是string类型元素的集合,且不允许有重复的属性。
不同的是每个元素都会关联一个doubble类型的数值(score),redis可以依据这个数值对集合中的成员进行排序。虽然成员要求唯一,但是对应排序数值可以重复。
可应用于销量排名,积分排名等场景。 6. stream(流)
键值数据库管理基础
持久化管理
已有键值数据库读写方式可分为面向内存读写方式和面向磁盘读写方式两种。
面向内存读写方式面临可靠性问题:内存数据一旦发生故障,数据易丢失、难恢复。读写一般适用于不要求存储海量数据但需要对特定数据进行高速并发访问的场景。
持久化:当数据占用内存空间达到一定大小限制或者数据存放超过指定期限时,将会采用一定的机制将数据写入磁盘的过程。
这样,当数据被访问时,先在内存中查找,若未命中则访问磁盘中的实例化文件。当系统宕机时,也可以恢复内存中的数据。
面向大数据的键值存储往往采用持久化,即两种方式并用。
redis使用两种文件格式存储全量数据和增量请求数据:
- 全量数据格式文件 把内存中的数据写入磁盘,便于下次读取时进行加载。
- 增量请求数据 把内存中的数据序列化为操作请求,用于读取文件重新执行请求后得到数据。
RDB (redis database) 写入数据
在指定时间间隔内将内存中的数据集快照写入硬盘。
本质是快照备份机制,将数据写入二进制文件,如默认的dumb.rdb。
生成的rdb文件是一个经过压缩的二进制文件,通过该文件可以还原记录该文件时的数据库状态。
既可以手动执行,又可以根据服务器配置选项定期执行。
AOF (append-only file) 写入命令
以日志的形式记录服务器所执行的每一次写操作。
在redis服务器启动时会读取该文件重新构建数据库。
使用aof持久化时,服务器会将每次收到的写命令使用写请求追加记录到文件中,默认是appendonly.aof
配置文件参数
配置持久化机制及自动持久化触发条件
- save seconds updates:
指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。
- appendonly yes/no:
指出是否在每次更新操作后进行日志记录,即是否开启AOF持久化存储方式,默认为no。
redis本身同步数据文件按save配置条件同步,有的数据会在一段时间内只存在在内存中。
- appendfsync no/always/everysec:
AOF持久化存储方式三种参数配置:
always:每次收到更新操作写命令后就立即写入磁盘。效率最差,效果最好,安全性上说:故障只会丢失一条命令数据。
everysec:每秒同步写入磁盘一次。效率与效果居中,故障只会丢失一秒的命令数据。
no:故障会丢失上次同步AOF文件之后所有写命令数据。
分区机制
高度可分区->更易实现大规模水平拓展
定义:是指如何合理分割大数据集到多个数据库实例的处理过程,每个数据库实例只保存全局键值数据库中key的一个子集。
分类
1.范围分区 要求key是object_name:<id>形式,这样方便映射一定范围id的对象到特定的redis数据库实例。
不足:需要有一个键区间范围到数据库实例的映射表。
2.哈希分区
对任何key都适用,可以使用一个hash函数将key转化为一个数字。有几个数据库实例,就对几取模。
执行分区任务的角色
1.客户端分区
客户端按照分区算法计算得到数据将会存储到哪个数据库节点或从哪个数据库节点请求数据。
2.代理分区
客户端将请求发送给代理,由代理决定去哪个节点写/读数据。
3.查询路由
客户端随机地请求任意一个数据库实例,由该数据库将请求转发给正确的数据库节点。
集群监控-哨兵监控管理机制
键值数据库应用
高并发简单键值类数据读写