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