redis
概念:开源的,高性能key-value非关系型数据库。
优点:读写性能优异,读写速度快。
支持数据持久化。
支持事务,所有操作都是原子性的。
支持的数据类型丰富,string,list,hash,set,zset
缺点:受到物理内存限制,不能支持海量数据的高性能读写。
为什要用redis?
高性能:将用户常访问的数据存在缓存中,因此用户可以减少对数据库的访问,直接访问缓存,访问缓存就是访问内存,因此性能高。
高并发:访问缓存的请求相比访问数据库的请求承受更高。
redis为什么快?
redis大部分操作基于内存,内存中的数据类似于hashmap,查询的时间复杂度为O(1),因此响应快速。
采用单线程+io多路复用技术,因此避免了多余的上下文切换和竞争。
redis有哪些数据类型?
string,list,hash,set,zset
redis的应用场景?
string:使用incr自增,可以做计时器。
set:本身自动去重的特性可以做商品展示等
zset:有序集合可以做排行榜等
分布式锁:redis自带的命令setnx可以实现分布式锁。
redis持久化方式?
RDB:每隔一段时间,使用快照的方式将缓存中的数据同步到磁盘中。
工作原理:fork一个子进程,将缓存中数据同步到一个临时文件中,当持久化结束后在替换原来的rdb文件。
优点:性能高;子进程完成操作,主进程继续护理命令。
数据量多时,相比AOF启动箱率高。
缺点:间隔一段时间进程持久化,持久化期间数据可能发生丢失。安全箱不高。
AOF:将redis的写指令记录到日志文件中,重启redis时会将日志文件中恢复数据。
优点:数据安全性高,AOF可以使appendsync属性always,即每次写操作都会记录到aof文件中。
保证数据一致性,当服务器中途出现宕机情况,也可以通过redis-check-aof工具解决有问题的aof文件,保证数据的一致性。
缺点:文件占用空间较大,应为处理同步数据,还有写操作指令集。
数据集大的话,redis启动效率相比RDB低。
默认是RDB形式,当开启AOF形式后,会优先选择AOF形式。
redis缓存和持久化怎么做扩容?
缓存:使用一致哈希原则实现动态扩容。
redis的过期键的删除策略?
1.立即过期:每个key设置一个过期时间,当过期时间到了,立即删除对内存友好,但是会占用大量的cpu资源去处理这些过期key
2.惰性过期:当访问一个key时,采取查看其过期时间,如果过期则删除,节省cpu资源,但是会造成内存资源浪费,存在过期key没有清理,占用内存的情况。
3.定期过期:每个一段时间,会扫描expire字典中一定数量的key,发现过期key,则删除。
redis中key过期时间和永久时间设置?
过期时间:expire
永久时间:persist
什么是redis事务?
redis中的事务是一个单独的隔离操作,这个事务中的所有命令都会序列化,有序的执行,不会被其他命令所打断。
事务中的三个命令:multi:将命令序顺序的放进事务队列中。
exec:顺序的执行队列中的命令。
discard:取消队列。
redis不支持回滚,错误的命令不执行,绕过执行正常的命令。
redis实现分布式锁?
,redis采用单进程单线程模式,使用队列模式将并发访问变成串行访问。
redis自带的命令setnx可以实现分布式锁,当锁的时间过长,可以使用expire设置锁的过期时间。
redis并发竞争key问题?
此问题即多个系统对同一个key进行访问,但是执行顺序与理想顺序不符,可以使用基于redis分布式锁的方式解决。
缓存问题?
缓存穿透:对不存在的key进行高并发访问,缓存中不存在,则访问数据库,造成数据库负载过高。
解决:对空结果进行缓存,并设置较短的过期时间。
使用bitmap做一个白名单,将id作为偏移量,每次请求的id与bitmap中的id进行对比,如果没有则拒绝请求。
使用布隆过滤器;将所有可能缓存的数据哈希到一个足够大的bitmap中,不存在的数据会被拦截掉。
缓存击穿:大量访问某一个过期的key,导致redis的命中率降低,对于数据库的访问量增大,造成负载过高。
解决:对于热数据进行预先缓存,并且将其过期时间设置长些。
实时监控:对于某一key的访问过高的key实时增加其过期时间。
缓存雪崩:某一段时间内,大量的key存在过期,导致访问服务器负载崩溃。
解决:将key的过期时间分散开,尽量使得每个key的过期时间重复率低。
使用多级缓存机制,但是实现比较复杂。
缓存预热:系统上线后,将相关的缓存数据直接加载到缓存中,尽量避免用户请求时直接访问数据库。