一、 什么是Redis
Redis是一个开源的内存型非关系数据库,与MySQL等数据库不同的是,Redis采用的是key->value的形式存储数据,所以Redis的读取速度很快,广泛被用于系统缓存等,相比Map或者谷歌的guava缓存数据,Redis支持数据持久化;
二、Redis与Memcached的区别
1、Redis的键值存储比MemCached大,一般是512M
2、Redis支持多种数据类型,比如String、Hash、Set、Zset、List;
3、Redis支持数据持久化
三、 Redis的用途
由于Redis支持多种数据类型,而且本身是原子性的,所以其不仅可以作为系统缓存数据使用,还可以有其它的使用途径:
(1)购物车
(2)分布式锁
(3)自增Id
(4)排行榜
(5)消息队列
(6)支持pub/sub发布订阅模式
......等等功能
四、 Redis持久化方式
(1)RDB方式
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb,一般就是在Redis配置文件中配置某个时间段有多少个键值发生改变,就将数据持久化到磁盘中,优点是: 恢复数据启动快;缺点是:当Redis宕机的时候,可能丢失几秒数据,特别是在高并发情况下;
(2)AOF方式
启用AOF持久化方式需要在Redis配置文件配置,则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据,优点是可以配置后可以不丢失数据,缺点是启动慢
(3)混合持久化
Redis4.0以上增加了一种混合持久化方式,就是RDB和AOF同时开启,但是默认是以AOF持久化,文件方式是将RDB文件先持久化到文件头,然后后期以AOF持久化为主
五、AOF持久化策略
(1)Always: 可以配置每次更新数据的时候,同时持久化数据
(2)可以配置1秒一次进行数据持久化;
(3)No:Redis默认不去持久化数据,交由后台闲置线程处理
六、Redis的删除策略
(1)定时清除: Redis会定期清除过期数据或被删除的数据
(2)惰性清除: Redis在每次查询的时候,会判断数据是否没有被删除
七、 Redis的淘汰策略
1.noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
2.allkeys-lru:从所有key中使用LRU算法进行淘汰
3.volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
4.allkeys-random:从所有key中随机淘汰数据
5.volatile-random:从设置了过期时间的key中随机淘汰
6.volatile-ttl:在设置了过期时间的key中,淘汰过期时间剩余最短的
八、 Redis是否支持事务
Redis是支持事务的,Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH四个命令实现的,但是Redis的事务和MySQL等关系型数据库不一样,不支持回滚操作等,哪一个命令错误,就不执行那个命令
九、 说一下事务的特性
(1)原子性
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成
(2)一致性(Consistency)
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱
(3)隔离性
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的
(4)持久性(Duration)
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
十、 分布式锁
在现在的分布式系统中,synchronized和ReentrantLock等锁已经不满足于分布式系统了,可以使用Redis作为分布式锁,默认有setnx命令,就是设置一个键值,然后设置过期时间,防止Redis宕机等一系列因素锁不释放,而且要注意的是,必须用同一条命令设置键值和过期时间
十一、 缓存雪崩、缓存穿透、缓存击穿、缓存预热、缓存更新、缓存降级等问题
(1)缓存雪崩:当Redis数据同一时间过期的时候,大量并发会打到数据库,这在高并发情况下,对数据库是灾难性的,所以可以对不同键值设置不同的过期时间
(2)缓存穿透: 当使用某个不存在的值一直对系统进行查询的时候,可能造成缓存穿透,可以使用布隆过滤器对数据进行过滤;
(3)缓存击穿: 当大量并发打过来的时候,某个键值突然过期,大量的请求打到数据库请求,可能对数据库造成一定的压力,所以可以使用互斥锁;
(4)缓存预热:当知道某些数据可能用得上的时候,可以事先写到缓存中,这样可以减少数据库压力;
十二、总结
总之,Redis是一个优秀的nosql非关系型数据库,它的读写速度很快,特别是当服务器性能不错的时候,可以用于提高系统并发数据量,而且Redis6.0后又支持多线程模型,默认是不开启的,需要去配置文件中开启