文章来源:https://www.jianshu.com/p/36a646cef11a
作者:Java成功之路
长话短说用自己话转述一下,也加深下印象
面试题
1、什么是Redis?简述它的优缺点?
它是一个key-value的数据库,纯内存的操作(也因此高性能),然后通过定期的异步操作再把数据同步到磁盘里面,拥有可耻就花的优点,断电之后依然可以保存数据。它拥有丰富的数据结构,缺点是 受制于物理内存的大小,不能做海量的高性能数据读写。
2、那它有什么丰富的数据结构?
set、list、Sorted Set(zset)、hashes、String
3、一个字符串类型的值能存储最大容量是多少?
512M
4、那说说Redis的适用场景。
(1)会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?
幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。
(2)全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。
此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
(3)队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。
(4)排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:
当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
(5)发布/订阅
最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!
5、Redis怎么设置密码
设置密码:config set requirepass 123456
授权密码:auth 123456
6、Redis事务相关的命令有哪些?
MULTI、EXEC、DISCARD、WATCH
7、Redis怎么保证自己的数据是热点数据?
会实行数据淘汰策略。
8、什么淘汰策略?说来听听。
①、近似LRU算法。抽取少量的 key 样本, 然后删除其中访问时间最古老的那个key。不用完全LRU是可以用来节省内存。
②、驱逐策略。
random:随机删除一部分key
volatile-random:在expire的部分,....
LRU:.....
volatile-LRU:在expire的部分里,优先删除最古老的key
volatile-ttl: 在expire的部分里,优先删除剩余时间小的key。
9、Redis和Redisson有什么关系?
Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象。Redis的客户端。
10、Redis集群方案怎么做(集群我还没学到鸭)
①.codis。
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。
②.redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。
③.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等
11、Redis集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品。异步复制、
12、Redis集群方案什么时候会导致这个集群不可用
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
13、说说你对Redis中事务的理解。
事务是一个原子性的操作,只有分操作完成和操作失败,中途事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务库常用到的命令有:MULTI、EXEC、DISCARD、WATCH。
14、Redis回收进程如何工作的?
一个客户端运行了新的命令,添加了新的数据。
Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。
一个新的命令被执行,等等。
所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。