1. Redis简介
C语言编写,开源的非关系型数据库,在内存中操作,速度快,数据类型有集合,有序集合,散列表,字符串,列表
2. Redis优缺点,为什么要用 Redis
优点:在内存中,读写速度快
支持事务,原子性,以及事务合并
数据类型多,zset,set,list,string,hash
支持主从复制
支持本地持久化,aof,rdb
缺点:受到物理内存大小的限制
难以在线扩容,需要上线时就确定容量大小
主从复制会带来宕机引起的数据一致性问题
灾备恢复能力差
Redis在内存中操作带来的好处有提高性能,以及应对高并发时直接在缓存中处理请求,减轻数据库压力
3. 为什么要用 Redis 而不用 map/guava 做缓存
map这些是java自带的,会随着jvm的生命周期,而且不同缓存副本的不具有一致性,称为本地缓存
Redis不同实例在缓存中具有一致性,称为分布式缓存
4. Redis为什么这么快
基于内存,内存读写性能就比较好
数据结构简单,redis的数据结构是专门设计的
单线程,不会出现竞争或者冲突
采用多路io复用
具有自己的vm机制,不需调用系统的函数,节省时间
5. Redis有哪些数据类型
string,list,set,zset,hash
6. 什么是redis持久化,有哪些机制,优缺点是什么
通过把内存里的数据保存到本aof,rdb(redisdatabase)
aof优点是完整,利用日志恢复的,但慢
rdb优点是快,但由于服务有错误率,数据也会有丢失
7. 如何选择合适的持久化方式
关心数据使用rdb,通常为了安全性可以同时使用两种,系统会优先用aof
8. 如何扩容
缓存中使用一致哈希,持久化使用keytonode,运行时数据平衡
9. 过期键删除策略有哪些
惰性:使用时才判断是否过期
定时:都设置过期时间,到期自行删除
定期:定期扫描检查过期键
10. redis数据应用场景:计数器,string可以增减,并且redis也可以应对频繁读取变化
热点数据:一些常用的数据放到缓存里
list:list配合rabbitmq,实现消息队列
set,做一些并集,交集的操作,比如好友列表,共同好友
11. Redis主要消耗什么物理资源: 内存
12. 集群方案有哪些:
哨兵模式;redis官方提供了cluster方案;基于客户端分类;基于服务器分片
13. redis主从架构: 主节点master负责写,从节点slave负责读,分担读取压力,好处在于支持高并发,并且方便扩容
14. 如何设置过期和永久?过期了怎么处理?
expire persist;方法一:定期检查删除,缺点是耗费性能大;方法二:使用时才检查,缺点是逻辑比较复杂
15. redis数据量小,如何应对实际需求
通过数据淘汰策略,保证都是热点数据
16. redis内存用完会怎样,如何优化
会返回错误信息,可以做数据淘汰释放内存,优化策略主要是存放时对数据加工一下,放进散列表就比较节约空间
17. redis什么是事务
不可再分割的一个操作,其中要不执行要不全部不执行 ,但注意不具有原子性,redis中只有命令有原子性
acid四种特性中,redis具有一致性和隔离性,当使用持久化时,也有持久性
18. Redis有哪些常见异常
缓存击穿:缓存中没有的数据,数据库中有,压力都放在数据库上
缓存穿透:缓存和数据库中都没有的数据,导致数据库压力大,与雪崩的区别在于,雪崩是多条数据,穿透是一条数据被请求
缓存雪崩:缓存大面积失效,数据库压力突增
19. Redis中的缓存预热
缓存预热就是在上线前,把一些可能会高频使用的数据先放缓存里,这样就降低了对数据库的访问压力
一般会手写一个缓存刷新页面,上线前手动操作,设置定时刷新缓存
20. 缓存降级
缓存降级就是所谓丢卒保车的方法,在缓存压力过大时,对相对不重要的数据进行降级,保证核心功能的正常,比如redis有直接给用户返回默认值,而不去数据库查询的策略
21. 热点数据:
当数据库一些数据频繁被接口所调用,就是热点数据,就要考虑放到缓存,类似的还有热点key,就是大量请求落到一个key上,会造成数据库压力过大,需要加锁,不同请求通过锁顺序访问
22. redis作用于哪些方面?
使用场景:
缓存:减轻mysql的查询压力,提升系统性能
排行榜:利用redis的sortSet实现
计算器,限速器:
利用redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。这类操作如果用mysql,频繁的读写会带来相当大的压力
限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用于抢购时,防止用户疯狂点击带来不必要的压力
好友关系:
利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之类的功能
消息队列:
除了Redis自身的发布、订阅模式,我们也可以利用List来实现一个队列机器,比如:到货通知,邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦
Session共享:
Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同的机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户胡落在哪台机器上都能获取到对应的Session信息
23. redis 和mysql的区别
redis是缓存数据库,value类型有hashmap、list、set、zset、string,redis读取快,数据量小,多作为队列,锁,数据读取缓存
mysql是关系型数据库,数据类型大致有日期,数值、字符,mysql读取慢,数据量大,多作为数据持久化和管理
24. redis怎么缓存的?
通过一个处理用户请求的类,对请求数据在redis缓存中查询,如果命中,就将信息返回给用户,未命中则执行业务逻辑去数据库查询
同时还需要做好数据一致性,数据变动通常是mysql先变动,后主动更新redis中的数据
25. redis数据库怎么配置
通常要安装redis,之后在目录下启动redis,在命令行里可以对redis的数据进行一些基本操作,在目录下有redis.conf可以配置一些基本的功能,比如远程访问,端口屏蔽,在sentinel.conf里可以配置哨兵
项目整合redis,在application.yml里可以配置redis参数,如端口,库名,连接池相关参数在jedis中配置
然后需要一个配置类,比如继承CachingConfigurerSupport,实现redis对数据库数据的缓存
26. 服务器上redis的执行
1、客户端发送请求命令;
2、读取请求命令;
3、请求命令执行。
4.各种检查操作,如果有不通过的,服务器会拒绝执行
5、通过后处理回复给客户端,如果有aof,则会写入aof缓冲区
27. redis怎么修改数据保存时间
在命令行中可以修改,例如config set timeout 250;也可以在业务中代码修改,例如JedisClient.set(key, value, “NX”, “EX”, expireSecond);参数 NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒