1.说说你对Redis的了解?
1、Redis是基于C语言开发的key-value形式的nosql数据库,数据存储在内存中,有string hash list set zset 五种数据类型
2、由于数据存储在内存中,为防止服务器宕机数据丢失,支持RDB和 AOF 俩种持久化方式。
RDB: 默认开启,把内存快照的形式把内存中的数据持久化到本地磁盘文件。
AOF: 默认不开启,需要手动开启,设置appendonly 值为yes;aof是把写或删除的操作(命令)日志以追加的方式保存磁盘文件
2.说下对Redis缓存使用的了解
1、Redis缓存使用,首先查询数据时先从Redis缓存中查询,如果缓存中有数据,直接返回数据。如果查询不到,再去数据库中查询,查到数据添加到Redis缓存,返回查询的数据。
2、Redis缓存涉及到数据同步问题:
当数据库数据发生变化时,Redis缓存中的数据也需要同步,否则导致数据不一致。
所以,数据新增、修改、删除时,把Redis缓存的数据清空。当再次查询时,先从数据库查询,然后把数据缓存到Redis中;这样就保证了数据的同步。
数据发生变化时,Redis缓存中的数据也需要同步,否则导致数据不一致。
3.介绍下Redis缓存雪崩?
缓存雪崩造成因素有2个:
1、Redis服务器宕机
2、同一时间Redis中缓存的数据大量过期,原本该去缓存查询的大量请求,有缓存出现问题,全都去数据查询,导致数据压力太大,系统崩溃。
解决方案:
可以给key的过期时间+随机数(让key的过期时间尽可能的分散)
4.介绍下Redis缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库。
解决方案:
查询数据库如果没有,也要在Redis缓存一个空数据(key的value值:空字符串)。
但是有可能出现缓存同步问题:
解决方案: key设置一个很短的过期时间。key过期以后,Redis会清空这个key ,下次去查询时候,Redis中查不到,就会去查数据库,如果数据库查到值,就可以缓存到Redis,从而保证数据的同步。
5.Redis 过期策略
● 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
● 惰性删除:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null
● 定期删除:每隔一段时间执行一次删除过期key操作
Redis默认过期策略是:定期删除+惰性删除。
6.Redis缓存预热
缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
缓存预热解决方案:
(1)直接写个缓存刷新页面,上线时手工操作下;
(2)数据量不大,可以在项目启动的时候自动进行加载;
7.Redis缓存降级
当访问量剧增、服务出现问题,比如响应时间慢或不响应,或者非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有问题的服务。redis可以帮助系统实现数据降级载体,系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的
8.Redis缓存同步
mysql数据可能会发生变动,那么redis就要跟数据库的数据保持一致,我们实际去使用的时候,是在数据发生变动的地方,比如增删改的时候,新起一个线程,然后将变动的数据更新到redis中,根据不同的场景需求,也可以在数据变动时,把redis里的数据删掉,下一次用户查询的时候,发现redis中没有数据,就会重新去数据库加载一遍,这样也可以实现同步的效果
9.Redis 是单线程的么?线程安全么
redis 是单线程,线程安全。
因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。
redis 实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题
不过对于需要依赖多个 redis 操作的复合操作来说,依然需要锁,而且有可能是分布式锁