Java-面试-数据库-3-Redis

Redis基础

Redis 是基于C语言开发的开源NoSQL数据库。

  1. 基于内存
  2. 时间处理模型:单线程事件循环、IO多路复用
  3. 多种优化后的数据结构
  4. 通信协议简单、解析高效

为什么

为什么不直接用Redis?因为内存成本太高且Redis的持久化有数据丢失的风险。

为什么使用Redis? 1. 访问速度快 2. 高并发,一般4核8G的数据上能够达到4k,使用Redis之后能够达到5w+,这还只是单机,集群会更高。

缓存读写策略

旁路缓存模式 Cache Aside

适合读请求比较多的情况。

写:

  • 先更新db
  • 然后直接删除 cache

读:

  • 从 cache中读数据,返回
  • cache中读不到数据,从db中读取数据返回
  • 再把数据放回到缓存里面

问题:为什么不先删除cache,然后更新db?因为如果反过来,那么先删除后读会出现数据不一致。再问:现有策略不会吗?会,但是概率小,因为cache比数据库快得多。

缺陷:

  1. 首次请求数据没有在cache中。解决:热点数据提前存入
  2. 写操作比较频繁时影响缓存命中率。分情况,是否短暂允许数据库与缓存数据不一致。

读写穿透 写直达 Read/Write Through Pattern

把 cache 作为主要数据存储。cache 服务负责将数据读取与写入db,比较少见,因为Redis 没有提供将cache 写入db 的功能。

异步缓存写入 Write Behind Pattern

Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 db 的读写。

但是,两个又有很大的不同:Read/Write Through 是同步更新 cache 和 db,而 Write Behind 则是只更新缓存,不直接更新 db,而是改为异步批量的方式来更新 db。

很明显,这种方式对数据一致性带来了更大的挑战,比如 cache 数据可能还没异步更新 db 的话,cache 服务可能就就挂掉了。

这种策略在我们平时开发过程中也非常非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQL 的 Innodb Buffer Pool 机制都用到了这种策略。

Write Behind Pattern 下 db 的写性能非常高,非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。

应用

  1. 缓存
  2. 分布式锁
  3. 限流
  4. 消息队列 不建议
  5. 延时队列
  6. 分布式 Session
  7. 复杂业务场景

还有很多,主要是对上面应用场景的详细解释

Redis 数据类型

5 种基本数据类型:String、List、Set、Hash、Zset(有序集合)

3 种特殊类型:HyperLogLog(基数统计)、Bitmap(位图)、Geospatial(地理位置)

还有一些比如布隆过滤器,位域

如果是完整的对象,存储建议使用哈希,整个的读写操作多的。

如果对于部分信息需要经常变动,建议使用Hash