Redis之基础入门(一)

Redis基础入门

请你简单介绍一下Redis是什么。

答:
Redis本质上是一个Key-Value类型的内存数据库,
是已知性能最快的Key-Value DB,可达每秒十万次操作。
是非关系型的数据库(NoSql),区别与Mysql关系型数据库。
适合的场景主要局限在较小数据量的高性能操作和运算上。

请你对Redis和Mysql做一下对比。

答:
前者是非关系型数据库,后者是关系型数据库。
前者是键值对,后者是二维表结构。
前者基于内存作了优化,后者基于硬盘作了优化。
前者保存数据容量受内存空间限制,后者容量受硬盘空间限制。
前者IO速度非常快,主要应对读取操作,
后者IO速度慢,遇到高并发时往往需要搭配Redis缓存使用。

谈谈Redis和memcached的区别。

答:
Redis对Memcached只有功能升级没有降级。
Redis支持AOF和RDB持久化,Memcached不支持持久化。
Redis是单线程,Memcached是多线程。
Redis支持的格式比Memcached多。
Redis的小文件速度比Memcached快。
Redis3.X原生支持集群模式,Memcached要靠客户端分片写入。

Redis为什么单线程却可以高性能?

答:
数据全都在内存里,单线程去操作效率最高。
多线程的本质是CPU通过轮换时间片执行不同的线程,
内存io操作百ns内完成,Cpu上下文切换需要千ns。
单线程避免了线程切换和竞态产生的消耗。
利用队列技术将并发访问变为串行访问。

Redis的缺点有那些?

答:
单线程非阻塞的IO多路复用这决定了任务必须短而小。
它具有很大的持久性开销。
缓存雪崩问题
缓存击穿问题
缓存的并发竞争问题

解释一下,缓存穿透、缓存击穿、缓存雪崩、缓存与数据库双写一致性的问题。

答:
缓存穿透是指多次故意构造出键不存在的记录,实现绕过redis查数据库。
解决办法是,即使查询结果是空也缓存这个值,并设置过期时间。


缓存击穿是指大并发量访问某些刚好到期的key,实现绕过redis查数据库。
解决方法是,设置热点key的过期日期自动加大 或者 加互斥锁下下策。


缓存雪崩是指大规模的键发生缓存到期,更新这些键对数据库压力很大。
解决办法,设置过期时间时加一个随机数。

缓存和数据库双写一致性问题

答:
可以先删除缓存再更新,更新期间若有读请求过来,
读请求会进行更新缓存,更新缓存操作放队列里积压着。
简单地说得根据业务来改具体操作,强一致性就需要悲观锁。

Redis怎么利用多CPU/核?

答:
用多个实例利用上多个核心,设为不同的服务器而不是Slave。
Redis的瓶颈在内存上,单实例可以做到5-6W的QPS。
通常生产中实例数量在32-64个,这时Redis受限于内存或网络。

Redis内存不足时会发生什么,如何避免内存不足?

答:
被系统内核杀掉,或抛出错误崩溃,swap交换变得卡顿。
简单的通过配置maxmemory,设置最大占用内存。
或者使用Info命令监控内存总量,及时驱逐不必要的键。

介绍Redis的常用数据类型有那些经典应用场景。

答:
1.最常用的是String,这和Memcached一模一样,最简单的k-v存储。
可以是一张图片验证码可二进制表示,短信验证码等,要设置过期时间。
2.hash类型,value为field和value,适合ID-Detail这样的场景,
比如商品id,商品详情。
3.list类型,支持首位或者末尾插入数据。
比如时间排序,最新的股票咨询。
4.set类型,是hash类型的升级版,支持交集、并集、差集操作。
比如查找两个人共同的好友。
5.sorted set类型,是set的有序版本,可以进行排序。
比如给某个主播冲钱的排行榜,总排行榜。

有一个需求,用Redis做一个秒杀抢购的电商应用,
简要介绍下从展示,下单到订单完成,Redis要如何使用。

答:
两个思路:
数据尽量缓存,用户不能等待数据库的IO操作。
通过锁来控制避免超卖现象。
具体地有:
商品宣传时,要把商品的数据放进Redis中用Hash类型中保存,设置过期时间。
需要秒杀的商品放在Redis List中。
商品库存数据用sorted Set保存。
订单扣除库存时用分布式锁,库存同步扣除。
发货的数据信息用List保存,通过MQ处理。
秒杀结束后,把数据从内存中同步到数据库中。

关于Redis的持久化,下列描述错误的是:(最后一项D)

A、RDB是以快照的形式,将内存中的数据整体拷贝到硬盘上。
B、AOF操作的实时性好,但是产生的数据体积大,数据的恢复速度慢。
C、执行RDB存储时会产生阻塞,因此RDB不适合实时备份,而适合定时备份。
(fork一个新线程,就不阻塞了,但确实不适合实时备份)

D、AOF是以日志形式,将内存中的数据整体拷贝到硬盘上。(说法错误,错在整体两字。)
(AOF以独立日志方式记录每次写新增加命令。新的数据会追加到AOF文件的末尾)

关于Redis的概念,下列描述正确的是(ABCDE)

A、Redis提供了对值进行运算的命令,如对集合求交集、并集、差集等。
B、Redis以键值对的形式,将数据存储于内存中,其所有的key都是字符串类型。
C、Redis的值支持多种数据类型,包括字符串、哈希、列表、集合、有序集合等。
D、NoSQL是关系型数据库之外的数据库的统称,Redis是一个NoSQL数据库。
E、Redis key值可以是任何二进制序列,建议短些,越短理论上越快。

Redis分区实现方案有那些?

答:
Redis集群就是分区的一种的实现,用的是官方集群。
有三个方案:
1.客户端分区,Memcached也支持,在客户端决定要把数据存到哪个分片内。
2.代理分区,Memcached也支持,询问代理,由代理来全权操作存到哪。
3.查询路由,实现了一种混合形式的查询路由。
   (客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。)

实际生产中,即使业务数据量不大也用16-64个实例,为什么?

答:
预防重新分区的情况发生,这将给以后扩容带来方便,
最好的办法就是一开始就启动较多实例,让Redis以分布式的方式运行,
使用分区,等业务量大了,仅仅将Redis实例从一台服务迁移到另外一台服务器而已。

Redis的Cli常用命令有那些?

答:
info memory     查看redis大的内存使用情况
redis client    查看redis当前客户端的连接情况 
redis-cli	    redis命令行工具
redis-server 	启动redis
redis-benchmark	基准测试工具
redis-check-aof	 AOF持久化文件检测工具和修复工具
redis-check-dump   RDB持久化文件检测工具和修复工具
redis-sentinel	 启动redis-sentinel

Redis的缓存淘汰策略有那些?

答:
使用LRU算法淘汰,淘汰设置过期时间的数据。
使用ttl算法淘汰,淘汰设置过期时间的数据。
使用ramdom方式淘汰。
禁止淘汰。

下面关于Redis描述正确的是(ABC)

A、Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(对,让slave做)
B、如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
C、为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
D、主从复制不要用单向链表结构,用图状结构更为稳定(错,用链状稳定)
 (链状利于解决单点故障,实现Slave对Master的替换。)

Redis集群的主从复制模型是怎样的?

答:
大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,
每个节点都会有N-1个复制品.

关于redis下面说法正确的是(ABC)
A、Redis主要消耗内存资源
B、Redis集群之间是异步复制的
C、分区可以让Redis管理更大的内存
D、Redis集群使用一致性hash(说法错误,使用数据分片引入哈希槽实现)
(hash slot分区使用hash函数将数据映射到一个固定范围的整数集合中(0-16383))

Redis哈希槽的概念?

答:
Redis没有使用一致性hash,而是引入了哈希槽的概念,集群预设16384个桶(哈希槽),
要存值时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

为什么避免在压力很大的主库上增加从库?

答:
主从复制模型,每个节点都会有N-1个复制品,通过异步复制,同步过程消化M的资源。
Master会将数据同步到slave,而slave不会将数据同步到master。
可以利用master来插入数据,slave提供检索服务。
这样可以有效减少单个机器的并发访问数量。

谈谈你对主库和从库的理解

答:
一台主库可有多个从库,但是一个从库只属于一个主库。
主库只负责写数据,数据更新同步到它所有的从库,而从库只负责读数据。

单台Redis的容量建议最大是多少,为什么?

答:
建议不超过20G,
单个Redis服务器压力较大,若发生单点故障损失大;
提升稳定性可以在单机上用多几个Redis实例,如Master DB做双机热备,一主二从。
这样整个集群的读和写的可用性都非常高,

Redis分区的优缺点有那些?

答:
优点,数据存储更有规律
整合了多个服务器的存储空间、计算能力、网络带宽等。
进一步充分利用大内存,
分区是将数据分割到不同的Redis实例的过程,
缺点,分区使得数据处理更复杂,比如备份数据需要备份每个实例服务器上的所有数据。
发布了96 篇原创文章 · 获赞 172 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/ai_64/article/details/100753920