Skip to content

Redis

Redis 数据类型

stringhastlistsetzset
字符串类似于Map<String,Object>可重复集合不可以重复的集合带分数的set
  • bitmaps:位图,操作位的数据类型

    统计用户是否在线 实现布隆过滤器 用户签到

Redis提供了哪几种持久化方式

AOF:每次产生一条新的修改数据的命令都执行保存操作;

RDB:会创建一个单独的线程(fork)进行持久化,主进程是不进行任何IO操作,RDB方式要比AOF方式更加的高效;

Redis为什么快

完全基于内存 数据结构简单 采用单线程 使用I/O多路复用模型,非阻塞IO

Redis为什么是单线程的

Redis是基于内存的数据库,CPU不是Redis的瓶颈而内存和网络才是瓶颈,而且单线程既容易实现。所以采用了单线程的方案。虽然Redis采用单线程模型,但是通过多路IO复用技术弥补了单线程在处理并发连接可能存在的性能瓶颈。

为什么Redis的操作是原子性的,怎么保证原子性的

Redis操作的原子性是指,一个操作不可再分,要么成功,要么失败,

Redis是之所以是原子性的,是因为Redis是单线程的。所以Redis提供的API都是原子性的,

Redis事务是要保证批量操作的原子性

Redis有事务

Redis 存在事务,Redis 事务的本质是一组命令的集合,Redis事务能保证一次性、顺序性和排他性;

Redis数据和MySQL数据库的一致性如何实现

延时双删:

  • 先删除数据库,

  • 然后操作数据库,

  • 休眠(根据业务逻辑来定多少秒)

  • 在次删除缓存

延时双删可能出现缓存删除失败

  • 可以将key发送到消息队列

  • 自己消费消息,获取需要删除的key

  • 继续重试删除操作,直到成功

方案二

  • 可以通过binglog日志

Redis缓存击穿

热点Key失效,大量请求直接访问到数据库中导致数据库宕机

解决办法:采用分布式锁,项目中使用的是redisson框架

Redis缓存穿透

查询一个不存在的key,由于缓存无法命中,将去查询数据库,但是数据库也无此记录。

解决方案:空结果也缓存,使用布隆过滤器,项目中解决方案,redisson框架

Redis缓存雪崩

key同时失效,给key加一个随机过期时间

哨兵模式是什么样的

哨兵模式,是一种高可用的解决方案,用于监控和管理Redis主从集群的运行状态。

如果主节点异常,则会自动将其中一个从节点作为主节点,将之前的主节点改为从节点。

Redis常见性能问题和解决方案

  1. 主节点不要做任何持久化工作,因为持久化会消耗主节点的CPU、内存和IO这回影响到主节点的速度
  2. 如果数据较为重要,在某一个从机开启AOF备份
  3. 为了主从复制链接更稳定,主节点和从节点最好在同一局域网内
  4. 主从复制复制不要使用图状结构,用单向链表结构更稳定

如何保证Redis中的数据都是热点数据

当内存使用量达到Redis阈值时,Redis将开始执行内存淘汰策略,以回收内存空间。

内存淘汰策略:

  1. noeviction(不淘汰策略)
  2. volatile-lru(最近最少使用)
  3. alkeys-lru(全局最近最少使用)
  4. volatile-ttl(根据过期时间优先)
  5. volatile-random(随机删除)
  6. allkeys-random(全局随机删除)

Redis过期策略

定期删除

惰性删除

Redis 有多少hash槽

16384

Redis集群方案应该怎么做 都有哪些方案

根据 MIT 许可发布。