Redis

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

Redis是非关系型数据库的一种,因为它是基于内存存储,读写性能高,所以一般常用于热点数据或时效性数据的缓存,用来提高读写效率;也有被用于消息队列,和分布式锁,但不常用。

  1. Redis的常用命令有哪些?

Redis的常用命令大致分为6类,5种类型的操作命令,和通用命令;

通用命令有:keysexists key、type key、ttl key、del key等

5种类型的操作命令分为string、list、hash、set、zset

操作string类的命令有:set key value(设置指定key的值)、get key(获取指定key的值)、del key(删除指定key的值)、setnx key value(只有key不存在的时候才能设置key的值)、setex key second vlaue(设置指定key的值,并设置过期时间second)expire key second(给指定key设置存活时间)等。

操作list类的命令有:lpush key values.....将一个或多个值插入到列表头部/尾部rpushlrange key start stop获取列表指定范围内的元素、lpop key移除并获取头部一个元素/尾部rpopllen key获取列表长度、blpop key1 [key2] timeout移除并获取列表头部/brpop尾部一个元素,如果列表中没有元素,则阻塞至超时或发现可弹出元素为止。

操作hash类的命令有:hset key field value将哈希表key中的字段field的值设为value、hget key field获取哈希表中指定字段的值、hdel key field删除哈希表中指定的字段、hkeys key获取哈希表中所有的字段、hvals key获取哈希表中所有的值、hgetall key 获取哈希表中指定key的所有字段和值。

操作set类的命令有:sadd key members...向集合中添加一个或多个成员、smembers key获取指定key的集合中所有成员、scard key获取指定集合的成员数量、sinter key1 key2返回给定所有集合的交集、sunion key1 key2返回所有给定集合的并集、sdiff key1 key2返回所有给定集合的差集、srem key members 移除集合中一个或多个成员。

操作zset类的命令有:zadd key score1 member1 score2 member2向有序集合添加一个或多个成员或更新已存在成员的分数、zrange key start stop返回有序集合中指定范围内的成员、zincrby key increment member给有序集合中的指定成员加increment分、zrem key members移除有序集合中一个或多个成员。

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

redis是单线程的,因为1.redis是内存存储,相比其他操作磁盘做io操作的数据库而言,速度非常快,基本不会有阻塞问题;2.避免了上下文切换,如果是多线程,则无法避免上下文切换,会消耗一定的性能和时间。

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

redis的持久化分为RDB持久化和AOF持久化,两种持久化有区别,RDB持久化也称为redis数据快照,将内存中所有数据存储在磁盘中;而AOF持久化则是将操作日志持久化,数据更安全丢失的数据会更少,但问题在于会存储过多的重复命令,虽然可以配置自动重写,但依旧无法避免AOF文件中的内容过多。各有优势,一般会选择搭配使用;

RDB配置方法:1.通过命令来手动持久化:RDB持久化是redis的默认持久化方式,可以执行save命令或bgsave,save命令会阻塞其他命令,不建议使用;bgsave会开启子进程执行RDB,避免主进程受到影响;2.基于配置的方式自动持久化:redis的配置文件中有save配置,根据需求配置即可,比如save 300 10 表示300秒内至少有10个数据变更则自动进行一次持久化,底层也是bgsave,相关的配置还有rdb文件的储存位置配置及rdb文件名称的配置等。

AOF配置方法:配置文件中将appendonly设为yes,appendfilename设置aof文件名,根据需求配置appendfsync:always每进行一次写操作就持久化一次,everysec每秒进行一次持久化、no不持久化;AOF持久化命令BGREWRITEAOF;自动重写aof的话可以配置auto-aof-rewrite可以根据文件大小比上次超过的百分比进行重写,和按照文件大小超过多少来进行重写。

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

redis支持的数据类型有string字符串、list列表、hash哈希、set集合、zset有序集合。

string类型的最大数据512M。

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

可以给缓存设置有效期,到期后自动删除,或者同步双写,在修改mysql数据库的同时,清理redis中的缓存数据。

实现方式采用异步通知,当数据库数据变更后,发送一个消息,相关服务监听到消息后清理缓存数据

可使用基于MQ的异步通知,也可以使用基于Canal监听mysql中继日志的通知。

  1. Redis如何实现分布式锁?

redis锁原理:用setnx加锁,setnx就是只有key不存在的情况下才能设置值,如果能加锁成功,执行业务、如果加锁失败,不执行业务。java中可以使用Redisson框架,这是操作Redis的java客户端API,类似于jedis。

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

redis集群搭建:修改redis.conf配置文件,从redis在配置文件中配置slaveof 配置,声明主redis的ip 主redis的端口即可指定主redis,主redis具备读写功能,从redis只有读功能,一旦主redis宕机,该集群则无法进行写操作,该问题可使用哨兵集群模式解决,哨兵模式将按照指定的规则,将符合规则的从redis升级为主redis,并将该redis集群中其他的redis设置为它的从redis包括原主redis。

哨兵集群的搭建方式:

配置sentinel节点的sentinel.conf配置文件

①节点占用的端口;②节点的ip;③redis主节点的地址、端口和客观下线的数量;④主观下线时间,n秒内没有和sentinel心跳检测成功视为主观下线;⑤失败迁移最大时间;⑥数据目录位置;⑦是否以后台模式启动

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

不会因为是异步的备份的,RDB底层用的是bgsave

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

集群伸缩,可以动态的给集群中添加或删除节点;如果添加的数主节点,还需要重新分配插槽范围。

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

redis分片集群的插槽有16384个(0-16383),redis的槽是redis_Cluster集群中的概念,一共有16384个槽,槽就是用来存储数据的,当一个key过来时,通过RCR16算法,类似于hash的算法算出一个值,然后对16384进行取模。

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

redis中同时使用了两种过期删除策略,一种叫惰性删除,一种叫定期删除;

惰性删除就是当一个key过期了,但redis并没有将其立刻删掉,而是当你去访问这个key的时候,redis会先判断key是否过期,如果过期了则删除并返回null;

定期删除可以理解为定时任务,按照指定的定时任务执行频率,随机测试一批设置了过期时间的key,如果发现已过期,则删除。在redis.conf配置文件中,有一个hz 10的配置,这个配置就是设置过期删除执行频率的,可以理解为每隔10秒执行一次任务,判断设置了过期时间的数据中有哪些过期了,并将过期数据进行清理,每次清理不超过cpu执行时间的25%。redis默认使用定期删除;

  1. 内存淘汰策略(常问)

当redis内存超过最大允许内存后,会触发内存淘汰策略;该策略可以在redis.conf中配置maxmemory-policy来控制,内存淘汰策略在redis4.0之前有6种,4.0之后新增了2种;

4.0之前分别是:

①、noevication(默认值):不淘汰任何数据,内存不足,拒绝写入,写入报错

②、volatile-lru:在设置了过期时间的数据中,将最久未使用到的数据淘汰

③、volatile-random:随机淘汰设置了过期时间的数据

④、volatile-ttl:在设置了过期时间的数据中,将过期时间最小的一个数据淘汰

⑤、allkeys-lru:在所有数据中,淘汰最久未使用的数据

⑥、allkeys-random:在所有数据中随机淘汰

4.0之后新增的2个时:

⑦、volatile-lfu:在设置了过期时间的数据中,按照频率淘汰

⑧、allkeys-lfu:在所有数据中,按照频率淘汰

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

①、redis是纯基于内存存储

②、核心是基于非阻塞IO多路复用机制

③、单线程反而避免了多线程的上下文频繁切换而带来的性能问题

  1. 简述redis事务实现

redis事务可以一次执行多个命令,并且带有以下三个重要的保证:

①、在发送 EXEC 命令前批量操作被放入队列缓存

②、收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

③、在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

redis事务从开始到执行会经历三个阶段:开始事务---命令入队---执行事务

先执行 MULTI命令开启事务,再执行读写操作,读写操作执行完毕后执行EXEC命令执行事务。

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

雪崩指的是:如果redis中有大量的数据过期了,这时又有大量的请求来查询这些已经过期的数据,会导致这些请求全部都打到mysql上,由于redis的并发肯定是比mysql并发高的,那么大量的请求查询mysql就有可能造成mysql宕机。

雪崩解决方案主要有2种:

①、设置热点数据永不过期

②、缓存数据过期时间设置为随机,防止同一时间大量数据同时过期的现象发生;

击穿指的是:redis里面有一个热点数据过期了,这时又有大量的请求来访问该热点数据,但redis中并没有该数据,那么这些请求就会全部去查mysql,在高并发的情况下就会导致mysql宕机。

击穿解决方案主要有2种:

①、设置热点数据永不过期

②、给查询mysql的操作加锁,并且进行双重检查,也称为双检锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值