Redis面试

1.什么是非关系型数据库

简称NOSQL,是基于键值对的对应关系,并且不需要经过SQL层的解析,所以性能非常高。但是不适合用在多表联合查询和一些较复杂的查询中。NoSQL用于超大规模数据的存储

2.redis 中的数据类型有哪些

5大基本类型

  • String

    String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上它是字符串,但其实他可以灵活的表示字符串、整数、浮点数3种值。Redis会自动的识别这3种值

  • List

    • 实际上是一个双向链表
    • 如果key 不存在,创建新的链表;如果key存在,新增内容
    • 如果移除了所有值,空链表,也代表不存在
    • 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点
  • Set:元素唯一不重复

  • Hash:

  • ZSet:有序集合

3大特殊类型

  • Geospatial: 地理位置
    城市经纬度查询: 经纬度查询
    注意点1:两极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
    注意点2:有效的经度从-180度到180度。
    注意点3:有效的纬度从-85.05112878度到85.05112878度。
    注意点4:m 为米。km 为千米。mi 为英里。ft 为英尺
  • Hyperloglog: 基数
    • 如果在实际业务中,允许一定的误差值,我们可以使用基数统计来计算~效率非常高!比如:网站的访问量,就可以利用Hyperloglog来进行计算统计
  • Bitmap: 位存储
    • Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态
    • 实际需求中,可能需要我们统计用户的登陆信息,员工的打卡信息等等。只要是事务的只有两个状态的,我们都可以用Bitmap来进行操作

2.为什么说redis能够快速执行

  • 使用内存进行存储,可以避免频繁的进行写盘操作,大大降低响应时间
  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  • 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
  • 使用多路I/O复用模型,非阻塞IO

3.Redis事务

Redis事务功能是通过MULTIEXECDISCARDWATCH 四个原语实现的

Redis会将一个事务中的所有命令序列化,然后按顺序执行。

redis 不支持回滚,“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。
如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
如果在一个事务中出现运行错误,那么正确的命令会被执行

  • WATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。
  • MULTI命令用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
  • EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 nil 。
    通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。
  • UNWATCH命令可以取消watch对所有key的监控

Redis的事务总是具有ACID中的一致性和隔离性,其他特性是不支持的。当服务器运行在AOF持久化模式下,并且appendfsync选项的值为always时,事务也具有耐久性。

Redis事务支持隔离性吗
Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的

Redis事务保证原子性吗,支持回滚吗
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行

4.Redis的持久化

Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制

  • RDB:RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期

    • 优点:
      • 只有一个文件 dump.rdb,方便持久化。
      • 容灾性好,一个文件可以保存到安全的磁盘。
      • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
      • 相对于数据集大时,比 AOF 的启动效率更高。
    • 缺点:
      • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
  • AOF:是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据

    • 优点:
      • 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次
      • 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题
      • AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)
    • 缺点:
      • AOF 文件比 RDB 文件大,且恢复速度慢
      • 数据集大的时候,比 rdb 启动效率低
  • 各自的优缺点:

    • AOF文件比RDB更新频率高,优先使用AOF还原数据。
    • AOF比RDB更安全也更大
    • RDB性能比AOF好
    • 如果两个都配了优先加载AOF

5.什么是缓存穿透、缓存击穿、缓存雪崩及其解决方案

  • 缓存穿透:是指使用不存在的key进行大量的高并发查询,这导致缓存无法命中,而后直接对数据库进行访问,如果过访问量过大,可能会导致数据库挂掉

    解决方案:

    • 查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短
    • 布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对数据库的查询
  • 缓存击穿:是指某一热点失效,而此时又有对该热点的大量访问,那么只能直接访问数据库,如果过访问量过大,可能会导致数据库挂掉

    解决方案:

    • 使用互斥锁:当缓存失效时,不立即去 load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法
    • 永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)
  • 缓存雪崩:是指设置缓存是,采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到数据库,数据库瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多 key,击穿是某一个key 缓存

    解决方案:

    • 将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件

6.Redis 的集群

7.Redis实现分布式锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值