03-Redis基础
部分来源,自己总结。https://juejin.cn/post/6844903982066827277
你们的项目为啥要用到redis
传统关系型数据库例如mysql已经不适用与所有的场景,比如:秒杀扣库存,app小程序首页访问高峰等访问流量高峰,所以引入缓存中间件。
redis的数据结构有哪些?
String list set sortedset hash
应用场景:
String ->
如果有大量的key需要设置同一时间过期,一般需要注意什么?
过期时间过于集中,到过期时间点,redis出现短暂的卡顿,严重的话会造成缓存雪崩。
解决办法:过期时间加上随机数,分散过期时间。
电商首页经常会定时任务刷新缓存,数据失效时间集中,数据失效时间一样的话,又刚好大批量用户进入,可能会造成缓存雪崩。
redis分布式锁?
setnex争夺锁,抢到锁之后,再用expire给锁加一个过期时间防止锁忘记释放。
setnex后进程断掉了,会造成锁无法释放,怎么解决?
将setnex和expire命令合成一条命令。
redis里面有1亿个key,有10w个key是以某一个固定的前缀开头的,如何将他们全部找出来?
redis中存在一个keys命令(找到指定模式的key)
redis 127.0.0.1:6379> SET runoob1 redis
OK
redis 127.0.0.1:6379> SET runoob2 mysql
OK
redis 127.0.0.1:6379> SET runoob3 mongodb
OK
# 查找以 runoob 为开头的 key:
redis 127.0.0.1:6379> KEYS runoob*
1) "runoob3"
2) "runoob1"
3) "runoob2"
如果redis正在给线上提供服务,namekeys会有什么问题?
redis单线程。keys指令会导致县城阻塞一段时间,线上服务会停顿,直到指令执行完成,服务才能恢复。
可以使用scan指令,scan指令可以没有阻塞提取出指定模式的key列表,会有一定的重复概率。花费时间比keys长。
#
scan 0 match key1111* count 20
Redis是怎么持久化的?服务主从数据怎么交互的?
rdb做全量持久化,aof做增量持久化。
rdb耗时较长,不够实时,停机会造成数据丢失,所以需要aof配合使用。在redis重启的时候,会使用rdb持久化文件重新构建内存,在使用aof重放近期的操作指令来实现完整恢复重启前状态。
rdb相当于表的全量数据,aof相当于每次操作的日志。
机器断电会怎么样?
取决于aof日志sync属性的配置,不要求性能的情况下每条写数据指令是sync一下磁盘,不会造成数据丢失。
高性能的情况下每次都sync是不现实的,一般都使用定时sync,比如一秒一次,最多将丢失1秒的数据。
RDB原理是什么?
RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
RDB持久化的触发分为手动触发和自动触发两种。
手动触发:save,bgsave
save会阻塞redis服务器进程,知道rdb文件创建完成为止。redis服务器阻塞期间不能处理任何命令请求。
bgsave会创建子进程,由子进程负责创建rdb文件,父进程(redis主进程)继续处理请求。
bgsave命令执行过程中,只有fork子进程时候会阻塞服务器,而对于save命令整个过程都会阻塞服务器,因此save已经被废弃了。
自动触发:
- redis.conf文件
# 当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
save 900 1
save 300 10
save 60 10000
- 在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点
- 执行shutdown命令时,自动执行rdb持久化,日志可以看到
是否使用过Redis集群,集群的高可用怎么保证,集群的原理是什么?
- 哨兵模式:Redis Sentinal 着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
- 主从模式:Redis Cluster 着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。