当前位置: 首页 > 科技观察

全栈必备Redis基础

时间:2023-03-14 15:22:30 科技观察

从个人电脑上的软件到基于计算机网络的分布式系统,存储系统是基础环节,同时也承担着整个系统的数据责任。应用程序离不开数据存储。关系数据库的诞生,为软件系统的发展开辟了一个新纪元。互联网应用中大量的非结构化数据,为非关系型数据库——NoSQL提供了广泛的应用场景。NoSQL技术无缝集成,具有高扩展性,许多技术同时具有高分布和高性能,也是大数据分析的存储基石。大多数时候,他们完成了现有RDBMS技术实现的架构,例如缓存服务器、搜索引擎、非结构化存储、易失性信息存储等。大致可以分为4类:Key/valueNoSQLColumnstorageNoSQLDocument-面向存储NoSQL图存储NoSQL这些NoSQL的应用场景请参考《NoSQL 之于大数据》。面对这些NoSQL,如果你只需要掌握一种NoSQL,那可能就是key/value类型的Redis。什么是RedisRedis是一个开源(BSD许可)的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,例如字符串、哈希、列表、集合、排序集合和范围查询、位图、hyperloglogs和地理空间索引半径查询。Redis内置复制、LUA脚本、LRU驱动的事件、事务和不同级别的磁盘持久化,并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性。以上来自redis.cn上的介绍。简单的说,Redis是一个支持多种数据结构并且可以持久化的高性能NoSQL数据库。Redis存储实现Redis是一个key/value存储类型的NoSQL数据库,性能高达100,000qps。一般的存储实现系统如下:一个RedisServer包含N个redisDb,redisDb有dict指针和过期时间指针。核心是dictEntry指针链表的指针,每个具体的dictEntry链表节点存储任意类型的key和value,key和value都可以是redisObject。可以认为指针链表的特性对redis的性能有着重要的影响。Redis中数据结构和存储实现的关系如下:INT压缩存储String,常量数字对象共享。SDS存储字符串、变长字符数组、共享公共字符串等,使用双端列表LINKEDLIST存储列表,支持双向遍历。HT是哈希表,存储set和hash,根据填充率缩放,支持事件触发。INTSET压缩存储集,编码为int16_t/int32_t/int64_t。SKIPLIST存储有序集合,结合dict处理zset。ZIPLIST通过双端指针压缩存储散列、列表和zset。Redis存储实现中的网络模型支持Epoll/Select/Kqueue等,事件模型主要是TimeEvent/FileEvent。由于FileEvent处理器是单线程的,redis是单线程模型。Redis单线程模型是纯内存操作。核心是基于非阻塞IO多路复用机制。单线程模型避免了多线程频繁的上下文切换问题,因此整体存储性能非常高。Redis的常用命令集Redis简单易用。为了方便记忆,命令集分类如下:接入Redis的客户端种类繁多,几乎涵盖了大部分主流编程语言:Redis集群部署Redis从2.4版本开始可以用于生产环境稳定可用。2.6版本引入了Lua脚本和看门狗。2.8版本优化主从同步,开始支持Sentinel和HyperLog。Redis2.x集群主要通过主从同步实现,数据异步复制增量同步。有限状态机在主从同步和数据持久化中起着重要作用。通过快照实现数据持久化,通信协议为RESP,一种易于实现和理解的二进制安全协议。AOF最终通过fsync写入磁盘,实现数据持久化。Redis从3.0开始支持集群,集群内节点之间采用的Gossip分布式协议。根据多数原则判断节点是否宕机,八卦协议传播判断信息,选举新的替代者,八卦协议传播选举结果。RedisCluster可以实现自动故障转移、副本迁移和在线重新分片。分片变更和数据迁移也通过gossip协议约定。但是,Redis集群也有缺点。例如,随着节点的增加,故障转移会显着增加。八卦传播信息需要一段时间,整个机房的切换比较慢。key同步阻塞的迁移对读写影响很大,Gossip协议的调试难度很大,会给排错带来很多不便。关注redis官网,可以看到redis4.0以来的很多新变化。Redis的常见应用Redis的应用范围很广,在key/valueNoSQL中有突出的表现,甚至在某些方面与基于文档的NoSQL-MongoDB有着相似的作用。Redis、Memcache和MongoDB的对比如下图所示:根据用户ID获取用户相关数据是互联网应用中常见的场景。此类数据读写量大,但单条数据长度不长,部分Field更新频繁等,一般采用redis等key/value数据库实现。Redis在内存中递增或递减数字方面做得非常出色。集合(Set)和有序集合(SortedSet)也使得执行这些操作变得非常简单。Redis只是提供了这两种数据结构。因此,对于排行榜场景和分布式锁服务,Redis可以提供高高性能的分布式锁服务,比如电商闪购场景,全局自增ID等。对于系统架构,Redis有时甚至成为缓存的代名词。关于Redis在分布式缓存中的各种应用,可以参考本书的很多章节《深入分布式缓存——从原理到应用》。深入Redis,还可以发现很多有趣的用法,比如用redis做消息队列等,一篇文章很难描述Redis,但可以作为整个栈掌握的基础。【参考阅读】https://www.redislabs.com/https://www.redis.io/http://www.redis.cn/