Redis常见的面试题

定义:

Redis是一个由C语言开发的Nosql数据库(Not Only Sql非关系型数据库),可以用作数据库、缓存、消息中间件(不推荐)等

优点:

性能优秀,数据在内存中,读写速度快,并且支持并发数10wQPS

支持丰富的数据类型,一共由8种数据类型,而Memcached只支持简单的K-Y(key-value)

单线程单进程,是线程安全的,采用的IO多路复用机制,注:不是绝对的单进程,在执行bgsave的时候,会fork一个子进程

支持数据持久化,可以将内存的数据保存在磁盘中,持久化方式(RDB和AOF)

支持的数据类型

1.String类型是我们常用的最基本的数据类型,由K-Y组成

2.Hash是一个键值(K-Y)的组合,Redis的Hash是一个String的Key和Value的映射表,常用的命令:hget、hset、hgetall等

3.List列表是简单的字符串列表,按照插入的顺序进行排序的,在列表中可以左右添加,常用的命令:lpush、rpush、lpop、rpop等

4.Set是String类型的无序集合,是通过hashtable实现的,并且没有重复,常用的命令 sadd、spop、sunion等

5.ZSet和Set一样是String类型的元素集合,并且不允许重复,不同的是,Zset有一个权重的概念,使得用户可以按照Score进行有序排列

另外还有HyperLogLog、BitMap类型等

淘汰策略:

1.voltile-lru:从已设置过期时间的KV中优先对最少使用的数据淘汰(推荐)

2.volitile-ttl:从已设置过期时间的KV中对剩余时间短的数据淘汰

3.volitile-random:从已设置过期时间的KV几种随机选择数据淘汰(不推荐)

4.allkeys-lru:从所有的KV中优先对最近最少使用的数据淘汰(推荐)

5.allkeys-random:从所有的KV中随机选择数据淘汰

6.noeviction:不淘汰策略,若超过最大内存,返回错误信息

Redis4.之后加入了LFU淘汰策略,包括volatile-lfu和allkeys-lfu,通过统计访问频率,讲访问频率最少,不经常使用的KV淘汰

Redis雪崩:

同一时间大量的key涌入,同时缓存失效了,导致所有的请求都打在了数据库上,数据库扛不住这么大的并发,直接就挂掉了

解决办法:

在批量往Redis 中存储数据的时候,把每个key的失效时间都加一个随机值就行,这样可以保证数据不会在同一时间大量的失效

Redis缓存穿透:

用户(黑客)不断的发起请求,但是缓存和数据库中没有相应的数据,造成了数据库挂掉

解决办法:

为了防止数据库压力过大,可以使用一种令牌桶(RateLimiter)的方式,访问数据库之前,先拿取相应的令牌,获取不到令牌的先等待,直到能拿到令牌为止

注:使用Redis的布隆过滤器(Bloom Filter)这个也能预防缓存穿透的发生

Redis缓存击穿:

不存在的key在同一时间大量的请求,或者是缓存失效的瞬间,高并发直接落在数据库上,就击穿了缓存

解决:热点数据永不过期,或者是加上互斥锁

Redis单线程为什么速度这么快

Redis是完全基于内存进行操作的

采用单线程,避免的必要的上下文切换和竞争,同时也不存在多线程CPU争夺时间片的问题,也不存在加锁释放锁等问题

数据结构相对于比较简单,操作数据也比较简单

采用多路复用IO模型,非阻塞IO

Redis和Memcached的区别?

存储数据方面:Memcached对数据类型全部储存在内存中,重启之后会挂掉。Redis可以持久化到磁盘中,重启的时候会重新加载

数据类型方面:Memcached对数据类型的支持比较简单,只支持简单的K-Y,而Redis可以支持8中数据类型

储存值方面:Memcache储存的Value只有1MB,而Redis可以达到1GB

底层方面:他们之间的通信协议不一样,Redis直接构建了自己的VM机制,在调用系统函数的时候,会节省一定的请求时间

Redis性能优化:

生产环境中禁止使用keys命令,如果需要可以使用scan命令,但是耗时比较长

要执行排序、交集、并集操作是,可以在客户端完成,而不要使用sort、sunion、sinter这些命令,以免拖慢Redis实例

键值对中所有的键都需要设置随机的过期时间

使用固态硬盘作为持久化写入

增加机器内存或者是使用Redis集群

由于时间关系,先更新这些,有错误的欢迎指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值