赞
踩
修订记录 | 时间 |
---|---|
首次发布 | 2023.06 |
String、Hash、List、Set、SortedSet(ZSet)。
底层实现:SDS。编码方式可能是RAW(大多数)、EMBSTR(长度小于44字节)和INT(整数值)。
使用场景:单值缓存、对象缓存、分布式锁、计数器(文章阅读量)。
底层实现:默认ZipList,以节省内存,当数据量大时会变成Dict(HT)。
使用场景:电商购物车。
问:知道渐进式rehash吗?
List结构类似于一个双端链表,可以从首、尾操作元素。
底层实现:3.2版本之后是QuickList。
使用场景:栈、消息队列。
Set是Redis中的集合,元素唯一。
底层实现:Dict字典,采用HT编码,(即哈希表)。Dict中key存储元素,value为null。当存储的都是整数切不超过某一限值时采用IntSet编码,以节省内存。
使用场景:抽奖、朋友圈点赞、微博关注模型(共同关注、可能认识)。
SortedSet是一个可排序的Set集合,每个元素带有一个score属性,可以基于score进行排序。
特性:可排序、元素不重复、查询速度快。
底层实现:跳表SkipList + Dict(HT编码),即跳表+哈希表。
使用场景:排行榜。
给某一个key设置了过期时间,当key过期时恰好有对这个key的大量并发请求过来,这些请求都会直接查数据库,把数据库击垮。
查询一个不存在的数据,mysql中也查询不到,也不会写入缓存,导致每次请求都会查数据库。这种情况大概率是遭到了外部攻击。
在同一段时间大量的缓存key同时过期或Redis服务宕机,大量的请求到达数据库,给数据库带来很大的压力。
RDB(Redis数据备份文件)、AOF。
RDB全称Redis Database Backup File,数据备份文件,也叫做数据快照。就是把内存中的所有数据记录到磁盘中,当实例故障重启后,从磁盘中读取快照文件,恢复数据。默认开启。
AOF全称是Append Only File,追加文件。Redis处理的每一个写命令都会记录在AOF文件中,可以看成命令日志文件。默认关闭AOF,需要修改redis.conf中的appendonly来开启。还可以配置记录频率。
因为是记录命令,AOF文件会比RDB文件大很多,可能会记录对一个key的多次操作,但只有最后一次写操作才有意义。可以通过bBGREWRITEAOF命令来重写合并AOF文件。
问:Redis的key过期之后,会立即删除吗?
不会立即删除,但数据过期以后需要从内存中删除,删除策略有惰性删除和定期删除两种。Redis是惰性删除和定期删除配合使用的。
设置key过期之后,不去管这个key,再次获取时如果发现过期,则删掉这个key。
对CPU友好,不需要额外检查key,但对内存不友好,过期key如果不被访问到就会一直存在在内存中。
定期随机对一些key进行检查,删除里面过期的key。有SLOW和FAST两种模式,SLOW模式默认100ms执行一次,每次不超过25ms;FAST模式执行频率不固定,耗时不超过1ms。
减轻内存的压力。
问:内存被占满了怎么办?
Redis支持8种不同的策略来删除key。
问:数据库中有1000w数据,Redis中只能存20w数据,如何保证Redis中的数据都是热点数据?
答:可以把淘汰策略设置为allkeys-lru,那么留下来的就是热点数据。
问:MySQL数据如何与Redis进行同步?
先介绍业务背景:是一致性要求高,还是允许一定的延迟。
读操作:缓存命中,直接返回;缓存未命中则查询数据库,写入缓存,并设置过期时间。
写操作:采用延迟双删策略,先删除缓存,修改数据库,延时等待一段时间后再删除缓存。延时双删只能降低脏数据的风险,不能完全解决脏数据的问题。
性能会有损耗。
问:为什么Redis是单线程的,还那么快?
问:解释一下I/O多路复用模型。
I/O多路复用指的是利用单线程来监听多个socket,并在某个socket可读或可写时得到通知,避免了无效的等待,充分利用了CPU的资源。Redis中的I/O多路复用使用的是epoll模式,会在通知用户进程socket就绪的时候,将已就绪的socket写入用户空间。
动态字符串SDS、IntSet、Dict、ZipList、QuickList、SkipList
场景:集群情况下的定时任务、抢单、幂等性场景。
存在一些极低概率的问题:
Redisson是一个在Redis基础上实现的分布式工具的集合。
可重入:利用hash结构记录线程id和重入次数。
可重试:利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制。
超时续约:利用watchDog看门狗,每个一段时间重置超时时间。
主从复制、哨兵模式、分片集群
单机Redis并发8-10w,想进一步提升,需要构建集群。主从集群是一主多从,可以实现读写分离,写操作主节点,读操作从节点。
主从模式下,如果主节点宕机,则会出现无法写入的情况。Redis提供了哨兵机制来实现主从集群的自动故障恢复。
当Sentinel认为主节点客观下线了,就会选出新的主节点,但原来的主节点恢复工作了,就存在了两个主节点。部分客户端往原来的主节点中写入了一部分数据,但原来的主节点会降级为从节点,将同步新的主节点的数据,所以会丢失部分数据。
问:怎么保证Redis的高并发高可用?
高并发:主从架构 / 分片集群
高可用:哨兵模式
某一个key对应的value占用空间很大,那么就称为BigKey。
String类型下超过1M,其他类型下含有成员数上万个。
业务分析不准确,实际业务中value值过大。List、Set中的无效数据没有及时删除。
占用内存增大、网络阻塞延迟变大、集群中迁移困难。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。