1、redis是什么,和应用场景
redis:remote dictionary server 远程数据服务或远程字典服务。 c语言写的key-value 存储系统
应用场景:缓存,数据库,消息队列,分布式锁,点赞列表,排行榜等
2、redis的八种数据类型
5种基本数据类型:
string:字符串。计数器,粉丝数,简单分布式锁
hashmap:key-value,value是一个map?
list:列表。可以当做 栈,队列,阻塞队列
set:集合,不能重复。点赞,收藏等
zset:有序集合,不能重复。有序集合的每个元素都需要指定一个分数,根据分数升序排列。排行榜等
3种特殊类型:
geospatial:3.2推出Geo类型,可以推算地理位置,两地之间的距离
hyperloglog:数学上集合的元素个数,不能重复,可以用来 统计网站的UV
bitmap:bit的值可以是0或1。表示某个元素对应的值或状态,可以统计用户信息例如 活跃分数,是否登录,是否打卡等
3、redis为何这么快
官方数据 redis 每秒可以支持 10w并发,原因大概如下
基于内存:
单线程模型处理客户请求,避免上下文切换
io多路复用:
c语言实现,有很多优化机制,例如动态字符串sds
4、redis6.0之后有多线程,会导致线程安全问题吗
不会。redis 依然是单线程模型处理客户端请求,只是多线程处理 读写和协议解析
执行命令还是单线程,所以不会有线程安全问题
引入多线程是因为:redis的性能瓶颈是网络io,而非cpu,多线程可以提高 io读写效率(io密集型?)
5、redis持久化机制,优缺点
redis有两种持久化机制:AOF 和 RDB
AOF:redis每执行一个命令,会将原语句记录到aod文件中,再通过fsync 策略将执行后的数据持久化到硬盘上(不含读语句)
优点:最多丢失1秒数据;
写入性能高(命令直接追加在文件末尾);
适合灾难性误删除恢复(AOF日志文件可读,如果flushall清空数据,但是还没有rewrite,就可以把flushall命令删除,进行恢复)
缺点:AOF文件比RDB数据快照大;
aof每次命令都写入,比rdb消耗性能多,aof重写可以优化文件
数据恢复慢,不适合冷备
RDB:redis默认持久化方式,周期性备份redis的整个文件(某个时间点,redis内存中的数据以二进制形式存储在rdb文件中),也为快照。采用fork子线程的方式来 写时同步
优点:大量数据恢复快(因为有全部数据快照);对读写影响小(因为是fork子线程)
缺点:可能会丢失较长时间的数据;同步可能会影响redis工作(fork子线程与redis数量量关系很大,可能有暂停几秒,如果数据大)
6、redis的过期键的删除策略
定时删除:每个设置了过期时间的key需要创建一个定时器,过期则删除。对内存友好,就是让cpu挺忙的
惰性删除:访问key才判断是否过期,及删除。节省了cpu资源,但是白白浪费了内存
定期删除:定期任务扫描 过期的key,并删除。是前两种方式的折中,平衡cpu和内存
7、redis的内存淘汰策略- 8种
- 1.noeviction:直接返回错误,不淘汰任何已经存在的redis键
- 2.allkeys-lru:所有的键使用lru算法进行淘汰
- 3.volatile-lru:有过期时间的使用lru算法进行淘汰
- 4.allkeys-random:随机删除redis键
- 5.volatile-random:随机删除有过期时间的redis键
- 6.volatile-ttl:删除快过期的redis键
- 7.volatile-lfu:根据lfu算法从有过期时间的键删除
- 8.allkeys-lfu:根据lfu算法从所有键删除
8、热key问题怎么解决
热key:大量请求方位某一个key,导致redis宕机
解决:结果缓存到本地内存;热key分散到不同服务器;永不过期;
9、缓存击穿,穿透,雪崩,怎么解决
缓存穿透:请求的数据在缓存和数据库都不存在,每次都要查数据库并返回空
解决:步隆过滤器;返回空对象
缓存击穿:大并发对热点key 集中访问,key失效的瞬间,持续的大并发穿透缓存,直接请求数据库。就好像 火力集中在屏幕击穿了一个洞
解决:互斥锁;永不过期
缓存雪崩:缓存中不同的数据大批量到了到期时间,而且查询数据量大,请求直接到数据库,导致宕机
解决:均匀过期;互斥锁;永不过期;双重缓存;
10、redis的部署方式
单机:
主从:
哨兵:
cluster集群:
1、
1、
1、
1、
1、
参考文章:
https://mp.weixin.qq.com/s/j7NzkVJlxYWrPAdqPi7BwA