Redis相关问题

什么是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宕机

你可能感兴趣的:(JAVA进阶,redis,数据库,缓存)