Redis相关面试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN_FlyYoung/article/details/89318503

redis常见数据结构以及使用场景分析

String,类似于Map

常用命令: set, get, decr, incr, mget等

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

Hash,对象

常用命令: hget, hset, hgetall等

Hash是一个String类型的field和value的映射表,hash特别适合用于存储对象;后续操作的时候,你可以仅仅修改这个对象中的某个字段的值.比如我们可以用Hash数据结构来存储用户信息,商品信息等等

List,双向链表,分页

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

List就是链表,redis list的应用场景非常多,也是redis最重要的数据结构之一,比如微博的关注列表, 分析列表, 消息列表等功能都可以用redis的list结构来实现
redis list的实现为一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销.
另外可以通过lrange命令,就是从某个元素开始读取多少个元素,可以基于list实现分页查询,这是一个很棒的功能,基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高

Set

常用命令: sadd, spop, smembers, sunion等

set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动重排的.
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的.可以基于set轻易实现交集,并集,差集的操作.
比如,在微博应用中,可以将一个用户所有的关注人存在于一个集合中,将其所有粉丝存在于一个集合.redis可以非常方便的实现如共同关注,共同粉丝,共同喜好等功能,这个过程也是求交集的过程,命令如下:

sinterstore key1 key2 key3 将交集存在key1内

Sorted Set

常用命令: zadd, zrange, zrem, zcard等

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。
举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维
度的消息排行榜)等信息,适合使用 Redis 中的 SortedSet 结构进行存储。

缓存雪崩和缓存穿透问题解决方案

缓存雪崩

简介

缓存同一时间大面积失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉

解决办法

  • 事前:尽量保证整个redis集群的高可用性,发现机器宕机尽快补上.选择合适的内存淘汰策略.
  • 事中:本地ehcache缓存+hystrix限流&降级,避免MySQL崩掉
  • 事后:利用redis持久化机制保存的数据尽快回复缓存
    在这里插入图片描述

缓存穿透

简介

一般是黑客故意去请求缓存中不存在的数据,导致所有的请求都落到数据库上,导致数据库短时间类承受大量请求而崩掉

解决办法

有很多种方法可以有效的解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力.另外一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过5分钟
缓存穿透,缓存击穿,缓存雪崩解决方案分析

猜你喜欢

转载自blog.csdn.net/CSDN_FlyYoung/article/details/89318503