Redis

1、Redis 是什么?
Redis 是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。

2、分布式缓存有哪些方案?
memcache和redis

3、为什么要使用缓存?
主要是为了提升用户体验(响应速度更快)以及应对更多的用户(查询并发量更大)。

4、redis除了缓存,还能做什么?
分布式锁限流、消息队列、某些业务(通过 sorted set 维护排行榜)等。

5、常见的数据结构及其使用场景是什么?
在线 redis 环境学习命令。

5.1 String
简单的 key-value 类型,自己构建了一种简单动态字符串(simple dynamic string,SDS),不光可以保存文本数据还可以保存二进制数据,不会造成缓冲区溢出。
一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。

5.2 list
链表,易于数据元素的插入和删除并且可以灵活调整链表长度,但是链表的随机访问困难。Redis 的 list 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
用于发布与订阅或者说消息队列。

5.3 hash
内部实现也差不多(数组 + 链表)。hash 是一个 string 类型的 field 和 value 的映射表,适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如存储用户信息,商品信息等等。

5.4 set
一种无序集合,集合中的元素没有先后顺序。当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,可以基于 set 实现交集、并集、差集的操作。比如:你可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合,可以非常方便的实现如共同关注、共同粉丝等功能,这个过程也就是求交集的过程。

5.5 sorted set
sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。适用于需要对数据根据某个权重进行排序的场景。

5.6 bitmap
bitmap 存储的是二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身。 bitmap 本身会极大的节省储存空间。
适合需要保存状态信息并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。

6、Redis开始为什么不使用多线程?4.0之后为什么又开始使用多线程?

不使用多线程的原因:

  1. 单线程编程和维护容易
  2. Redis的瓶颈不在CPU,主要是内存和网络
  3. 多线程存在死锁,线程上下文切换等问题。

4.0增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主处理之外的其他线程来“异步处理”。
6.0引入多线程主要是为了提高网络 IO 读写性能,只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行。因此,不需要担心线程安全问题。默认是禁用的,只适用主线程,需要在配置文件中开启io-threads-do-reads yes,且需要设置线程数,否则是不生效的 io-threads 4 #官网建议4核的机器设置为2或3,8核的建议设置为6

7、过期时间有什么用?

  1. 有助于缓解内存的消耗,避免内存不足。
  2. 有的业务场景就是需要某个数据只在某一时间段内存在,比如短信验证码可能只在 1 分钟内有效,用户登录的 token 可能只在 1 天内有效。

8、假设设置了一批 key 只能存活 1 分钟,那么 1 分钟后,Redis 是怎么对这批 key 进行删除的呢?

  1. 惰性删除 :在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
  2. 定期删除 : 每隔一段时间抽取一批 key 执行删除过期 key 操作。且Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
    定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是 定期删除+惰性/懒汉式删除 。

仅仅通过给 key 设置过期时间还是有问题的,可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。这样就导致一定过期 key 堆积在内存里,久而久之可能内存不足。

怎么解决这个问题呢?答案就是:内存淘汰机制。

9、内存淘汰策略有哪些?

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  4. volatile-lfu(least frequently used):从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
  5. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
  6. allkeys-random:从数据集中任意选择数据淘汰
  7. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
  8. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
    1和4的差异和选择。

10、怎么做到持久化的?
一种持久化方式叫快照(snapshotting,RDB),另一种方式是只追加文件(append-only file, AOF)。

RDB:
通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis 创建快照之后,对快照进行备份。默认开启。

AOF:
每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到内存缓存 server.aof_buf 中,然后再根据 appendfsync 配置来决定何时将其同步到硬盘中的 AOF 文件。三种:

appendfsync always    #每次有数据修改时都会写入AOF文件,这样会降低Redis的速度
appendfsync everysec  #每秒钟同步一次,显示地将多个写命令同步到硬盘(常用)
appendfsync no        #让操作系统决定何时进行同步

11、Redis的事务是怎样的?
Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。
可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现。

12、什么是缓存穿透?如何解决?
是大量请求的 key 不存在于缓存中,导致请求直接到了数据库上,没有经过缓存这一层。

  1. 缓存无效 key,缓存时间设置短一点
  2. 布隆过滤器

13、什么是缓存雪崩?如何解决?
缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。 这就好比雪崩一样,摧枯拉朽之势。

  1. 集群,避免单机宕机无法使用
  2. 设置不同的缓存时间避免大量key同一时间过期。

14、如何保证缓存和数据库数据的一致性?
Cache Aside Pattern(旁路缓存模式),遇到写请求是这样的:更新 DB,然后直接删除 cache 。如果更新数据库成功,而删除缓存这一步失败的情况的话,常用的解决方案是增加 cache 更新重试机制: 如果 cache 服务当前不可用导致缓存删除失败的话,我们就隔一段时间进行重试,重试次数可以自己定。如果多次重试还是失败的话,我们可以把当前更新失败的 key 存入队列中,等缓存服务可用之后,再将缓存中对应的 key 删除即可。如果redis做到了高可用,那么就不用考虑缓存删除失败了。

15、进一步深入学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容