1、Redis简介
Redis是一个Key-Value存储系统,可以支持String、Hash、List、Set等作为value进行存储,并且支持push/pop、add/remove及取交集并集和差集及更丰富的操作,且保证这些操作的原子性,另外还支持排序。
Redis数据是放在内存中的,但会做持久化,周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis由于数据在内存中,且IO是单线程操作,避免上下文切换,响应速度很快(同时也会导致IO瓶颈);在高并发场景下,可以作为数据库缓冲,减小数据库压力。
2、Redis的持久化机制
Redis有两种存储策略:RDB和AOF
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。所以他是一个全量的方式来进行持久化的。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。所以他是以增量的方式来进行持久化的。
两者对比:
1)RDB可能会故障时候丢数据,这是因为写入时间间隔较长。
2)AOF文件会更大些,且存储速度会慢些。
3、Redis过期策略
先介绍一下3种过期策略:
1)定时删除
实现:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key过期时删除。
特点:内存及时被释放。但删除key额外消耗cpu资源,会影响性能。
2)懒汉式删除
实现:key过期的时候不删除,每次通过key获取值的时候去检查是否过期,过期才删除,返回null。
特点:相对于定时删除,不会额外消耗cpu资源。但若大量key超时且未被查询,则会占用内存,可能引发内存泄漏。
3)定期删除
实现:每隔一段时间执行一次删除过期key操作。
特点:相当于定时删除和懒汉式删除策略的折中。
Redis采用的是定期删除 + 惰性删除策略。这个策略还有优化空间,即定期删除时未到期,且未被调用,还是可能会占用内存。解决方案,可以采用内存淘汰机制,简单地说这个机制就是在新写key发现内存不足时的策略,或者写入失败,或者删除老key等,策略是可配置的。
4、如何解决redis的并发竞争key问题
问题描述:同时有多个子系统去set一个key的并发问题。
解决方案1:将set操作通过队列串行化。显然这种方式会影响写入效率。
解决方案2:用分布式锁。也会影响写入效率。
解决方案3:Redis事务。
5、Redis事务机制
Redis有简单的事务机制,不支持各种隔离级别。
multi命令开启事务,接下来的操作被加入队列,知道exec执行事务。
6、Redis分布式锁
Redis可以做分布式锁,是因为提供了setnx原子操作。基于redis的分布式锁也是基于这个操作实现的,SETNX是指如果有这个key就set失败,如果没有这个key则set成功,但是SETNX不能设置超时时间。
简单的使用setnx,对于单点的redis能很好地实现分布式锁,如果redis集群,会出现master宕机的情况。如果master宕机,此时锁key还没有同步到slave节点上,会出现机器B从新的master上获取到了一个重复的锁。
7、Redis为什么不适合用作数据库?
Redis持久化有风险;
Redis每次需要把数据加载到内存,再写入磁盘,对于存在大量非即时性数据的场景成本很高;
Redis数据都在内存中,会占用大量内存;