2020最新全栈必备 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,但可以作为全栈需要掌握的一个基础。
最后
私信回复 资料 领取一线大厂Java面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!
这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
作者: 半吊子全栈工匠

2020最新全栈必备 Redis,你还不了解么的更多相关文章
- 全栈必备Linux 基础
Linux 几乎无处不在,不论是服务器构建,还是客户端开发,操作系统的基础技能对全栈来说都是必备的.系统的选择Linux发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行 ...
- 全栈必备Log日志
Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记 ...
- 2020 Web 全栈面经
2020 Web 全栈面经 1.简历 2. 技术 3. 项目 4. 架构 5. 沟通,协作 6.成长 7. 面试技巧 准备 电话确认,面试流程,五险一金缴纳情况 有无笔试,几轮,面试时间,答复时间 细 ...
- Web 全栈开发 Redis 面试题
Web 全栈开发 Redis 面试题 Redis 大 key 问题 https://www.cnblogs.com/xgqfrms/p/13601959.html Redis 数据结构 Redis 初 ...
- 全栈必备 JavaScript基础
1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...
- 全栈必备 Linux 基础
Linux 几乎无处不在,不论是服务器构建,还是客户端开发,操作系统的基础技能对全栈来说都是必备的.系统的选择Linux发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行 ...
- SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分布式日志解决方案,开源微服务全栈项目【有来商城】的日志落地实践
一. 前言 日志对于一个程序的重要程度不用过多的言语修饰,本篇将以实战的方式讲述开源微服务全栈项目 有来商城 是如何整合当下主流日志解决方案 ELK +Filebeat . 话不多说,先看实现的效果图 ...
- 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...
- 全栈开发必备的10款Sublime Text 插件
Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.Sublime Text 更妙的是它的可扩展性.所以,这里挑选了全栈开发必备的10款 Sublime T ...
随机推荐
- 9、ssh的集成方式1
集成方式1:核心 我们没有创建applicationContext-action.xml配置文件,在该配置文件里面让Spring去管理我们的AddUserAction,但是AddUserAction的 ...
- Vue前端压缩图片
一.在组件包下新建compressImage.js // 压缩图片 // eslint-disable-next-line no-unused-vars export function compres ...
- Redis系列之简介和Linux部署教程
##Redis介绍##Redis如今已经成为Web开发社区最火热的内存数据库之一,随着Web2.0的快速发展,再加上半结构数据比重加大,网站对高效性能的需求也越来越多.而且大型网站一般都有几百台或者更 ...
- 半导体质量管理(LineWorks)_SPACE(统计过程分析和控制环境)
LineWorks作为SEMI的质量管理,可为半导体制造商提供对实施标准,产品质量,质量和指标验证的全面控制.有许多附加模块和SPACE-Chart插件,可根据个人需求进行灵活调整. 三个主要特征是: ...
- Nginx 从入门到放弃(一)
Nginx nginx的使用场景 静态资源服务 通过本地文件系统提供服务 反向代理服务 nginx的强大性能 缓存 负载均衡 API服务 OpenResty nginx优点 高并发.高性能 可扩展性好 ...
- 一行一行源码分析清楚AbstractQueuedSynchronizer
“365篇原创计划”第二十四篇. 今天呢!灯塔君跟大家讲: 一行一行源码分析清楚AbstractQueuedSynchronizer 在分析 Java 并发包 java.util.concurren ...
- 大厂前端带来css3动画transition的使用和介绍全新认识动画
CSS3中可以使用transition来做最简单动画效果,transition表示到一个元素的属性值发生变化时,我们可以看到页面元素从旧的属性慢慢变化为新的属性值的过程,这种效果不是立即变化的,而是体 ...
- Vue-base64移动端PDF展示
作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多:做一个移动端PDF预览的功能,本来可以通过window.open(),打开的,但是没办法,做后台的小伙伴,传给前端的数据是ba ...
- Linux使用pyinstaller 编译py成可执行程序
0x00 pyinstall 安装 命令行pip install pyinstaller安装 0x01 编译时使用命令pyinstaller -F -w /root/pyfile/图片GPS位置获取 ...
- Linux多任务编程之一:任务、进程、线程(转)
来源:CSDN 作者:王文松 转自:Linux公社 Linux下多任务介绍 首先,先简单的介绍一下什么叫多任务系统?任务.进程.线程分别是什么?它们之间的区别是什么?,从而可以宏观的了解一下这三者 ...