面试中关于Redis的问题看这篇就够了

 就我我的而言,我以为Redis的基本使用是咱们每一个Java程序员都应该会的。另外,若是须要面试的话,一些关于Redis的理论知识也须要好好的学习一下。学完Redis以后,对照着下面8点看看本身还有那些不足的地方,同时,下面7点也是面试中常常会问到的。另外,《Redis实战》、《Redis设计与实现》是我比较推荐的两本学习Redis的书籍。html

  1. Redis的两种持久化操做以及如何保障数据安全(快照和AOF)
  2. 如何防止数据出错(Redis事务)
  3. 如何使用流水线来提高性能
  4. Redis主从复制
  5. Redis集群的搭建
  6. Redis的几种淘汰策略
  7. Redis集群宕机,数据迁移问题
  8. Redis缓存使用有不少,怎么解决缓存雪崩和缓存穿透?

下面就一些问题给你们详细说一下。git

什么是Redis?

Redis 是一个使用 C 语言写成的,开源的 key-value 数据库。。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。目前,Vmware在资助着redis项目的开发和维护。程序员

Redis与Memcached的区别与比较

1 、Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。github

2 、Redis支持数据的备份,即master-slave模式的数据备份。面试

3 、Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用,而Memecache把数据所有存在内存之中redis

四、 redis的速度比memcached快不少算法

五、Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。数据库

Redis与Memcached的区别与比较

若是想要更详细了解的话,能够查看慕课网上的这篇手记(很是推荐) :《脚踏两只船的困惑 - Memcached与Redis》www.imooc.com/article/235…缓存

Redis与Memcached的选择

终极策略: 使用Redis的String类型作的事,均可以用Memcached替换,以此换取更好的性能提高; 除此之外,优先考虑Redis;安全

使用redis有哪些好处?

(1) 速度快,由于数据存在内存中,相似于HashMap,HashMap的优点就是查找和操做的时间复杂度都是O(1)

(2)支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务 :redis对事务是部分支持的,若是是在入队时报错,那么都不会执行;在非入队时报错,那么成功的就会成功执行。详细了解请参考:《Redis事务介绍(四)》:blog.csdn.net/cuipeng0916…

redis监控:锁的介绍

(4) 丰富的特性:可用于缓存,消息,按key设置过时时间,过时后将会自动删除

Redis常见数据结构使用场景

1. String

经常使用命令: set,get,decr,incr,mget 等。

String数据结构是简单的key-value类型,value其实不只能够是String,也能够是数字。 常规key-value缓存应用; 常规计数:微博数,粉丝数等。

2.Hash

经常使用命令: hget,hset,hgetall 等。

Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 好比咱们能够Hash数据结构来存储用户信息,商品信息等等。

举个例子: 最近作的一个电商网站项目的首页就使用了redis的hash数据结构进行缓存,由于一个网站的首页访问量是最大的,因此一般网站的首页能够经过redis缓存来提升性能和并发量。我用jedis客户端来链接和操做我搭建的redis集群或者单机redis,利用jedis能够很容易的对redis进行相关操做,总的来讲从搭一个简单的集群到实现redis做为缓存的整个步骤不难。感兴趣的能够看我昨天写的这篇文章:

《一文轻松搞懂redis集群原理及搭建与使用》: juejin.im/post/5ad54d…

3.List

经常使用命令: lpush,rpush,lpop,rpop,lrange等

list就是链表,Redis list的应用场景很是多,也是Redis最重要的数据结构之一,好比微博的关注列表,粉丝列表,最新消息排行等功能均可以用Redis的list结构来实现。

Redis list的实现为一个双向链表,便可以支持反向查找和遍历,更方便操做,不过带来了部分额外的内存开销。

4.Set

经常使用命令: sadd,spop,smembers,sunion 等

set对外提供的功能与list相似是一个列表的功能,特殊之处在于set是能够自动排重的。 当你须要存储一个列表数据,又不但愿出现重复数据时,set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。Redis能够很是方便的实现如共同关注、共同喜爱、二度好友等功能。

5.Sorted Set

经常使用命令: zadd,zrange,zrem,zcard等

和set相比,sorted set增长了一个权重参数score,使得集合中的元素可以按score进行有序排列。

举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各类礼物排行榜,弹幕消息(能够理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行存储。

MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据(redis有哪些数据淘汰策略???)

   相关知识:redis 内存数据集大小上升到必定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:

  1. volatile-lru:从已设置过时时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过时时间的数据集(server.db[i].expires)中挑选将要过时的数据淘汰
  3. volatile-random:从已设置过时时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-enviction(驱逐):禁止驱逐数据

Redis的并发竞争问题如何解决?

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis自己没有锁的概念,Redis对于多个客户端链接并不存在竞争,可是在Jedis客户端对Redis进行并发访问时会发生链接超时、数据转换错误、阻塞、客户端关闭链接等问题,这些问题均是因为客户端链接混乱形成。对此有2种解决方法:

 1.客户端角度,为保证每一个客户端间正常有序与Redis进行通讯,对链接进行池化,同时对客户端读写Redis操做采用内部锁synchronized。   2.服务器角度,利用setnx实现锁。

 注:对于第一种,须要应用程序本身处理资源的同步,可使用的方法比较通俗,可使用synchronized也可使用lock;第二种须要用到Redis的setnx命令,可是须要注意一些问题。

Redis回收进程如何工做的? Redis回收使用的是什么算法?

Redis内存回收:LRU算法(写的很不错,推荐)www.cnblogs.com/WJ5888/p/43…

Redis 大量数据插入

官方文档给的解释:www.redis.cn/topics/mass…

Redis 分区的优点、不足以及分区类型

官方文档提供的讲解:www.redis.net.cn/tutorial/35…

Redis持久化数据和缓存怎么作扩容?

《redis的持久化和缓存机制》github.com/Snailclimb/…

扩容的话能够经过redis集群实现,以前作项目的时候用过本身搭的redis集群 而后写了一篇关于redis集群的文章:《一文轻松搞懂redis集群原理及搭建与使用》juejin.im/post/5ad54d…

Redis常见性能问题和解决方案:

  1. Master最好不要作任何持久化工做,如RDB内存快照和AOF日志文件
  2. 若是数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
  3. 为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网内
  4. 尽可能避免在压力很大的主库上增长从库

Redis与消息队列

做者:翁伟 连接:https://www.zhihu.com/question/20795043/answer/345073457

不要使用redis去作消息队列,这不是redis的设计目标。但实在太多人使用redis去作去消息队列,redis的做者看不下去,另外基于redis的核心代码,另外实现了一个消息队列disque: antirez/disque:github.com/antirez/dis…部署、协议等方面都跟redis很是相似,而且支持集群,延迟消息等等。

我在作网站过程接触比较多的仍是使用redis作缓存,好比秒杀系统,首页缓存等等。

好文Mark

很是很是推荐下面几篇文章。。。

《Redis深刻之道:原理解析、场景使用以及视频解读》zhuanlan.zhihu.com/p/28073983: 主要介绍了:Redis集群开源的方案、Redis协议简介及持久化Aof文件解析、Redis短链接性能优化等等内容,文章干货太大,容量很大,建议时间充裕能够看看。另外文章里面还提供了视频讲解,能够说是很是很是用心了。

《阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统》:yq.aliyun.com/articles/58…: 主要介绍视频直播间系统,以及如何使用阿里云Redis混合存储实例方便快捷的构建大数据量,低延迟的视频直播间服务。还介绍到了咱们以前提升过的redis的数据结构的使用场景

《美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问》carlosfu.iteye.com/blog/225457…:主要介绍了redis集群的两个常见问题,而后分享了 一些关于redis集群不错的文章。

参考:

https://www.cnblogs.com/Survivalist/p/8119891.html

http://www.redis.net.cn/tutorial/3524.html

https://redis.io/

欢迎关注个人微信公众号:"Java面试通关手册"(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美文,分享各类Java学习资源):

微信公众号
相关文章
相关标签/搜索