redis常见面试题

                      **1.redis主从复制**
         主从复制是指将一台redis服务器复制到其他redis服务器上,前者是主节点,后者是从节点;
         
   默认情况下,一个主节点可以对应多个从节点,一个从节点只能对应一个主节点
   
   **如何使用主从复制**:**

建立复制
需要注意,主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情。

从节点开启主从复制,有3种方式:

(1)配置文件

在从服务器的配置文件中加入:slaveof

(2)启动命令

redis-server启动命令后加入 --slaveof

(3)客户端命令

Redis服务器启动后,直接通过客户端执行命令:slaveof ,则该Redis实例成为从节点

   **2.redis两种持久化保存机制**
分别是RDB和AOF两种,默认情况下选择的是RDB; 

RDB的话是一种快照的方式来存储的,就是每隔一段时间对数据进行一次存储,默认是15s,也可以到redis.windows.conf

文件中修改save 900 1将其改成合适的时间,这种方式的话性能是比较高的

AOF的话是即时性的方式来保存,只要数据发生改变都会保存一份到磁盘中,这种方式对数据保存的完整性是比较高的,但

是性能是比较差的,   **一般的话都是两种方式结合使用的**

   **什么是缓存穿透,如何避免**

缓存穿透就是缓存和数据库中都没有该数据,而用户不断发起请求来访问数据库;我们可以利用这个漏洞对数据库造成压力

解决方案:

当发生穿透时,我们会返回一个空对象给缓存,并且会设置一个过期时间,之后再访问数据时就可以从缓存

中直接取出即可,

代码实现
@Override
public TbItem selectItemInfo(Long itemId) {
//查询缓存
TbItem tbItem = (TbItem) redisClient.get(ITEM_INFO + “:” + itemId + “:”+
BASE);
if(tbItem!=null){
return tbItem;
//把数据保存到缓存
redisClient.set(ITEM_INFO + “:” + itemId + “:”+ BASE,tbItem);
//设置缓存的有效期
redisClient.expire(ITEM_INFO + “:” + itemId + “:”+ BASE,ITEM_INFO_EXPIRE);
return tbItem;
}
//把数据保存到缓存
redisClient.set(ITEM_INFO + “:” + itemId + “:”+ BASE,tbItem);
//设置缓存的有效期
redisClient.expire(ITEM_INFO + “:” + itemId + “:”+ BASE,ITEM_INFO_EXPIRE);
return tbItem;
}
7.什么是缓存雪崩,如何避免?

缓存雪崩,是指在某一个时间段,缓存集中过期失效。

比如在商品抢购的时候,缓存里存的商品都是在晚上12点失效,而这时候刚好大量用户来访问这些

商品,这时候数据库的压力就会一下上来了

所以在做电商项目的时候,一般是采取不同分类商品,缓存不同周期。在同一分类中的商品,加上

一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的

商品缓存时间短一些,也能节省缓存服务的资源。

解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。

设置热点数据永远不过期。

8.什么是缓存击穿,如何避免?

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个key不停进行访问,当这

个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:

  1. 设置热点数据永远不过期
  2. 加分布式锁
    }
    tbItem = tbItemMapper.selectByPrimaryKey(itemId);
    /解决缓存穿透****/
    if(tbItem == null){
    //把空对象保存到缓存
    redisClient.set(ITEM_INFO + “:” + itemId + “:”+ BASE,null);
    //设置缓存的有效期
    redisClient.expire(ITEM_INFO + “:” + itemId + “:”+ BASE,30);
    return tbItem;
    }
    //把数据保存到缓存
    redisClient.set(ITEM_INFO + “:” + itemId + “:”+ BASE,tbItem);
    //设置缓存的有效期
    redisClient.expire(ITEM_INFO + “:” + itemId + “:”+ BASE,ITEM_INFO_EXPIRE);
    return tbItem;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值