共计 2253 个字符,预计需要花费 6 分钟才能阅读完成。
什么是 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,但能够作为全栈须要把握的一个根底。
最初
私信回复 材料 支付一线大厂 Java 面试题总结 + 阿里巴巴泰山手册 + 各知识点学习思维导 + 一份 300 页 pdf 文档的 Java 外围知识点总结!
这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java 汇合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等。
作者:半吊子全栈工匠