点击上方 Java后端,选择 设为星标
优质文章,及时送达
Redis应该算面试中必问的一个知识点,但是发现很多童鞋并不熟悉这块,这篇就常见的一些问题做一些整理,有不对的地方欢迎留言指正!
1.Redis支持的数据类型?
String(字符串)
格式: set key value
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一个键值(key=>value)对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value 相同的元素
格式: llen name
返回 key 对应 list 的长度
Set(集合)
格式: sadd name value
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
2.什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供了两种持久化方式:RDB(默认) 和AOF
RDB:
rdb是Redis DataBase缩写
功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数
AOF:
Aof是Append-only file缩写
每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作
aof写入保存:
-
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件
-
SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
-
aof文件比rdb更新频率高,优先使用aof还原数据。
-
aof比rdb更安全也更大
-
rdb性能比aof好
-
如果两个都配了优先加载AOF
RESP 是redis客户端和服务端之前使用的一种通讯协议;
For Simple Strings the first byte of the reply is "+" 回复
For Errors the first byte of the reply is "-" 错误
For Integers the first byte of the reply is ":" 整数
For Bulk Strings the first byte of the reply is "$" 字符串
For Arrays the first byte of the reply is "*" 数组
持久化在面试中问到的频率较高,重点学一下,篇幅有限,具体点下面的文章:
10分钟彻底理解Redis的持久化机制:RDB和AOF
3.Redis 有哪些架构模式?讲讲各自的特点
单机版
-
内存容量有限
-
处理能力有限
-
无法高可用。
主从复制
-
master/slave 角色
-
master/slave 数据相同
-
降低 master 读压力在转交从库
-
无法保证高可用
-
没有解决 master 写的压力
哨兵
-
监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
-
提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
-
自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
-
保证高可用
-
监控各个节点
-
自动故障迁移
-
主从模式,切换需要时间丢数据
-
没有解决 master 写的压力
集群(proxy 型)
-
多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
-
支持失败节点自动删除
-
后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
-
增加了新的 proxy,需要维护其高可用。
-
failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预
集群(直连型):
-
无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
-
数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
-
可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
-
高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
-实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。
-
资源隔离性较差,容易出现相互影响的情况。
-
数据通过异步复制,不保证数据的强一致性
4.使用过Redis分布式锁么,它是怎么实现的?
5.使用过Redis做异步队列么,你是怎么用的?有什么缺点?
缺点:
-
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。
6.什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?
缓存穿透
-
对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
-
对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存雪崩
-
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
-
做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
-
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
7.Redis常用命令
# dbsize 返回当前数据库 key 的数量。
# info 返回当前 redis 服务器状态和一些统计信息。
# monitor 实时监听并返回redis服务器接收到的所有请求信息。
# shutdown 把数据同步保存到磁盘上,并关闭redis服务。
# config get parameter 获取一个 redis 配置参数信息。(个别参数可能无法获取)
# config set parameter value 设置一个 redis 配置参数信息。(个别参数可能无法获取)
# config resetstat 重置 info 命令的统计信息。(重置包括:keyspace 命中数、
# keyspace 错误数、 处理命令数,接收连接数、过期 key 数)
# debug object key 获取一个 key 的调试信息。
# debug segfault 制造一次服务器当机。
# flushdb 删除当前数据库中所有 key,此方法不会失败。小心慎用
# flushall 删除全部数据库中所有 key,此方法不会失败。小心慎用
工具命令
#redis-server:Redis 服务器的 daemon 启动程序
#redis-cli:Redis 命令行操作工具。当然,你也可以用 telnet 根据其纯文本协议来操作
#redis-benchmark:Redis 性能测试工具,测试 Redis 在你的系统及你的配置下的读写性能
$redis-benchmark -n 100000 –c 50
#模拟同时由 50 个客户端发送 100000 个 SETs/GETs 查询
#redis-check-aof:更新日志检查
#redis-check-dump:本地数据库检查
8.Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比
9.为什么Redis 单线程却能支撑高并发?
10.Redis常见性能问题和解决方案:
11.Redis的并发竞争问题如何解决?
-
客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
-
服务器角度,利用setnx实现锁。
Redis的内存淘汰策略
13.Redis最适合的场景
-
Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
-
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
会话缓存(Session Cache)
全页缓存(FPC)
队列
排行榜/计数器
ZRANGE user_scores 0 10 WITHSCORES
发布/订阅
。同时标星(置顶)本公众号可以第一时间接受到博文推送。
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。