一个菜鸟驿站!

面试中关于Redis的问题以及见解

PHP 2018-04-22 浏览(1816) 评论(0)
- N +

文章目录 [+]

简单的一份关于Redis面试题汇总(这是我能想起来的,可以在下边多多补充哈)

Redis与Memcached区别

  1. 1.Redis支持string,hash,list,set等数据结构的存储,memcached只支持string类型的存储。

  2. 2.Redis支持数据的备份。

  3. 3.Redis支持数据的持久化,可以将内存的数据保存到磁盘当中去,当重启之后可以拿出来继续使用,但是Memcached只能放在内存中使用。

  4. 4.RedisMemcached速度要快。

  5. 5.Redis是单线程的IO复用模式,但是Memcache是使用多线程的非阻塞IO复用网络模型。

  6. 6.Redis支持事务批量操作



  7. :就例如我以前的一个商城的首页就用使用了Redis的Hash数据结构进行缓存,因为一个网站的首页访问量往往是很大的,所以通常网站的首页就可以用Redis缓存来提高性能和并发量,我用jedis客户端来连接和操作我搭建的Redis群集或者单机Redis,利用jedis可以很轻松的操作Redis,总的来说从搭建一个简单的群集到实现Redis缓存的整个步骤不难,感兴趣的可以去下边的博文去学习下。链接...

    3.List

    常用命令:lpush,rpush,lpop,lrange等

    List就是链表,Redis中List的应用非常多,也是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. 1.colotile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。

    2. 2.volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期时间的数据淘汰。

    3. 3.volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。

    4. 4.allkeys-lru从数据集(server.db[i].dict)中挑选最近最少使用的数据集淘汰。

    5. 5.allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。

    6. 6.no-enviction(驱逐)禁止驱逐数据。

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

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

    1. 1.客户端角度,为保证每个客户端间正常有序的与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized

    2. 2.服务器角度,利用setnx实现锁。

    注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的Setnx命令。

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

    1. 1.Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。

    2. 2.如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。

    3. 3.为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。

    4. 4.尽量避免在压力很大的主库上边增加从库。

    Redis与消息队列

    作者:翁伟,链接:https://www.zhihu.com/question/20795043/answer/345073457

    不要使用Redis去做消息队列,这不是Redis的设计目标。但实在太多人拿Redis去做消息队列,Redis的作者看不下去了,另外基于Redis的核心代码,另外实现了一个消息队列disque。部署协议等方面都和Redis非常的相似,并且支持群集,延迟消息等等。


    我接触到的Redis一般用来做缓存,如秒杀系统,首页缓存等等。


标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔