Redis整理

2018-06-12  本文已影响0人  瑜骐

Redis简介

Redis是一个速度非常快的非关系数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。

Redis与其他数据库和缓存服务器的对比

Redis与其他数据库和缓存服务器的对比

Redis 数据结构

SDS

SDS(simple dynamic string)简单动态字符串 SDS数据结构

  SDS的API都是二进制安全的(binary-safe),所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据,程序不会对其中的数据做任何限制,过滤,或者假设数据在写入时是什么样的,它被读取时就是什么样。

链表

链表结构图

字典

字典hash表数据结构 字典数据结构

跳跃表skiplist

  跳跃表skiplist是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,如下图所示: 跳跃表skiplist例子

整数集合

  整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现,结构定义如下图所示: 数据结构定义

压缩列表ziplist

  压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值,如下图所示: ziplist结构

对象

  Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包含如下的5中对象类型: Redis对应键值的5中数据结构
数据结构 对象类型
数据结构 对象类型

字符串对象

  字符串对象的编码可以是int,raw或者embstr,这三种字符串编码在一定条件下会进行转换。

列表对象

列表对象的编码可以是ziplist或者linkedlist;ziplist编码使用的压缩列表作为底层实现,linkedlist使用的是双端链表作为底层实现,这两种编码会在一定的条件自动进行转换,两种列表编码如下表对比所示:

ziplist 编码 linkedlist 编码
ziplist编码的列表对象 linkedlist编码的列表对象
列表命令实现入下图所示: 列表命令实现

哈希对象

哈希对象的编码可以ziplist或者hashtable;hashtable编码的哈希对象使用字典作为底层实现;这两种编码可以在一定的条件下相互转换;下表显示了两种编码的对比:

ziplist 编码 hashtable 编码
ziplist编码的哈希对象 hashtable编码的哈希对象
哈希对象的命令实现如下图所示: 哈希对象的命令实现

集合对象

  集合对象的编码可以是intset或者hashtable,intset编码的集合对象使用整数集合作为底层实现;这两种编码在一定条件下可以相互转换,对比如下图所示:

intset 编码 hashtable 编码
intset编码的集合对象 hashtable编码的集合对象
集合对象对应命令实现如下图所示: 集合对象的命令实现 集合对象的命令实现-续

有序集合

  有序集合的编码可以是ziplist或者skiplist(跳跃表),skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表,如下代码所示:

typedef struct zset {
        zskiplist *zsl;
        dict *dict;
}

这两种编码在一定条件下可以相互转换,对比如下表所示:

ziplist 编码 skiplist 编码
ziplist编码的有序集合对象 skiplist编码的有序集合对象
有序集合对应的命令实现如下图所示: 有序集合命令实现

redis常用命令

TYPE命令

  对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象,列表对象,哈希对象,集合对象或者有序集合对象中一种,因此在对一个数据库键执行TYPE命令时,命令返回的结果为数据库键对应的值对象的类型,而不是键对象的类型,其中格式:type 键名称 ,对应的输出如下图所示:

不同类型值对象的TYPE命令输出

OBJECT ENCODING命令

对象的编码就是对象使用了什么数据结构作为对象的底层实现,格式为:OBJECT ENCODING 键名称,对应的输出下图所示:

OBJECT ENCODING对不同编码的输出 OBJECT ENCODING对不同编码的输出-续

OBJECT IDLETIME命令

   OBJECT IDLETIME命令可以打印出给定键的空转时间,空转时间=当前时间 - 键的值对象最后一次被命令程序访问的时间

对象通用命令

select命令

  每个Redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象;默认情况下,Redis客户端的目标数据库是0号数据库,但客户端可以通过执行select命令来切换目标数据库;数据库对应的结构如下:

redisServer redisDb 示例图
redisServer redisDb 示例图

数据库持久化

RDB持久化

RDB持久化功能是将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失,如下图所示: RDB持久化

AOF持久化

AOF(append only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如下图所示: AOF持久化

参考

  1. redis设计与实现(第二版)
  2. 源码解析:https://github.com/huangz1990/redis-3.0-annotated
  3. 测试用例:https://yq.aliyun.com/articles/62845
  4. 源码对应的测试用例讲解:https://yq.aliyun.com/articles/62845
  5. Mac redis: https://www.cnblogs.com/xrhou12326/p/7103106.html
上一篇 下一篇

猜你喜欢

热点阅读