Redis
Redis 数据类型
| string | hast | list | set | zset |
|---|---|---|---|---|
| 字符串 | 类似于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常见性能问题和解决方案
- 主节点不要做任何持久化工作,因为持久化会消耗主节点的CPU、内存和IO这回影响到主节点的速度
- 如果数据较为重要,在某一个从机开启AOF备份
- 为了主从复制链接更稳定,主节点和从节点最好在同一局域网内
- 主从复制复制不要使用图状结构,用单向链表结构更稳定
如何保证Redis中的数据都是热点数据
当内存使用量达到Redis阈值时,Redis将开始执行内存淘汰策略,以回收内存空间。
内存淘汰策略:
- noeviction(不淘汰策略)
- volatile-lru(最近最少使用)
- alkeys-lru(全局最近最少使用)
- volatile-ttl(根据过期时间优先)
- volatile-random(随机删除)
- allkeys-random(全局随机删除)
Redis过期策略
定期删除
惰性删除
Redis 有多少hash槽
16384