什么是Redis?
Redis是一款非关系型数据库,将数据以键值对的形式存储在内存中,读写速度快。支持多种数据类型,还支持数据持久化。
Redis使用场景?
1.缓存(点赞,秒杀,修改次数少的(新闻类型,分类菜单),存储验证码(定时删除))
2.计数器
3.排行榜(z-set)
4.数据排重(set)
5.消息队列(l-pop,r-pop,医院排号)
6.分布式锁
Redis线程模型
Redis服务端是单线程模型还是多线程模型?
6.0版本之前是单线程,处理客户端连接和读写操作都是一个线程完成的。6.0版本之后是多线程的,处理客户端网络请求连接是多线程,执行读写操作是单线程,所以线程依然是安全的。
为什么设计单线程模型速度也很快?
1,基于内存操作,内存读写速度快(内存级别,性能高)
2,底层存储结构是Hash结构,通过计算Hash值快速获取Key的位置
3,单线程避免上下文切换,节省开销,不会导致死锁
Redis的两种持久化机制?AOF,RDB
Redis数据存储在内存中,有可能数据丢失(断电)。所以Redis提供两种数据持久化机制,AOF(AppendOnlyFile),RDB(RedisDataBases)
AOF:以快照形式将缓存数据存储在硬盘文件中
RDB:以日志形式将操作指令存储在硬盘上(默认持久化机制)
Redis和MySQL如何保持数据一致?
方法一:先更新MySQL立即更新Redis。但是Redis可能更新失败,依旧可能产生数据不一致的问题。
方法二:先删除Redis中的数据,再更新MySQL。但是也会存在数据不一致的问题,一个线程正在更新MySQL,事务此时还未提交,Redis查询的还是老数据。
方法三(⭐常用):延时双删。先删除Redis的数据,然后更新MySQL中的数据,此时Redis查询到MySQL中的老数据,等MySQL更新完成之后再查询,更新Redis中的数据。
Redis事务
Redis是为了保证多条命令作为一个整体执行。在事务执行的过程中不可以被其他客户端打断。在执行一条事务时,添加多条命令,添加进去之后不会立即执行,在开启Redis事务之后才会开始执行此事务中的所有命令。
主从复制(Redis集群)
写入的命令直接发送到主机上执行,从机用来存储备份主机的内容,做到读写分离,分担Redis服务的压力。
Key过期删除策略
1,惰性删除:下次使用检查是否过期(使用字典Key标记)再删除
2,定期删除:设置时间节点定时检查扫描过期Key删除
Redis使用时产生:
1,缓存穿透
缓存中没有要查询的数据,MySQL也没有。
2,缓存击穿
缓存中Key值过期,此时大量请求访问数据库,会越过Redis查询数据库
3,缓存雪崩
高并发访问,但大量Key值过期或Redis宕机