【备战秋招冲击大厂】Java面试题系列—Redis

1. 分布式数据库的CAP原理

  • Consistency:强一致性
  • Availability:可用性
  • Partitition tolerance:分区容错性
  • 只能三选二:
    CA:传统关系型数据库
    AP:大型网站
    CP: Redis、Mongodb

2. BASE

  • Basically Available基本可用
  • Soft state 软状态
  • Eventually consistent 最终一致性

3. Redis

  Remote dictionary server(远程字典服务器)是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。具有如下特点:

  • redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启时可以再次加载进行使用;
  • redis不仅支持key/value类型的数据,还提供list,set,zset,String等数据结构的存储;
  • redis支持数据的备份,即master-salve模式的数据备份。

更多Java学习资料、面试真题获得,请【点击此处

4. Redis五大数据类型及应用场景

  • String 最多512M,以一种纯字符串作为value的形式存在的。value可以存储json格式、数值型等。
    • string使用场景一般是存储简单的键值类型。比如用户信息,登录信息,配置信息等。
    • string的incr/decr操作,即自减/自增操作。调用它是原子性的,无论调用多少次,都一一计算成功。例如需要增减库存的操作。
  • List 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。list是一种有序的、可重复的集合。
    • list可以使用左推、左拉、右推、右拉的方式。所以你可以使用list作为集合存储,比如存储某宝商铺里面的所有商品。
    • 也可以用作轻量级别的队列来使用。左推左拉、右推右拉。需要注意的是尽管redis可以使用推拉的队列模式,但是一定要注意场景。因为redis的队列是一种轻量级别的,没有队列重试、队列重放机制。消费完队列消息在redis代表已经删除了。
  • Hash String类型的field和value的映射表,hash特别适合适用于存储对象。在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是,设置过期时间只能在第一层的key上面设置。
    • 使用hash,一般是有那种需要两层key的应用场景,也可以是‘删除一个key可以删除所有内容’的场景。例如一个商品有很多规格,规格里面有不同的值。
    • 如果需要删除商品时,可以一次性删除‘商品id’的key,则商品里面的所有规格也会删除,而不需要找到对应的规格再做处理。如果查找商品id与规格id1的商品时,则通过两个key查找即可。
    • 或者查找所有商品的规格,查找商品id即可。
    • 需要注意的是,经过测试,在性能上来说一般hash里面的第二层key,不要超过200个为佳。尽管hash里面的key-value能达到500多MB的存储容量。
  • Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key。
    • 如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。
  • ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数,分数允许重复
    • 排行榜

5. Redis String的实现

Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS

struct sdshdr{    
    //  记录已使用长度    
    int len;    
    // 记录空闲未使用的长度    
    int free;    
    // 字符数组    
    char[] buf;    
};  

Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字符不会被计算在len里头。

  • Redis动态扩展步骤:
    • 计算出大小是否足够
    • 开辟空间至满足所需大小
    • 开辟与已使用大小len相同长度的空闲free空间(如果len < 1M),开辟1M长度的空闲free空间(如果len >= 1M)
  • Redis字符串的性能优势
    • 快速获取字符串长度:直接返回len
    • 避免缓冲区溢出:每次追加字符串时都会检查空间是否够用
    • 降低空间分配次数提升内存使用效率:(1)空间预分配;(2)惰性空间回收

6. Redis持久化

  • RDB(redis database)在指定时间间隔内将内存中的数据集快照写入磁盘,也就是snapshot快照,恢复时是将快照文件直接读到内存里。Redis会单独创建(fork:复制一个与当前进程一样的进程)一个子进程来进行持久化,会先将数据写入到临时文件,待持久化过程结束,再替换上次持久化好的文件(dump.rdb)。主进程不进行IO操作。如果需要进行大规模数据的恢复,且对数据完整性不敏感,那么RDB比AOF更高效。缺点就是最后一次持久化的数据可能丢失。
    • 默认:1分钟改了一万次,5分钟改了10次,15分钟改了一次
  • AOF以日志的形式来记录每个写操作,将redis执行过的所有写的指令记录下来(读操作不记录),只需追加文件当不可以改写文件,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
    • 同步策略:always一直同步、everysec每秒同步、no不同步
    • AOF的优点: <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值