Redis
Redis的应用场景?
2. Redis持久化数据和缓存怎么做扩容?
如果Redis只做缓存使用时,可以使用一致性hash实现动态扩缩容.
3.Redis的过期键的删除策略?
(1)定期删除,每个设置过期时间的key,都需要设置一个定时器,当key过期是立即删除.对内存很友好,但是会大量消耗CPU处理过期key,影响缓存的响应时间和吞吐量(空间换时间)
(2)惰性删除 当访问某key,判断是否过期,过期就再删除.该策略对内存不友好,当大片key过期后没及时删除,缺占用了大量内存
(3)定时删除 多长时间内删除过期数据
4,Redis key的过期时间和永久有效分别怎么设置?
expire和persist命令
5,MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
Redis数据集大小升到一定数量时,就会实行淘汰策略.
6,Redis的内存淘汰策略有哪些?
expire 1,淘汰快过期的. 2淘汰最近使用最少的. 4 不淘汰 5,随机移除某个key
内存淘汰策略不影响过期key的处理,淘汰策略用于内存不足时,需要申请额外的数据.过期删除策略由于处理过期数据.
7,哨兵模式
集群监控 :sentinel负责监控master和slave服务是否正常运行
消息通知 :如何某个Redis发生故障,sentinel会发送消息,作为警报通知管理员
故障转移 : 当master 的node发生故障时,会转移到slave node上
配置中心 :当master发生故障,会通知client新的master地址
8,redis 主从复制的核心原理
1,当主库和从库建立连接后,主库后台生成RDB文件
2,此时新的写命名将缓存到内存中
3,当RDB文件完成后,master将RDB文件和所有缓存的写命令发送给slave
4,slave接受到RDB文件,将文件保存到本地磁盘,再从磁盘中读取数据,并执行收到的缓存命令
5,之后,master收到写命令就会将命令发送给slaveRedis中,从而保证了数据一致性
缺点,所有的slave数据同步和复制都是master节点操作的,会造成master节点压力太大,解决方案使用从从复制.
Redis的问题
9,Redis实现分布式锁?
redis是单进程单线程模式的,采用列队模式将并发访问变成串行访问,Redis可以使用setNX命令实现分布式锁
当且key不存在,将key的值设成value,若给定的key存在,setNX不做任何动作
SETNX是(set if not exists)如果不存在,则set的简写.
返回值,设置成功返回1,失败返回0
10,如何解决 Redis 的并发竞争 Key 问题?
基于zookeeper临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬
时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。
11,redis穿透的解决方案?
1,在接口上进行效验,ID<=0的,直接拒绝,设置ip黑名单,白名单
2,在Redis设置key-value对为key=null,
3,使用布隆过滤器,将所有可能存在的数据哈希到一个大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免对底层存储系统的压力
12,什么是redis雪崩?
就是Redis负载过大而瘫痪,导致数据库压力大也瘫痪.最终整个系统瘫痪
解决办法: 1,在过时时间上加个随机数,别让key都在同一时间内过期
2,缓存预热,关闭外网服务,开启MySQL,使用预热脚本将热点数据写入缓存中,启动缓存,开启外网服务.
3,搭建集群,将原来一个人干的分给多个人干.
13,什么是redis穿透?
高并发情况下,Redis中的某些key,这个有大量的请求访问这些key,很不幸,这些key失效了,这个时候就会导致大量的请求直接跑到数据库,数据库扛不住直接宕机。
解决方案:1分级缓存,备份两份数据,一份数据设置时间长一点,第二份数据用于被请求命中,如果第一次数据被命中说第二份已过期,然后去数据库重新备份两份数据
2,计划任务,对热点数据进行追踪,定期进行延时过期
14,缓存热点key.
缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方法:对缓存进行加锁,当发现热点key不存在是,进行加锁,访问的请求就会先等待,等从DB读写到数据后,在释放锁
15.redisTemplate客户端乱码设置
@Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> objectObjectRedisTemplate = new RedisTemplate<>(); objectObjectRedisTemplate.setKeySerializer(new StringRedisSerializer()); objectObjectRedisTemplate.setHashKeySerializer(new StringRedisSerializer()); objectObjectRedisTemplate.setDefaultSerializer(new StringRedisSerializer()); objectObjectRedisTemplate.setStringSerializer(new StringRedisSerializer()); objectObjectRedisTemplate.setValueSerializer(new StringRedisSerializer()); objectObjectRedisTemplate.setHashValueSerializer(new StringRedisSerializer()); // objectObjectRedisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); objectObjectRedisTemplate.setConnectionFactory(connectionFactory); return objectObjectRedisTemplate; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理