目录
Redis(Remote Dictionary Server) 是一个开源的高性能键值对存储系统,redis基于内存,可以用作数据库、缓存和消息代理。
redis是通过key-value方式存储,其中key自能为字符串类型,而value可以有以下类型。
1、String(字符串):最基本的类型,一个字符串最大支持存储512M
2、Hash(哈希):? 键值对集合,键也是要字符串类型
3、List(列表): 有序字符串列表
4、Set(集合): 无序不重复字符串集合
5、Zset(有序集合):有序不重复字符串集合
磁盘速度是毫秒级别,而内存是纳秒级别,redis将数据放到内存进行读写,所以快。
redis是用C语言实现的,所以效率高。
先解释下单线程指的哪里:Redis 客户端每次调用服务端都有三个阶段,发送命令 -> 执行命令 -> 返回结果,服务端将收到命令放到一个队列中,有一个线程来依次执行队列中的命令。
因为 Redis 是基于内存操作,所以使用单线程既不用考虑锁,又避免了频繁上下文切换。
redis的文件事件处理器是单线程的,多路指的是可以监听多个socket。redis的IO多路复用是基于Linux 的epoll机制
redis提供两种持久化机制:AOF与RDB
AOF(Append Only File)将所有的写指令记录。
相比于RDB,? AOF机制数据更加安全,但是在数据量大的时候,AOF的文件会比RDB大很多,恢复的时间也更长。
AOF文件重写: redis提供用来减小AOF文件体积的机制。
RDB(Redis DataBase)内存中的数据集以快照的形式写入磁盘。
配置自动触发:配置比如 save 300 10 表示 300秒内超过10个key被修改就触发?bgsave 命令
手动触发:
????????①save :会阻塞当前服务
????????②bgsave :创建子进程进行保存
redis支持同时开启,在同时开启时,使用AOF恢复。
若只是把redis当缓存用,也可以都关闭。
redis采用 定期删除+惰性删除策略。
????????①定期删除: 默认每100ms会随机检查一部分key,将随机检查部分中过期的key删掉。
? ? ? ? ②惰性删除策略:每次获取key时,会先检查是否已经过期,过期则删除。
过期策略会导致很多过期key仍未删除,那检查过期时为什么不遍历所有key呢,因为太多太慢了,严重影响性能。
淘汰策略默认是noeviction,不淘汰,当内存满了就报错,还可以设置为volatile-lru、volatile-ttl、volatile-random、allkeys-lru、allkeys-random、allkeys-lfu
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选过期时间最早的数据优先淘汰
指的是缓存未命中,直接查询数据库,数据库中也没有数据库返回空,重蹈覆辙。
解决方案:
????????①数据库没有对应数据时,缓存也存放,并设置超时时间
? ? ? ? ②布隆过滤器
指的是大量缓存同时失效,请求都直接打到数据库
解决方案:
? ? ? ? ①缓存预热:在系统启动时将数据加载到缓存
????????②随机过期时间,将过期时间分散,自然不会同时失效
? ? ? ? ③限流熔断,避免了同一时间点的大量的请求
缓存中有一个key频繁被访问,在这个key失效的时候,大量的并发请求落在数据库
解决方案:
? ? ? ? ①使用互斥锁
????????②针对热点数据延长有效期