【面试】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只有1MBredis最大可以达到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

 

hash键意义何在,为什么有string类型还要hasn呢?

  1. hash键可以将信息凝聚在一起,而不是直接分散的存储在整个reis中,方便数据管理,还可以尽量避免一些误操作。比如,存储用户信息,商品信息等等
  2. 避免键名冲突;hash 用的是二维结构, key - field -value ;键名(key - field)
  3. 减少内存占用;string 的key可以设置定时过期时间,redis会自动扫描所有的key,但是hash的key不会。

不适合用hash键的情况,对比string

  1. 过期功能的使用,过期功能只能设置在string key上;
  2. 二进制操作命令,如:setbit、getbit、bitop
  3. 需要考虑数据量分布的问题;Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。如果,key都要表名(商品信息表+字段+value的形式存储),则经过哈希哈数后,数据就会落到同一个数据槽。

 

 

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的n种妙用,不仅仅是缓存

Redis的n种妙用,不仅仅是缓存

redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)

 

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集群不错的文章。
 

t推荐 视频 细数Redis在互联网应用中的应用场景

链接:https://pan.baidu.com/s/1ce7n_A0m_Xy9tl9hnmOTvw 
提取码:5uu3 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值