为什么要用redis?一般在什么场景下用到?
答:redis是最常用的缓存高并发,提高高可用能力的手段,能有效的提升服务器的性能,引入redis可以为数据库减压,让很多本应该打到DB上的请求被缓存拦截处理掉。应用场景:如秒杀扣库存。
redis的特点有啥?
答:1.redis的读写能力突出,读的速度可达每秒十一万次,写的速度高达每秒八万一千次;
2.支持持久化,支持AOF和RDB两种持久化方式;
3.支持事务,redis所有操作都是原子性的,同时redis也支持几个操作后合并的原子性执行;
4.数据结构丰富,有八种数据类型,常用5种String、hash、set、sotrset、list;
5.支持主从复制,主机可将数据同步到从机,支持读写分离;
6.支持大量集群节点;
redis如何持久化数据?怎样防止异常时数据丢失?
答:RDB(快照)
将某个时间点的所有数据生成快照放在磁盘上,当数据量很大是很慢;
可以将快照复制到其他服务器上,从而生成服务器副本;
如果服务器异常,将会丢失最后一次快照之后的数据;
AOF(及时更新)
将写命令添加到Aof文件的末尾,使用AOF持久化需要设置同步选项,从而确保同步到磁盘文件上的时机。这是因为,对文件的先写入并不是马上同步到磁盘上,而是先存入缓存,再同步到磁盘上。同步频率的选项有,always每个写命令都同步,everysec每秒同步一次,no让操作系统自己决定。通常情况下使用everysec,当服务器异常时只丢失一秒的数据,而且redis每秒写一次并不对对性能有影响。
为什么redis是单线程的?
答:因为redis的瓶颈不是CPU的运行速度,而往往是网络带宽和机器的内存的大小,单线程内存开销小,容易实现,同时也避免了多线程的很多坑。
什么是缓存穿透、缓存击穿、和缓存雪崩?有什么解决缓存击穿的办法?
缓存穿透:指缓存和数据库中都没有数据了,请求打到了数据库上,数据库还查不到数据,数据库请求被打满,造成服务阻塞,造成线上服务不可用。
缓存击穿:缓存中没有但是数据库中有数据(热点缓存数据到期),这时由于并发用户特别多,同时读缓存没有读到数据,然后又同时查数据库,造成数据库瞬间压力过大,线上系统卡住。
缓存雪崩:缓存同一时间大面积失效,升级版的缓存击穿。
解决缓存击穿的办法:
1.对热点数据表设置成前多少条(top1000)永久不过期,然后对此表进行定时更新,
2.互斥锁,多个线程同时去查数据库的这条数据,我们可以在第一个请求上加互斥锁锁住他,当其他请求走到这拿不到锁就无法请求,等第一条数据返回数据,缓存内有数据了,其他请求就走缓存了。