Redis面试题


Redis是什么?都有哪些使用场景?

redis是非关系型数据库,这些数据库的统称是nosql数据库

redis常用在缓存,消息队列,分布式锁这些场景种


Redis的常用命令有哪些?

redis中有五种数据结构

String 字符串类型,可以存储对象的json字符串

(1)set 添加元素

(2)get获取元素的值

(3)setnx元素不存在的时候,才会添加

(4)setex设置元素的过期时间

list 添加的元素可以重复,按照插入顺序排序

(1)lpush向头节点添加元素

(2)rpush向尾节点添加元素

(3)lrange获取指定范围的元素,或者获取所有的元素

(4)llen获取元素的个数

hash

(1)hset 添加多个或者一个hash元素

(2)hget获取指定hash元素中的filed的元素

(3)hkeys从hash中获取到所有的filed

(4)hvals从hash中获取到所有的values

(5)hgetall 获取所有的hash元素

(6)hdel 删除hash元素

set 无序集合,没有重复元素

(1)sadd 添加一个或者多个set类型的元素

(2)smembers 返回集合中所有的元素

(3)scard 返回元素的个数

(4)srem 移除一个或多个元素

zset 每一个元素都关联一个分数,根据分数排序,用在排行榜中

(1)zadd 向zset类型中添加元素

(2)zrange获取指定位置的元素,获取所有的元素

(3)zincrby向指定的元素加增量

(4)zrem 删除元素

通过命令

(1)keys * 获取所有的键的名字

(2)existe 判断key是否存在

(3)type 判断key的类型是不是存在

(4)ttl 返回该key的存活时间

(5)del 删除这个key值


Redis是单线程还是多线程的?为什么?

redis的单线程是指网络请求模块使用了一个线程,一个线程处理所有的网络请求,不会发生线程安全问题,避免上下文的切换,内存操作,速度快,不牵扯io操作

其他模块仍然用了多线程


Redis持久化有几种方式?如何配置?

redis有两种持久化,一种是RDB,一种是AOF

RDB持久化,每隔一定时间将内存中的所有数据写到磁盘中,当服务器出现故障重启之后,从磁盘中读取数据,从而恢复数据,在redis.conf文件中默认就开启这种持久化方法,我们也可以`使用命令来进行RDB持久化,save命令和bgsave命令,save命令会在主进程种来执行,会阻塞,而bgsave命令不会在主进程来执行,会另外开一个进程执行RDB持久化

AOF持久化,是将执行的写命令都记录到AOF文件中,可以在redis配置文件中开启AOP持久化,持久化策略有三种

(1)always 每次执行写操作都执行AOP持久化 性能低

(2)ererysec 将写操作放入缓存区中,每秒执行AOF持久化

(3)no 将写操作放入到缓存区中,由操作系统来决定持久化

但是这样持久化,AOF文件也会过大,重复命令多,所以可以对AOF文件进行重写 bgrewirteaof

自动重写 auto-aof-rewrite-percentage 100 文件大小比上次超过100%

auto-aof-rewrite-min-size 64mb 文件超过64MB就重写


Redis支持的数据类型有哪些?其中一个String类型最多存储多大数据?

Redis的数据类型是String,Hash,List,set,zset

String数据类型最多可以存储512MB数据


如何保证Redis缓存数据和数据库数据保持一致?

当我们执行数据库中的增删改操作的时候,可以清楚缓存,在添加缓存

在服务之间,我们可以通过MQ消息队列来进行数据同步


Redis如何实现分布式锁?

使用到的是String类型的setnx命令加锁,setnx命令是key不存在才执行添加操作

当执行setnx命令操作成功,就代表没有加锁,可以执行业务操作

当执行setnx命令没有操作成功,就代表加锁了,不执行业务操作


redis集群的搭建⽅式?(如哨兵集群模式如何搭建)

redis主从集群模式搭建,在slave从集群中的配置文件中添加salveof配置,或者执行salveof配置,一个永久生效,另一个重启不生效

redis哨兵集群模式搭建:

(1)创建Sentinel集群来管理redis主从集群

(2)在每一台Sentinel的配置文件中配置redis主节点的信息

哨兵的作用:监控,自动故障恢复,通知

redis分片集群搭建:

(1)主节点可以有多个节点,每一个主节点也可以有自己的从几点

(2)执行命令./redis-cli --cluster cerate参数来创建分片集群


redis集群备份数据的时候会不会影响对外提供服务,为什么?

不会,因为是bgsave,会在子进程中执行操作


怎么把新的redis加⼊到集群中?

集群伸缩,动态的添加和删除redis节点信息,然后在重新分配插槽


redis集群中插槽有多少个?怎么计算?(哈希槽计算出节点分配)

redis集群插槽有16384个,当存储元素的时候,通过CRC16函数计算出key的hash值,让这个hash值和16384求余,计算出的值,找到这个值对应的插槽的主节点,就将这个元素存储到这个主节点中


Redis的过期键的删除策略(常问)

惰性删除,当这个键过期了,此时是不会删除的,用户在获取的时候,先判断这个key是不是过期了,过期了,就删除,返回null

定期删除,每隔一段时间随机测试一批设置过期时间的键值,过期就删除

配置文件中添加hz 时间


内存淘汰策略(常问)

当超过redis可以存储的最大内存的时候,就会触发淘汰策略

默认的淘汰策略: 不会淘汰键,不过会拒绝写入,写入报错

volatile-ttl 在设置了过期时间的key中,找到快要过期的key淘汰

volatile-random 在设置了过期时间的key中,随机淘汰

volatile-lru 在设置了过期时间的key中,找到最久未使用的key淘汰

allkeys-lru 在所有的key中,找到最久未使用的key淘汰

allkeys-random 在所有的key中,随机删除

volatile-lfu 在设置了过期时间的key中,找到使用次数最多的淘汰

allkeys-lfu 在所有的key中,找到使用次数最多的淘汰


Redis线程模型,单线程为什么快

redis是在内存中操作,单线程避免了上下文的切换,非阻塞io的多路复用


简述redis事务实现

Mysql的事务操作要么是同时成功,要么是同时失败

而redis的事务只会保证在执行的时候,没有其他命令来操作执行,事务中的任意命令执行失败,其他命令还是会执行的

开启事务 multi

关闭事务 exec


缓存雪崩、缓存穿透、缓存击穿(常问)

缓存雪崩:大量的key到期,导致大量的请求访问数据库,导致服务器宕机

解决: 让key的过期时间随机,避免出现大量的key过期

让key永不过期

缓存击穿:热点的key过期了,大量的用户来访问热点key,导致查询mysql,mysql压力过大,宕机

解决: 设置key永不过期

查询mysql加锁,使用双重检查,在锁的里面在查询这个key是否存在,存在就不查询数据库

synchronized (this) {
    data = (String) redisTemplate.opsForValue().get(id);
    if(StringUtils.isEmpty(data)) {
        System.out.println("根据id查询mysql...");
        data = "ccc";
        redisTemplate.opsForValue().set(id,data, Duration.ofSeconds(5));
      }
}

缓存穿透

TODO 待写


什么是布隆过滤器?

布隆过滤器是O(1)

有一个数组,数组中的每个元素只可以存储bit位(0,1)

存储元素:经过一系列的hash函数的多次hash操作,产生hash值

用hash值和数组长度求余,求出来的值为数组的索引值,将数组中的值改为1

查询元素:经过一系列的hash函数的多次hash操作,产生hash值

用hash值和数组长度求余,得到索引值

判断索引值的元素是否为1,1代表存在,0为不存在

弊端: 会出现误判

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值