硬核!Redis面试知识总结

目录:
一Redis是什么
二Redis 的特点
三 Redis常用策略
四 Redis遇到的问题
五Redis 和memcache 的区别
六 Redis的应用
七 Redis的总结
一 Redis是什么?
Redis是C语言开发下的一个开源的(遵守BSD协议)高性能键值对的数据库,可以用做数据库.缓存.消息中间件.它是一种NOSQL(泛指非关系型数据库)的数据库
二 Redis的特点:
1.性能好:数据存储在内存中 读写速度快,支持并发10W QPS
a.业务要求:
redis运行在内存中,如果redis执行大量的set操作最终导致内存溢出 为保证redis正常运行,必须实现内存控制
Redis内存优化策略
1.volatile-lru:将设定超时时间的数据采用lru算法删除
2.allkeys-lru:所有数据采用lru算法删除
3.volatile-lfu:将超时时间的数据采用lfu算法删除
4.allkeys-lfu:所有数据采用lfu算法删除
5.volatile-random:将设定超时时间的数据随机移除
6.allkeys-random:所有数据随机删除
7.volatile-ttl:将设定超时时间的数据采用ttl方式排序,将马上要过期的数据删除
8.noeviction(默认策略):如果内存溢出 不会删除数据 只会报错返回
注:(1.lru算法:即最近最少使用 是一种常用的页面置换算法
2.lfu(引用次数最小):即最不经常使用,引用计数最小的页)

2.线程安全:单进程单线程 ,采用IO多路复用机制。
1.因为redis使用的是单线程,且Redis是完全基于内存的操作,CPU不是redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽
2.Redis使用多路复用IO模型,非阻塞IO
3.采用单线程就可以避免不必要的上下文切换和竞争条件 不用考虑锁的问题
3.丰富的数据类型
首先Redis内部使用一个redisObject对象来表示所有的key和value
加粗样式
a.String(字符串) 二进制安全 可以存储任何数据 比如jpg 或者序列化对象 —
b.Hash(字典) 键值对集合 适合存储对象 并且可以像数据库中的update一个属性一样只修改某一项属性值 存储 读取 修改用户的属性
c.List(列表) 链表(双向链表) 增删快 提供了操作某一元素的api 最新消息排行 消息队列
d.Set(集合) Hash实现元素不重复 添加 删除 查找的复杂度都是o(1),提供了求交集 并集 差集的操作 共同好友 利用唯一性 统计访问网站的所有ip
e.Sorted sort(有序集合) 将set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时 已经进行了天然排序 排行榜 带权重的消息队列
*
4.支持数据持久化:可以将内存保存在磁盘中,重启时加载
1.为什么持久化?
Redis中的数据保存在内存中,但是内存特点断电即擦除,为防止内存数据的丢失,必须进行持久化操作,将内存中的数据定期保存在磁盘中。
2.Redis中持久化的规则
a.RDB模式(redis中默认的持久化策略)
优点:RDB模式工作效率高 RDB模式定期做内存数据的快照,持久化文件较小,数据恢复时间较短 RDB操作是同步的
缺点:RDB模式定期持久化(每隔一段时间持久一次)风险:可能会丢失数据

注:持久化命令:
save:阻塞式持久化.当redis持久化操作时,不允许用户更新数据
bgsave:非阻塞式。在后台单独执行持久化操作,但是不知道什么时候执行完成。类似于GC
b.AOF 模式
优点:可以实现实时持久化(不丢失数据)基于异步进行 记录用户操作过程 持久化文件大
缺点:需 要手动开启

****联系:1.两种模式可以同时存在
2.如果同时进行,以AOF模式为准,AOF优先级高

三。Redis高级(进阶):
1.Redis分片机制
目的:Redis分片机制 实现内存扩容(性能高)
2.Redis 高可用-哨兵机制
**主从复制原理:
1.哨兵主要根据IP地址和端口监听主机Master,并且记录当前主机全部的从机的信息2.哨兵根据PING-PANG机制检查当前主机是否存活,如果连续3次主机没有响应表示主机宕机 之后由哨兵开始选举
3.哨兵根据内部的推选 选举新的主机 之后修改其他的redis的配置文件实现新的主从关系

*比较:1.分片效率最高
2.Redis分片主要目的是实现内容扩容
缺点:Redis分片没有实现高可用技术,如果一台Redis宕机,则分片不能正常运行
redis哨兵:
优点:实现了故障迁移
缺点:哨兵本身没有实现内存的扩容
哨兵本身没有实现高可用
3.Redis集群:
需求分析:
为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从数据库中读取。
由于内存大小的限制,使用一台redis显然无法满足需求,这就需要多台redis作为缓存技术,为保证数据一致性,这就需要搭建redis集群,采用合理的机制,保证用户正常的访问需求。
集群的搭建:一般是奇数台(因为搭建偶数台的数量和搭建奇数台数量效果相同 所以选奇数台)
公式:当前存活服务器数量>n(整个集群数量)/2
1-1=1/2//false
2-1=1>1 false
3-1=2>1.5 true 最小的集群规模是3台
四.redis的问题
1.缓存和数据库一致性问题
如果项目对缓存的要求是强一致性的,那么就不要使用缓存
如果使用缓存又想降低这一问题的话,我们只能采取合适的策略来更新缓存(1更新数据库后及时更新缓存 2.缓存失败时增加重试机制.)
2.Redis雪崩问题
大量用户的涌入,缓存失效,数据库抗不住这么大请求量,真实情况是DBA没反应过来就挂了。这时候重启数据库,但数据库又被新流量打死了,这就是缓存雪崩
处理措施:1.在批量存数据时,把每个值加个随机值就好了,这样可以保证数据不会大面积失效
2.设置热点数据永不过期,有更新操作就更新缓存好了
3.缓存穿透和击穿
缓存穿透是指缓存和数据库都没有数据(如很大的数值缓存和数据库都没有),而用户不断发起请求。严重时可能会击垮数据库
缓存穿透在接口处增加校验,比如id<=0;直接拦截
缓存击穿(热点数据):是指一个key非常的热点,在不停的扛着大量的请求,当这个key失效时,持续大的并发直接落到数据库上就在这个key的点上击穿了缓存
缓存击穿措施:设置热点数据用不过期,或者加上互斥锁就搞定了
五.Redis和Memcached的区别
1.存储方式上:Memcache会把数据全部存在内存中,断电之后会挂掉,Redis有部分数据存在硬盘上这样能保证数据的持久性
2.数据类型上
memcache仅支持简单的key-value,而redis支持五种数据类型
3.Value的大小:Redis可以达到1GB,而Memcache只有1MB
六.Redis的应用
1.使用spring cache 集成Redis
Spring Cache具备很好的灵活性,不仅能够使用SPEL(Spring expression language来定义缓存中的key 和各种condition ,而且提供了开箱即用的缓存临时存储方案、例如:
1.定义接口
public interface UserService{
void get(Integer id);
}
2.定义接口实现类
public class UserServiceImpl implements UserService{
private static Map<Integer,User> userMap=new HashMap<>();
static{
userMap.put(1,new User(1,“肖战”,25));
}
public User get(Integer id){
return userMap.get(id);
}
3.测试类
UserController
public void get(@PathVariable(“id”) String idStr){
Integer id=Integer.parseInt(idStr);
User u=userService.get(id);
4.在主启动类上添加缓存
七.总结
1.划重点:安装Redis实操

**

发布了7 篇原创文章 · 获赞 3 · 访问量 255

猜你喜欢

转载自blog.csdn.net/qq_43614498/article/details/104856953