admin管理员组文章数量:1794759
Redis面试题(2022)
Redis(缓存) 1、Redis 是什么?
Redis本质是一个Key_Value类型的内存数据库,整个数据库系统加载在内存当中进行操作, 定期通过异步操作把数据库数据使用Copy_on_write技术持久化到硬盘中保存。
2、Redis 有哪些应用场景?缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、用户消时间线 timeline、消队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.
3、Redis 有什么优势?- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
(1)完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
(2)数据结构简单,操作也简单,Redis 中的数据结构是专门进行设计的;
(3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题
(4)使用多路 I/O 复用模型,非阻塞 IO;
5、Redis 主要消耗什么物理资源? 内存 因为redis的数据都是存储在内存当中。内存数据库相比一般的关系型数据库,读取速度要更快,但是消耗的内存资源会更多。 6、Redis 到底是单线程还是多线程? 7、Redis 和 Memcache 有什么区别?
1,Redis支持数据的持久化,而Memcache不支持
Redis可以按照配置文件中约定的规则把数据写到硬盘上,即便服务器宕机了,重启服务器后可以把数据重新从硬盘加载入内存,保证了数据的不丢失,持久化。
Memcache没有这样的功能,数据完全存在于内存,服务器宕机,数据完全丢失。
所以可以把一些不重要,经常访问的数据放入Memcache,即使丢了影响也不大。
2,Reids支持多种数据类型
Redis支持String(字符串), List(列表), Hash(哈希), Set(无序集合) 及 Zset(有序集合) 等数据类型。
Memcache只有string类型的key和valueRedis和Memcache有什么区别
3,Redis支持主从集群
Redis支持主从集群,而Memcache也支持集群,但集群的能力很弱。
4,默认端口不同
Memcache默认端口:11211 redis的默认端口:6379
8、Redis 支持哪些数据类型?Redis支持的数据类型主要有五种:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
9、Redis 默认支持多少个数据库?怎么修改? Redis 默认支持 16 个数据库。 可以通过修改 Redis 配置文件 redis.conf 中的 databases 一值进行变更。 10、Redis 最大 key 大小?1.Redis的key可以存储的最大值
虽然Key的大小上限为512M,但是一般建议key的大小不要超过1KB,这样既可以节约存储空间,又有利于Redis进行检索 注:1KB=1024B 1MB=1024KB 1GB =1024MB2.Redis的value可以存储的最大值
value的最大值也是512M。对于String类型的value值上限为512M,而集合、链表、哈希等key类型,单个元素的value上限也为512M 11、Redis String 值最大存储多少? Redis的String类型最大占用512M的空间。 12、Redis 事务有什么用?Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行的执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:
Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。 13、Redis 事务相关的命令有哪几个? MULTI、EXEC、DISCARD、WATCH 14、Redis 持久化有什么用?Redis作为分布式缓存架构中重要的一环,用于保存一些较为重要的数据,抗住系统的高并发访问。因此Redis中的数据必须持久化,防止服务或系统宕机导致数据丢失。
15、Redis 有哪几种持久化方式? RDB(快照)持久化:保存某个时间点的全量数据快照 AOF:(Append-Only-File)持久化:保存写操作, 采用日志的形式来记录每个写操作,追加到AOF文件的末尾。 16、Redis 持久化方式如何选择? 如果数据不能丢失,RDB和AOF混用 如果只作为缓存使用,可以承受几分钟的数据丢失的话,可以只使用RDB。 如果只使用AOF,优先使用everysec的写回策略。 17、Redis 内存满了怎么办? 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限, 所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。 1、通过配置文件配置 通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小 //设置Redis最大占用内存大小为100M maxmemory 100mb redis的配置文件不一定使用的是安装目录下面的redis.conf文件,启动redis服务的时候是可以传一个参数指定redis的配置文件的 2、通过命令修改 Redis支持运行时通过命令动态修改内存大小 //设置Redis最大占用内存大小为100M 127.0.0.1:6379> config set maxmemory 100mb //获取设置的Redis能使用的最大内存大小 127.0.0.1:6379> config get maxmemory 如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存 18、Redis 有哪些淘汰策略? 一、六种淘汰策略 1.noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外) 2.allkeys-lru:从所有key中使用LRU算法进行淘汰(LRU算法:即最近最少使用算法) 3.volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰 4.allkeys-random:从所有key中随机淘汰数据 5.volatile-random:从设置了过期时间的key中随机淘汰 6.volatile-ttl:在设置了过期时间的key中,淘汰过期时间剩余最短的 当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误 19、Redis 如何提高多核 CPU 利用率? 20、Redis 如何实现大量数据插入?前言 如果我们此时需要往redis导入大量数据,如果能快速操作?? 一行一行的命令加入的话耗费往返时间 使用管道可以节省往返时间,但是会占用很多内存,即使发送大量的命令,也是要分批次的处理才可以;
我们先创建一个redis命令集文件,将所有要设置的命令写在这个文件里,最后统一执行这个文件就可以;
记: 这个redis数据集文件,记得转码;linux请先确保有转码工具,没有的话请brew install unix2dos 转码指令:unix2dos 文件名
例如:我们要生成一个’keyN’->'VALUEN’的大数据集,创建一个redis命令集文件;
set k1 v1 set k2 v2 set k3 v3 .......redis-cli支持一种新的被称为pipe mode的新模式用于自行大量数据插入工作;
执行命令:
cat data.txt |redis-cli --pipe//这个命令就是一个用来读取文件内容,一个用来发送文件到redis执行
如果到导入数据在远程主机上,端口也是自定义的话,
cat data.txt|redis-cli -p 9999 -h 192.168.1.122 --pipe 21、Redis 的回收进程如何工作的? 一个客户端运行了新的命令,添加了新的数据。Redis 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界, 通过不断达到边界然后不断地 。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键), 不用多久内存限制就会被这个内存使用量超越。 22、Redis 中的管道有什么用? 一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务 器, 而不用等待回复,最后在一个步骤中读取该答复。 这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功 能,大 大加快了从服务器下载新邮件的过程。 23、Redis 有哪些高可用方案?Redis高可用 --高可用 读写分离
1 主从--高可用 读写分离Redis主从复制:,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave 也会执行相同的操作确保数据一致+
优点:主写从读,降低读的压力。 缺点:master以为只有一个,所以写的压力难以降低; 从节点宕机,剩余一主一从,影响较小,可以继续使用
缺点:主节点宕机,无法继续使用,需要手工干预切换
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,再要求从机进行全量同步
集群环境注意项
如果多个Slave重启或者master重启,会因为master_replid不一致导致全量同步,当多个同时出现的时候,可能会导致Master IO剧增而宕机。
2 哨兵(看词的意思也是放哨,即监控的意思)--高可用 读写分离Redis主从虽然解决了单点导致的数据丢失问题,但是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据库宕机
哨兵主要作用
监控:监控redis主库及从库运行状态; 通知:如果redis发生故障转移,可以通过邮件通知管理员; 自动故障转移:一旦发现主库宕机,则在从库中通过选举新的master进行故障转移。
工作原理
选举:超半数
哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信,并使用投票协议(agreement protocols) 来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方宕机了,这就是所谓的”主观认为宕机” (Subjective Down,简称sdown)。若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master真正宕机,即“客观上认为宕机”(Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为 master,然后自动修改相关配置
优点 高可用,在主节点故障时能实现故障的转移
缺点:好像没办法做到水平拓展,如果内容很大的情况下
3 集群集群模式和哨兵模式的区别
哨兵模式监控权交给了哨兵系统,集群模式中是工作节点自己做监控 哨兵模式发起选举是选举一个leader哨兵节点来处理故障转移,集群模式是在从节点中选举一个新的主节点,来处理故障的转移
24、Redis 集群如何选择数据库?Redis 集群目前无法做数据库选择,默认在 0 数据库。
25、Redis 哈希槽怎么理解? Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽, 每个key通过CRC16校验后对16384取模来决定放置哪个槽, 集群的每个节点负责一部分hash槽。 26、Redis 支持的 Java 客户端有哪些?Redisson、Jedis、lettuce、aredis 等等,官方推荐使用的 Java 客户端是:Redisson。
27、Redisson 是什么框架?Redisson 是 Redis 官方推出的一个高级的协调 Redis 客服端。 适用场景
分布式应用,缓存,分布式会话,分布式任务 / 服务 / 延迟执行服务,Redis 客户端等。
28、Redis 和 Redisson 有什么关系?Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些 Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
29、Jedis 和 Redisson 对比有什么优缺点? Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令 的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能 较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。 Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更 集中地放在处理业务逻辑上。 30、Redis 为什么不提供 Windows 版本?因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。
31、Redis 如何设置密码访问?设置密码requirepass
redis.conf里有这样的配置,设置了密码之后。
#requirepass <yourpassword> requirepass mypass重启redis服务后,你的客户端都需要通过密码的方式访问redis
密码正确
$ redis-cli -h 10.93.84.53 -p 6379 -a mypass ping PONG密码错误
$ redis-cli -h 10.93.84.53 -p 6379 -a hehe ping (error) NOAUTH Authentication required. 32、Redis 如何分析慢查询操作?什么是慢查询
和mysql的慢SQL日志分析一样,redis也有类似的功能,来帮助定位一些慢查询操作。
Redis slowlog是Redis用来记录查询执行时间的日志系统。
查询执行时间指的是不包括像客户端响应(talking)、发送回复等IO操作,而单单是执行一个查询命令所耗费的时间。
另外,slow log保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启slow log而损害Redis的速度。 慢查询参数
首先来关注下慢日志分析对应的两个参数:
1、slowlog-log-slower-than:预设阀值,即记录超过多少时间的记录,默认为10000微秒,即10毫秒。
2、slowlog-max-len:记录慢查询的条数,默认为128条,当超过设置的条数时最早进入队列的将被移除。线上建议增大数值,如:1000,这样可减少队列移除的频率。 可以用config set对这两个参数进行调整,或者在配置文件中设置。 慢查询命令
语法:slowlog subcommand [argument]如,进行查询慢查询、获取慢查询记录的数量、重置慢查询日志等操作:
33、什么是缓存预热和热备?缓存预热
新的缓存系统没有任何缓存数据,在缓存重建数据的过程中,系统性能和数据库负载都不太好, 所以最好是在系统上线之前就把要缓存的热点数据加载到缓存中,这种缓存预加载手段就是缓存预热。缓存热备
缓存热备即当一台缓存服务器不可用时能实时切换到备用缓存服务器,不影响缓存使用。集群模式下, 每个主节点都会有一个或多个从节点来当备用,一旦主节点挂点,从节点立即充当主节点使用。 34、什么是缓存雪崩,如何解决? 缓存雪崩是由于缓存服务器宕机或者大量key同时过期,高并发请求这些过期的key, 数据库崩溃。 解决办法:为每一个key生成一个随机的过期时间 35、什么是缓存穿透,如何解决? 缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决办法: 1. 从缓存中取不到的数据,在数据库中也没有取到,这时也可以将key-null写入, 缓存有效时间可以设置短一些,这样可以防止同一个id进行暴力攻击。 2. 布隆过滤器 第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器,布隆过滤器可以针对大数据量的、有规律的键值进行处理。 一条记录是不是存在,本质上是一个 Bool 值,只需要使用 1bit 就可以存储。我们可以使用布隆过滤器将这种表示是、否等操作, 压缩到一个数据结构中。通过在server端存储一个布隆过滤器,将DB中包含的key放入布隆过滤器中, 布隆过滤器能过滤掉那些一定不存在的数据请求。 36、什么是缓存击穿,如何解决? 缓存击穿: 指`热点key在某个时间点过期的时候`,而恰好在这个时间点对这个Key有`大量的并发请求过来`,从而大量的请求打到数据库。 缓存击穿看着有点像缓存雪崩,击穿是针对于某一热点key,而雪崩则是大量key。 解决办法:设置热点key永不过期。 37、什么是缓存抖动,如何解决?缓存的颠簸问题,有些地方可能被称为 “缓存抖动” ,可以看做是一种比 “雪崩” 更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响。
一般是由于缓存节点故障导致。业内推荐的做法是通过一致性 Hash 算法来解决。
38、什么是缓存无底洞现象,如何解决?什么是缓存无底洞问题: Facebook的工作人员反应2010年已达到3000个memcached节点,储存数千G的缓存。 他们发现一个问题–memcached的连接效率下降了,于是添加memcached节点, 添加完之后,并没有好转。称为“无底洞”现象
39、Redis 和数据库双写一致性问题如何解决?先写缓存,再写数据库 先写数据库,再写缓存 先删缓存,再写数据库 先写数据库,再删缓存 延迟双删,先删缓存,再写数据库,隔一段时间再删缓存
40、Redis 有哪些危险命令?如何防范?客户端可查询出所有存在的键。
删除 Redis 中当前所在数据库中的所有记录,并且此命令从不会执行失败。
删除 Redis 中所有数据库中的所有记录,不止是当前所在数据库,并且此命令从不会执行失败。
客户端可修改 Redis 配置。
41、Redis 如何统计独立用户访问量?这是最容易想到、也是最简单的办法。每个用户登录都有唯一的标识符userId,将userId作为key, 单个用户的访问量作为value即可。例如:
127.0.0.1:6379> hset users zzj 3 (integer) 1 127.0.0.1:6379> hset users zzy 1 (integer) 1使用BitMap
Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个Bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。
指令 SETBIT key offset value 复杂度 O(1)Bitmap可以一定程度解决Hash使用内存多的问题。比如,一个int类型32比特,那么用每一bit表示一个用户,一个int就可以表示32个用户,这样就节省了空间。
例如:
127.0.0.1:6379>setbit users1 111 1 (integer)0 127.0.0.1:6379>bitcount users1 (integer)1当独立访问量统计不需要十分精确时,我们可以考虑使用封装了概率算法的HyperLoglog去进行统计。比如一个电商网站通过概率算法算出3亿访问量即可,并不需要准确的统计出3亿零80万零500访问量(注意:PFCOUNT只是一个概率算法,所以可能存在 0.81% 的误差)。
127.0.0.1:6379> pfadd users2 zzjzzy zzh (integer) 1 127.0.0.1:6379> pfcount users2 (integer) 3对于一个 key,HyperLoglog只需要 12kb的内存。
版权声明:本文标题:Redis面试题(2022) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686563320a82308.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论