全栈必备 Redis基础

在《老码农眼中的简明AI》一文中提到了图灵机和冯诺伊曼的计算机体系结构,数据存储是整个计算机软件系统中的一个关键节点。从个人电脑上的软件到基于计算机网络的分布式系统,存储系统更是基础环节,而且还承担着整个系统的数据责任。

应用程序离不开数据存储,关系型数据库的诞生为软件系统的发展揭开了一个新的时代,而互联网应用中大量的非结构化数据为非关系型数据库——NoSQL,提供了广泛的应用场景。

NoSQL 技术与高伸缩性无缝融合,很多技术同时具备了高分布性和高性能, 也是大数据分析的存储基石。大多数时间里,它们使 现有RDBMS 技术所实现的架构更加完整,例如 作为缓存服务器,搜索引擎,非结构化存储,易变信息存储等。大约可以分为4类:

  • Key/value型NoSQL

  • 列存储型NoSQL

  • 面向文档的存储型NoSQL

  • 图存储型NoSQL

关于这些NoSQL 的应用场景可以参见《NoSQL 之于大数据》。

面对这些NoSQL, 如果只需掌握一种NoSQL,那可能就是key/value型的Redis了。

什么是Redis

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

它支持多种类型的数据结构,如字符串, 散列, 列表, 集合, 有序集合与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

Redis 内置了复制,LUA脚本, LRU驱动事件,事务和不同级别的磁盘持久化, 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性。

以上来自redis.cn 上的介绍,简单的说,Redis是一个支持多种数据结构并且能够持久化的高性能NoSQL 数据库。

Redis 的存储实现

Redis作为一个性能高达10万qps的key/value存储类型的NoSQL数据库,大致的存储实现体系如下:

一个RedisServer包含了N个redisDb,redisDb有dict的指针和失效时间的指针,核心是dictEntry 指针链表的指针,每一个具体的dictEntry链表节点存储了任意类型的key 和 value,不论是key还是value 都可以是redisObject。可以认为,指针链表的特性对redis的性能做出重要的作用。

Redis 中的数据结构与存储实现关系如下:

INT压缩存储String,常量数字对象是共享的。SDS 存储string,变长的字符数组以及共享的常用字符串等。双端列表LINKEDLIST来存储list,支持双向遍历。HT是hash表,存储set和hash,根据填充率缩放,支持事件触发。INTSET压缩存储set,编码为int16_t/ int32_t/ int64_t。SKIPLIST存储有序集,联合dict处理zset。ZIPLIST通过双端指针压缩存储hash、list和zset。

Redis存储实现中的网络模型支持Epoll/Select/Kqueue等,事件模型主要是TimeEvent/FileEvent。由于FileEvent处理器是单线程的,所以 redis 是单线程的模型。Redis 单线程模型是纯内存操作,核心是基于非阻塞的 IO 多路复用机制,单线程反而避免了多线程的频繁上下文切换问题,因而整体的存储实现性能很高。

Redis 的常见命令集

Redis 简洁易用,为了方便记忆,命令集分类如下:

访问Redis的客户端类型丰富,几乎涵盖了大多数的主流编程语言:

Redis 的集群部署

Redis 自2.4 版本开始就可以在生产环境上稳定可用了,在2.6版本引入了Lua脚本和Watch dog,2.8版本对主从同步进行了优化,并开始支持Sentinel 和 HyperLog。Redis 2.x 的集群主要是通过主从同步实现的,数据是异步复制和增量同步。

有限状态机在主从同步和数据持久化方面起到了重要的作用。数据持久化是通过快照实现的,通信协议是RESP,一种便于实现和理解的二进制安全协议。AOF 最终通过fsync写入磁盘实现数据的持久化。

从3.0开始,Redis 支持cluster,cluster内部的各节点间采用的Gossip分布式协议。通过多数原则判断节点是否宕机,由gossip协议传播判活信息,选举出新的替代者,由gossip协议传播选举结果。

Redis 集群可以实现自动故障切换,副本迁移和在线的重新分片。分片变化,数据迁移同样通过gossip协议达成一致。

然而,Redis cluster 同样存在着不足,例如随着节点的增加,故障切换会有大幅的增加,gossip传播信息需要一段时间,整机房切换比较慢。按key同步阻塞的迁移对读写影响较大,Gossip协议的调试非常困难,给故障的排除会带来诸多的不便。

关注redis 的官方网站,可以看到redis 4.0 以来的诸多新变化。

Redis 的常见应用

Redis 的应用十分广泛,在key/value 的NoSQL中有着突出的性能体现,甚至和文档型NoSQL——MongoDB 在某些方面有着类似的作用。Redis, Memcache和MongoDB 的对比如下图所示:

根据用户标识获取用户的相关数据在互联网应用中是一种常见的场景,这类数据具有读写量大,但单条数据不长,并且对某些字段经常进行更新等特点,一般都会使用redis 这样类型key/value 数据库来实现。Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得在执行这些操作时非常简单,Redis正好提供了这两种数据结构,因而对排行榜类的场景

对于分布式锁的业务,Redis 可以提供高性能的分布式锁服务,例如电商业务的秒杀场景,全局自增ID等等。

对于系统架构而言, Redis 有时候甚至成为了缓存的代名词,关于Redis 在分布式缓存方面的各种应用,可以参考《深入分布式缓存——从原理到应用》一书中的诸多章节。

深入Redis,还可以发现很多有趣的用法,例如将redis 作为消息队列等等,一文难以描述Redis,但可以作为全栈需要掌握的一个基础。

【参考阅读】

(0)

相关推荐

  • 什么是集群,集群的概念介绍

    集群术语须知 服务硬件:指提供计算服务的硬件,比如 PC 机.PC 服务器. 服务实体:服务实体通常指服务软体和服务硬体. 节点(node):运行 Heartbeat 进程的一个独立主机称为节点,节点 ...

  • Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库--Cassandra进行简单地介 ...

  • 全栈必备 Java基础

    那一年,从北邮毕业,同一年,在大洋的彼岸诞生了一门对软件业将产生重大影响的编程语言,它就是--Java.1998年的时候,开始学习Java1.2,并在Java Orbix 上做服务,而如今Java 9 ...

  • 全栈必备JavaScript基础

    1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...

  • 全栈必备 :C语言基础

    [引子]温故而知新,"三日不弹,手生荆棘",代码也是如此.另一方面,自己挖的坑要自己填.在<全栈的技术栈设想>中埋下了4种编程语言的伏笔,已经兑现了Javacript, ...

  • 全栈必备——网络编程基础

    我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. ...

  • 全栈必备 贝叶斯方法

    数据的重要性毋庸置疑,但是如何让数据产生价值呢? 对一个全栈老码农而言,经常在开发或者研发管理的时候遇到各种预测.决策.推断.分类.检测.排序等诸多问题.面对"你的代码还有bug么?&quo ...

  • 全栈必备 Log日志

    Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记 ...

  • DevOps 全栈必备双刃剑

    作为一名全栈工程师,不仅是一个研发多面手,而且必须要关注产品的最终交付,以及线上服务的稳定运行.工具化使开发.交付.运维紧密地联系在一起,于是DevOps 逐渐成为了全栈们手中的利器,但由于DevOp ...

  • 全栈Python 编程必备

    据说:2019年, 浙江信息技术高考可以考python了:2018年, Python 进入了小学生的教材:2018年, 全国计算机等级考试,可以考python 了:据外媒报道,微软正考虑添加 Pyth ...

  • 周易预测入门必备的基础知识,全是精华,看完收藏

    今天我整理了周易预测入门必备的基础知识,供大家了解. 01.何为<易> 首先说<易>是一本哲学书籍,这是毋庸置疑的,自古以来的哲学很多都是和宗教或者预测捆绑在一起发展的.由&l ...