【面试】Redis面试常见问题总结

 Redis是单进程单线程的,

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。

Redis快的主要原因是:

  1. 完全基于内存
  2. 数据结构简单,对数据操作也简单
  3. 使用多路 I/O 复用模型

redis 的单进程单线程的,利用队列技术,将并发访问变为串行访问,消除了传统数据库在串行控制的开销。

 Redis关于线程安全问题

 redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。

1. 使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash 
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 
(2) redis的速度比memcached快很多 
(3) redis可以持久化其数据,

Redisä¸Memcachedçåºå«ä¸æ¯è¾

详细了解 ,这篇手记 https://www.imooc.com/article/23549

3. Memcache与Redis的区别都有哪些?

存储方式 Memecache把所有数据存放在内存,断电数据会丢失,数据不能大于内存容量。 redis部分数据在磁盘,数据持久性。
数据支持类型 Memecache支持相对简单数据类型 redis支持五大数据类型,string,hash,list,set,storeset,
使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
value大小 memcache只有1MB redis最大可以达到1GB

4. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略
voltile-lru 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volitile-ttl 从已设置过期时间的数据集(server.db[i].expires)中挑选即将过期的数据淘汰
volatile-random 从已设置过期时间的数据集(server.db[i].expires)中随机挑选数据淘汰
allkeys-lru 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random 从数据集server.db[i].dict)中挑选任意数据进行淘汰
no-enviction(驱逐) 禁止驱逐数据

推荐   Redis内存回收:LRU算法:https://www.cnblogs.com/WJ5888/p/4371647.html

 

5.Redis常见数据结构使用场景

      Redis官网  : http://www.redis.net.cn/order/3549.html

1. String

常用命令: set,get,decr,incr,mget 等。
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 
常规key-value缓存应用; 
常规计数:微博数,粉丝数等。

2.Hash

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

hash是一个string类型的filed和value的映射表,适合存储对象。可以用hash结构来存储用户信息,商品信息等等。

推荐阅读 ,《一文轻松搞懂redis集群原理及搭建与使用》: https://juejin.im/post/5ad54d76f265da23970759d3

3.List 

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

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结构进行存储。

6.虚拟内存

key小value大 使用VM的效果会比较好.因为这样节约的内存比较大
key大 可以考虑使用一些非常方法将很大的key变成更大的value。比如可以考虑将key,value组合成一个新的value.
vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

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

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

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

猜你喜欢

转载自blog.csdn.net/fcvtb/article/details/89164429