赞
踩
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复
杂度都很低
(2)支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
主要从“高性能”和“高并发”这两点来看待这个问题。
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于
HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换
而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致
的性能消耗;
4、使用多路 I/O 复用模型,非阻塞 IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis
直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请
求
数据类型 | 可以存储的值 | 操作 | 应用场景 |
---|---|---|---|
String | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作 | 做简单的键值对缓存 |
List | 列表 | 从两端亚茹或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素 | 存储一些列表型的数据结构,类似粉丝列表,文章的评论列表之类的数据 |
Set | 无序集合 | 添加、获取、移除单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素 | 交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集 |
Hash | 包含键值对的无序散列表 | 添加、获取、溢出单个键值对,获取所有键值对,检查某个键值是否存在 | 结构化的数据,比如一个对象 |
ZSet | 有序集合 | 各级分值范围或者成员来获取元素,计算一个键的排名 | 去重但可以排序,如获取排名前几名的用户 |
我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
Redis中同时使用了惰性过期和定期过期两种过期策略。
两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。
Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event
handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因
为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件
处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的
模块进行对接, 这保持了 Redis 内部单线程设计的简单性。
事务执行过程中,如果服务端收到有EXEC、DISCARD、WATCH、MULTI之外的请求,将会把请求放入队列中排队
Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的
Redis会将一个事务中的所有命令序列化,然后按顺序执行。
Redis的事务总是具有ACID中的一致性和隔离性,其他特性是不支持的。当服务器运行在_AOF_持久化模式下,并且appendfsync选项的值为always时,事务也具有耐久性。
哨兵的介绍
sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能:
哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
哨兵的核心知识
简介
方案说明
节点间的内部通信机制
分布式寻址算法
优点
缺点
简介
优点
优势在于非常简单,服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样
运行,非常容易线性扩展,系统的灵活性很强
缺点
简介
特征
业界开源方案
redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发
注意:
redis 主从复制的核心原理
过程原理
缺点
其实大型的公司,会有基础架构的 team 负责缓存集群的运维。
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接
并不存在竞争关系Redis中可以使用setNx命令实现分布式锁。
当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 已经存在,则 setNx不做任何动作
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
返回值:设置成功,返回 1 。设置失败,返回 0 。
使用setNx完成同步锁的流程及事项如下:
使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功
为了防止获取锁后程序出现异常,导致其他线程/进程调用setNx命令总是返回0而进入死锁状态,
需要为该key设置一个“合理”的过期时间释放锁,使用DEL命令将锁数据删除
在实践中,当然是从以可靠性为主。所以首推Zookeeper。
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,
仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可
以配置开关实现人工降级。
缓存降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购
物车、结算)。
在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保
护,哪些可降级;比如可以参考日志级别设置预案:
服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不
重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去
数据库查询,而是直接返回默认值给用户。
对比参数 | Redis | Memcached |
---|---|---|
类型 | 1. 支持内存 2. 非关系型数据库 | 1. 支持内存 2. 键值对形式 3. 缓存形式 |
数据存储类型 | 1. String 2. List 3.Set 4. Hash 5.Sort Set 【俗称ZSet】 | 1. 文本型 2. 二进制类型 |
查询【操作】类型 | 1. 批量操作 2. 事务支持 3. 每个类型不同的CRUD | 1.常用的CRUD 2. 少量的其他命令 |
附加功能 | 1. 发布/订阅模式2. 主从分区 3. 序列化支持 4. 脚本支持【Lua脚本】 | 1. 多线程服务支持 |
网络IO模型 | 1. 单线程的多路IO 复用模型 | 1. 多线程,非阻塞IO模式 |
事件库 | 自封转简易事件库AeEvent | 贵族血统的LibEvent事件库 |
持久化支持 | 1. RDB 2. AOF | 不支持 |
集群模式 | 原生支持 cluster模式,可以实现主从复制,读写分离 | 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据 |
内存管理机制 | 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘 | Memcached 的数据则会一直在内存中,Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的28 bytes就浪费掉了。 |
适用场景 | 复杂数据结构,有持久化,高可用需求,value存储内容较大 | 纯key-value,数据量非常大,并发量非常大的业务 |
问题场景 | 描述 | 解决 |
---|---|---|
先写缓存,再写数据库,缓存写成功,数据库写失败 | 缓存写成功,但写数据库失败或者响应延迟,则下次读取(并发读)缓存时,就出现脏读 | 这个写缓存的方式,本身就是错误的,需要改为先写数据库,把旧缓存置为失效;读取数据的时候,如果缓存不存在,则读取数据库再写缓存 |
先写数据库,再写缓存,数据库写成功,缓存写失败 | 写数据库成功,但写缓存失败,则下次读取(并发读)缓存时,则读不到数据 | 缓存使用时,假如读缓存失败,先读数据库,再回写缓存的方式实现 |
需要缓存异步刷新 | 指数据库操作和写缓存不在一个操作步骤中,比如在分布式场景下,无法做到同时写缓存或需要异步刷新(补救措施)时候 | 确定哪些数据适合此类场景,根据经验值确定合理的数据不一致时间,用户数据刷新的时间间隔 |
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
史上最全Java面试宝典,BAT大厂面试必备。整理不易,建议先关注点赞加收藏
序号 | 名称 | 地址 |
---|---|---|
1 | Java基础面试题(91道含答案) | (点击查看) |
2 | Java并发编程面试题 (123道含答案) | (点击查看) |
3 | Java异常面试题 (33道含答案) | (点击查看) |
4 | Java虚拟机(JVM)面试题(51道含答案) | (点击查看) |
5 | Java集合面试题(52道含答案) | (点击查看) |
6 | Linux面试题(50道含答案) | (点击查看) |
7 | Memcache面试题(23道含答案) | (点击查看) |
8 | Mybatiss面试题 (37道含答案) | (点击查看) |
9 | MySQL面试题(40道含答案) | (点击查看) |
10 | Netty面试题(49道含答案) | (点击查看) |
11 | Nginx面试题(23道含答案) | (点击查看) |
12 | RabbitMQ面试题(22道含答案) | (点击查看) |
13 | Redis面试题(70道含答案) | (点击查看) |
14 | SpringBoot面试题(44道含答案) | (点击查看) |
15 | SpringCloud面试题(49道含答案) | (点击查看) |
16 | SpringMVC面试题(29道含答案) | (点击查看) |
17 | Spring面试题(75道含答案) | (点击查看) |
18 | TCP、UDP、Socket、Http网络编程面试题(47道含答案) | (点击查看) |
19 | Tomcat面试题(15道含答案) | (点击查看) |
20 | Zookeeper面试题(28道含答案) | (点击查看) |
21 | 多线程面试题(60道含答案) | (点击查看) |
22 | 设计模式面试题(14道含答案) | (点击查看) |
23 | BIO、NIO、AIO、Netty面试题(35道含答案) | (点击查看) |
24 | Dubbo面试题(47道含答案) | (点击查看) |
25 | ElasticSearch面试题(31道含答案) | (点击查看) |
26 | Git常用命令(63条) | (点击查看) |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。