什么是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、分布式缓存、数据结构等等。

作者: 半吊子全栈工匠