Redis的一些面试题
什么是Redis
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
简单来说:C语言开发,单线程,基础内存操作,内存操作是很快,例如(商品的大分类,不会经常变更,但是每次都会查,这样放在Redis要比直接查省性能)
优点
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
支持数据持久化,支持AOF和RDB两种持久化方式。
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
主要从“高性能”和“高并发”。请求量小,完全没必要,任何的中间的件都会占用线上服务器资源,而且可能会出现中间件底层问题
支持的数据类型
(一)String
做一些复杂的计数功能的缓存。
(二)hash
保存实体,例如可做用户单点保存实体
(三)list
利用lrange命令,做基于redis的分页功能
可以实现简单的消息队列的功能。
list可以很好的完成排队,先进先出的原则。
(四)set
去重,性能很好
(五)sorted set
可配置权重,做排行的操作,是可行的
缓存雪崩
我们可以简单的理解为:原有的缓存大面积同一时刻过期,这一时刻大量请求又过来,原本查询缓存数据,全部查询数据库了
解决办法:
加锁或者队列或者过期时间分散开
缓存穿透
缓存穿透是指查询数据,在数据库没有,缓存中也不会有。查询两次,浪费资源
解决办法;
1.布隆过滤器:个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
布隆过滤器的误判率:是存在的数据存在误判。但是不存在布隆过滤器的一定不存在。
2.查询数据库,没有的值缓存在rdeis,设置过期时间
缓存击穿
热点高的一个缓存数据,过期的瞬间,大量请求过来,导致直接绕过缓存去查数据库。
解决办法;
采用SETNX锁住这个值,结束请求后删除
Memcache与Redis的区别都有哪些?
1.Memcache纯内存,宕机和断点会导致缓存数据丢失;Redis存在AOF(实时备份效率低set就备份)和RDB(可配置的定时备份)的策略,可持久化数据。
2.Memcache智能操作String,Redis是5种数据类型。
3.Redis 最大存储数据大小512M;memcache 最大 1mb。
4.Redis速度高于Memcache。
5.底层协议不同
单线程的redis为什么这么快
纯内存操作,非阻塞IO,单线程避免了上下文切换
redis的过期策略以及内存淘汰机制
redis默认定期删除策略:redis每个100ms随机抽取进行检查部分
redis默认惰性删除:获取某个key的时候,redis会检查一下当前key的过期时间,过期删除
除了以上在配置redis的redis.conf中有一行配置
这是必须要配置的策略(6种):
1.volatile-lru -> 在设定了超时时间的数据中,查找最近最少使用的数据进行删除
2.allkeys-lru -> 在所有的key中查询最近最少使用的数据进行删除
3.volatile-random -> 在设定了超时时间的数据中随机进行删除.
4.allkeys-random -> 在所有的key中进行随机的删除
5.volatile-ttl -> 删除最接近超时时间的数据
6.noeviction ->不做删除处理.只是返回报错信息.
默认使用是第6种
redis的分片处理
在不降低redis的效率的前提下使用分片操作,可以动态的对redis的内存进行扩容.
redis内存采用hash一致性算法
均衡性
说明:经过hash值运算结果,尽可能的让数据均匀的分配到节点中,保证数据的均衡性.
每个节点中的数据最好保持1/n的数据
单调性
说明:由于节点的新增.这时的数据应该动态的迁移.这种特性叫做单调性.
规则:已经挂载好的数据,原有节点尽可能保持不变.
分散性
原则:一个key经过hash计算后的位置一定是唯一的!!!
说明:由于分布式的操作,一个key可能落入多个位置(多个值)这种特性叫做分散性
说明:
从任意的角度而言,都满足哈希一致性算法的要求.但是从宏观角度而言可能会出现同一个key值所对应的位置是不用的.
负载
说明:负载是从另一个角度研究分散性.
概念说明:由于分布式的操作,同一个位置可能会有多个数据.哈希一致性算法要求应该尽可能的降低负载.
说明:根据哈希一致性算法的要求.当key值已经进行了数据的分配.这时key2也需要进行赋值操作.那么key2就会把key进行覆盖.那么这时的数据是有问题的.所有尽可能的降低负载.
Rdeis集群
我搭建过得应为3种:
1.主从模式
master主写,slave读
缺点:
master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。没实现高可用
2.哨兵模式
sentinel模式,客户端连接哨兵,当出现某台主机宕机,会自动分配到备用机上,实现高可用。
缺点:运维复杂,哨兵选举期间,不能对外提供服务
3.集群模式
哨兵模式监控权交给了哨兵系统,集群模式中是工作节点自己做监控
哨兵模式发起选举是选举一个leader哨兵节点来处理故障转移,集群模式是在从节点中选举一个新的主节点,来处理故障的转移