redis知识点

1. 什么是redis

Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

2.Redis与其他key-value存储有什么不同?

2. redis有哪些数据结构,redis使用场景

五种基本数据类型

  1. String(使用场景:访问量统计,秒杀商品数量,最大512M)
  1. List(使用场景:队列,栈)
  1. Set(使用场景:共同含义,统计网站ip访问量)
  1. Zset(使用场景:排行榜,带权重的队列)
  1. Hash(使用场景:对象,比如用户信息)

三种基本特殊类型

  1. geospatial(使用场景:附近的人)
  1. HyperLogLog(使用场景:网站流量访问)
  1. Bitmap (使用场景:用户登录状态,用户周活跃)

3. Redis相比memcached有哪些优势

redis支持持久化

数据类型更丰富,memcached值为简单字符串

redis速度比memcached快

redis支持数据备份,master-slave模式数据备份

5. redis速度为什么快

redis基于内存操作

采用多路复用器模型

优化的数据结构

使用单线程,避免上下文切换带来的消耗

6.redis为什么单线程

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了

多线程处理会涉及到锁,而且多线程处理会涉及到线程切换而消耗CPU。因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。单线程无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来解决。

7.redis 6.X版本后使用的多线程?

工作线程任然是单线程,IO线程使用多线程。提供硬件使用,提高系统的吞吐量

redis为什么把数据放到内存中

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

8.Redis有哪几种数据淘汰策略

no-enviction:禁止驱逐数据,抛异常

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

volatile-lfu:

allkeys-lfu:

使用策略规则:

(1)如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru

(2)如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

6.Redis分布式锁

先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。

如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,那会怎么样?

set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和expire 合成一条指令来用的!

7. Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来

使用 keys 指令可以扫出指定模式的 key 列表

8.线上业务中使用keys会有什么问题

redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。

9.大量key需要设置同一过期时间,需要注意什么

如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

雪崩

10.如何处理big key 和hot key

11。数据库2000W数据,如何保证redis中只存20W数据,如何保证redis中数据都是热点数据?

内存淘汰策略

12.redis做异步队列, pub/sub 有什么缺点,redis如何实现延时队列

一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试

可不可以不用 sleep 呢?

list 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来

如果对方追问能不能生产一次消费多次呢?

使用 pub/sub 主题订阅者模式,可以实现1:N 的消息队列。

如果对方追问 pub/sub 有什么缺点?

在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 RabbitMQ等。

如果对方追问 redis 如何实现延时队列?

使用 sortedset,拿时间戳作为score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。

14. redis哈希槽

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

15.pipeline

可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有因果相关性。使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS峰值的一个重要因素是 pipeline 批次指令的数目。

17、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)。

18、Jedis与Redisson对比有什么优缺点?

Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。

Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

19、支持一致性哈希的客户端有哪些?
20、Twemproxy是什么?

Twemproxy是一种代理分片机制,由Twitter开源,主要用于减少后端缓存服务器的连接数量。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis或memcached服务器,再原路返回。该方案很好的解决了单个Redis或memcached实例承载能力的问题。Twemproxy本身也是单点,需要用Keepalived做高可用方案,可以使用多台服务器来水平扩张redis或memcached服务,可以有效的避免单点故障问题。

21、怎么理解Redis事务?

(1)事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

(2)事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

22、Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

23、Redis回收使用的是什么算法?
24、Redis如何做大量数据插入?
25、为什么要做Redis分区?
26、你知道有哪些Redis分区实现方案?
27、Redis分区有什么缺点?
28、为什么Redis需要把所有数据放到内存中?
29、Redis的内存占用情况怎么样?
30、都有哪些办法可以降低Redis的内存使用情况呢?

如果你使用的是 32 位的 Redis 实例,可以好好利用 Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起。

31、Redis的内存用完了会发生什么?

如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容。

32、Redis如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面。

33、Redis如何做持久化的?
34、对方追问bgsave的原理是什么?
35、Redis提供了哪几种持久化方式?

Redis提供两种持久化机制 RDB 和 AOF 机制:

1、RDB(Redis DataBase)持久化方式:

是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

优点:

(1)只有一个文件 dump.rdb,方便持久化。

(2)容灾性好,一个文件可以保存到安全的磁盘。

(3)性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis的高性能)

(4)相对于数据集大时,比 AOF 的启动效率更高。

缺点:

数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

2、AOFAppend-only file)持久化方式:

是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。

优点:

(1)数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。

(2)通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof工具解决数据一致性问题。

(3)AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

缺点:

(1)AOF 文件比 RDB 文件大,且恢复速度慢。

(2)数据集大的时候,比 rdb 启动效率低。

36、如何选择合适的持久化方式?
37、Redis是单线程的,如何提高多核CPU的利用率?
38、Redis常见性能问题和解决方案?

(1)Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务

(2)如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一

(3)为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网

(4)尽量避免在压力很大的主库上增加从

(5)主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1<- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现 Slave 对 Master的替换。如果 Master 挂了,可以立刻启用 Slave1 做 Master,其他不变。

39、修改配置不重启Redis会实时生效吗?
40、Redis的同步机制了解么?

https://www.cnblogs.com/albert32/p/13404294.html

41、是否使用过Redis集群,集群的原理是什么?

(1)Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务。

(2)Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。

42、Redis集群方案应该怎么做?都有哪些方案?
43、Redis集群方案什么情况下会导致整个集群不可用?

有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。

44、Redis集群的主从复制模型是怎样的?

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.

44、Redis的集群方案之间都有哪些区别,其优点和缺点是什么?
  • 主从复制模式

优点:

master能自动将数据同步到slave,可以进行读写分离,分担master的读压力 master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求 缺点:

不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复 master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题 难以支持在线扩容,Redis的容量受限于单机配置

  • Sentinel(哨兵)模式

优点:

哨兵模式基于主从复制模式,所以主从复制模式有的优点,哨兵模式也有 哨兵模式下,master挂掉可以自动进行切换,系统可用性更高 缺点:

同样也继承了主从模式难以在线扩容的缺点,Redis的容量受限于单机配置 需要额外的资源来启动sentinel进程,实现相对复杂一点,同时slave节点作为备份节点不提供服务

  • Cluster模式

优点:

无中心架构,数据按照slot分布在多个节点。 集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。 可线性扩展到1000多个节点,节点可动态添加或删除 能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换 缺点:

客户端实现复杂,驱动要求实现Smart Client,缓存slots mapping信息并及时更新,提高了开发难度。目前仅JedisCluster相对成熟,异常处理还不完善,比如常见的“max redirect exception” 节点会因为某些原因发生阻塞(阻塞时间大于 cluster-node-timeout)被判断下线,这种failover是没有必要的 数据通过异步复制,不保证数据的强一致性 slave充当“冷备”,不能缓解读压力 批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好 key事务操作支持有线,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能

  • 总结:

其中主从复制模式能实现读写分离,但是不能自动故障转移;

哨兵模式基于主从复制模式,能实现自动故障转移,达到高可用,但与主从复制模式一样,不能在线扩容,容量受限于单机的配置;

Cluster模式通过无中心化架构,实现分布式存储,可进行线性扩展,也能高可用,但对于像批量操作、事务操作等的支持性不够好。

三种模式各有优缺点,可根据实际场景进行选择。

参考:https://blog.csdn.net/qianlia/article/details/105491761

45、Redis集群会有写操作丢失吗?为什么?

Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

46、Redis集群之间是如何复制的?

异步复制

47、Redis集群最大节点个数是多少?

16384

48、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

理论上 Redis 可以处理多达 2^32 的 keys,并且在实际中进行了测试,每个实例至少存放了 2 亿 5 千万的 keys。我们正在测试一些较大的值。任何 list、set、和 sorted set 都可以放 2^32 个元素。换句话说,Redis 的存储极限是系统中的可用内存值。

49、Redis持久化数据和缓存怎么做扩容?
50、分布式Redis是前期做还是后期规模上来了再做好?为什么?

你可能感兴趣的:(redis知识点)