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 ...
 
随机推荐
- linux下的c语言编程学习笔记
			
视频参看csdn学院王阳和下面的linux环境下c语言编程基础相当的经典,其中王阳的视频讲的很好,相当的经典 编译hellogcc.c需要依赖/home目录下的头文件 为了避免同一个文件被includ ...
 - 入门大数据---Spark_Streaming基本操作
			
一.案例引入 这里先引入一个基本的案例来演示流的创建:获取指定端口上的数据并进行词频统计.项目依赖和代码实现如下: <dependency> <groupId>org.apac ...
 - dart快速入门教程 (3)
			
3.运算符 运算符本质上就是代表某运算规则的符号,例如: + ,这个符号,代表着数学运算里面的加法,按照加法法则进行运算即可,同理,学习运算符就是掌握这些规则而已 3.1.算术运算符 算术运算符主要包 ...
 - 在eclipse中使用maven构建spring cloud微服务
			
使用eclipse中使用maven构建spring cloud微服务,springcloud通过maven构建项目.springcloud项目搭建. 工具/原料 eclipse maven spr ...
 - JS动画三剑客——setTimeout、setInterval、requestAnimationFrame
			
一.前言 前端实现动画效果主要有以下几种方法:CSS3中的transition 和 animation ,Javascript 中可以通过定时器 setTimeout.setinterval,HTML ...
 - 复盘鼎甲科技2020web开发工程师-笔试题(校招)
			
复盘鼎甲科技2020web开发工程师-笔试题(校招) 本试卷以W3C规范为准,JavaScript使用ES5标准,除特别说明外,不考虑各个浏览器之间差异. 一.多项选择题 以下标签是行内元素(inli ...
 - 前段人员必藏的7 个 CSS 好用的属性绝对干货
			
学习CSS是构建好看网页的一种方式. 但是,在学习过程中,我们倾向于(大部分时间)限制自己,一遍又一遍地使用相同的属性. 毕竟,我们是一种习惯性的动物,我们会使用自己习惯且熟悉的东西. 因此,在这篇文 ...
 - Java实现第十一届蓝桥杯JavaB组 省赛真题
			
试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 1921,其中 ...
 - PE文件格式详解(四)
			
0x00 前言 上一篇介绍了区块表的信息,以及如何在hexwrokshop找到区块表.接下来,我们继续深入了解区块,并且学会文件偏移和虚拟地址转换的知识. 0x01 区块对齐值 首先我们要知道啥事区块 ...
 - django框架效率
			
1. django ORM模式提供食物处理类:transaction.Django默认的事务处理方式时改动就提交,每执行一次就立即提交,这就会花费大量的时间用于IO.Django也支持所有工作都完成后 ...