- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章几道常问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)却可以重复.
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失.
Redis 提供了两种持久化方式:RDB(默认) 和AOF 。
RDB:
rdb是Redis DataBase缩写 。
功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数 。
AOF
Aof是Append-only file缩写 。
每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作 。
aof写入保存:
存储结构
内容是redis通讯协议(RESP )格式的命令文本存储.
比较:
刚刚上面你有提到redis通讯协议(RESP ),能解释下什么是RESP?有什么特点?(可以看到很多面试其实都是连环炮,面试官其实在等着你回答到这个点,如果你答上了对你的评价就又加了一分) 。
RESP 是redis客户端和服务端之前使用的一种通讯协议; 。
RESP 的特点:实现简单、快速解析、可读性好 。
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 "*" 数组 。
单机版 。
特点:
简单 。
问题:
主从复制 。
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave).
只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同.
特点:
问题:
哨兵 。
Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:
特点:
保证高可用监控各个节点自动故障迁移 。
缺点:
集群(proxy 型) 。
Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器;Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议.
特点:
缺点:
集群(直连型):
从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.
特点:
缺点:
高可用Redis架构分析搭建,可以参考:
高可用Redis服务架构分析与搭建 。
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放.
如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的! 。
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试.
缺点:
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等.
能不能生产一次消费多次呢?
使用pub/sub主题订阅者模式,可以实现1:N的消息队列.
缓存穿透 。
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透.
如何避免?
缓存雪崩 。
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃.
如何避免?
这道相当常见,详细再参考下文,一定熟练掌握:
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:本地数据库检查 。
Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比 。
为什么Redis 单线程却能支撑高并发?
1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照.
2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次.
3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象.
4).Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内 。
Redis性能分析相关问题,限于篇幅,给出文章链接:
Redis 性能问题分析(好文推荐) 。
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:
注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题.
直接点这里:Redis的内存淘汰策略 。
Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?
如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:
会话缓存(Session Cache) 。
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?
幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件.
全页缓存(FPC) 。
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC.
再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端.
此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面.
队列 。
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作.
如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看.
排行榜/计数器 。
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”.
当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGE user_scores 0 10 WITHSCORES 。
Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。发布/订阅 。
最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统! 。
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/weixin_39709134/article/details/116867076 。
最后此篇关于几道常问Redis面试题,你能答对吗?的文章就讲到这里了,如果你想了解更多关于几道常问Redis面试题,你能答对吗?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!