redis知识点个人总结,超详细

1.redis是什么?
key-value非关系型数据库,支持读写10w/s,8w/s速度,单个value最大512M,memcached最大1M,速度快,缺点受物理内存限制,因此应用是小数据量高性能操作上
2.redis比memcached优势?
1)redis支持多种数据结构 string/hash/list/set/sorted-set/sorted-set
2)速度快
3)支持多种骚操作 比如消息队列,比如管道,比如地理定位存储
4)可以AOF,RDB持久化操作
3.redis支持哪几种数据类型?
redis支持数据类型五种, string/hash/list/set/sorted-set/sorted-set
4.redis主要消耗什么物理资源?
内存
5.redis的全称是什么?
remote dictionary server
6.redis有哪几种数据淘汰策略?
注意5.0之前是6种,5.0之后是8种(增加了两个频率的) redis.config中配置 maxmemory-policy:..
1)allkeys-lru:从所有键中选择最近最少使用的淘汰
2)allkeys-random:从所有键中选择随机的淘汰
3)valatile-lru:从已设置过期时间的键中选择最近最少使用的淘汰
4)valatile-random:从已设置过期时间的键中选择随机的淘汰
5)valatile-ttl:从已设置过期时间的键中选择存活时间最短(将要过期)的键淘汰
6)no-eviction:禁止驱逐,不淘汰,内存到达限制会报错返回错误
7)allkeys-lfu:从所有键中选择频率使用最低的键淘汰
8)valatile:从已设置过期时间的键中选择使用频率最低的键淘汰
7.redis官方为什么不提供windows版本?
redis的linux版本已经相当稳定,而且用户量很大,无需开发windows版本,会带来兼容问题
8.一个字符串类型的值存储的最大容量是多少?
512M
9.为什么redis需要把所有的数据放到内存中?
内存中查询快,缓解数据库压力
10.redis集群方案应该怎么做?都有哪些方案?
1)twemproxy代理 请求->twemproxy代理->一致性hash算法->转发到指定的redis实例->返回给代理。优点:代理维护方便,redis修端口号即可;缺点:节点增删后,旧数据不能自动移动到新的节点
2)codis跟上述类似,但是解决了旧数据不能移动到新的节点问题
3)3.0自带的集群 不是采用一致性哈希算法,而是采用哈希槽,16384个哈希槽 2^14这些就够用了
4)代码逻辑层面,根据hash算法自行组织逻辑等
10.redis集群方案什么情况下会导致不可用?
A,B,C三个节点的集群,B节点失败了,那么从比如5000-10000的范围的槽不可用
11.Mysql有2000w条数据,redis有20w条数据,怎么保证redis中都是热点数据?
redis数据上升到一定大小的时候,就会实行数据淘汰策略(LRU)
12.redis的应用场景有哪些?
1)会话缓存,比如购物车里的数据
2)消息队列 利用list的lpush rpop 模拟消费者生产者
3)存放热点数据,排行榜,计数功能
4)geo数据定位功能
5)FPC全页缓存
13.redis支持的java客户端有哪些?官方推荐?
jedis,redission,lettuce,官方推荐使用redission
14.redis与redission什么关系?
redission是redis的分布式客户端,在分布式环境中实现一些java对象,如Set,Map等
15.Jedis对比redission优缺点?
Jedis的api提供了比较全面的redis支持,redission提供了分布式和可扩展的java结构,但是不支持管道,事务等特性,redission关注逻辑分离
16.redis如何设置密码与验证密码?
config set requirepass;    auth 密码;(获取密码:config get requirepass;)
17.redis哈希槽的概念?
16384个槽,请求会通过CRC16算法校验之后通过对16384去模然后匹配到某个槽,一个节点会分配负责若干数量的槽
18.redis集群什么情况下会有写丢失?
1)过期 key 被清理
2)最大内存不足,导致 Redis 自动清理部分 key 以节省空间
3)主库故障后自动重启,从库自动同步
4)单独的主备方案,网络不稳定触发哨兵的自动切换主从节点,切换期间会有数据丢失
5)异步复制 master写成功,slave同步完成之前,master 宕机了,slave 变为 master,数据丢失;改成同步是不是没问题了呢?错,一样的,同步到某个slave时候该主机宕机了,
然后选举这个slave成为master,数据还是丢了
6)网络分区 分区后一个 master 继续接收写请求,分区恢复后这个 master 可能会变为 slave,那么之前写入的数据就丢了。可以设置节点过期时间,减少 master 在分区期间
接收的写入数量,降低数据丢失的损失。
19.Redis集群之间是如何复制的?
异步复制
20.Redis集群最大节点个数是多少?
16384
21.Redis集群如何选择数据库?
默认0数据库,可以通过select 3选择对应的,默认0-15个但是只存0号数据库
22.怎么测试redis的连通性?
PING命令,返回PONG
23.redis的管道什么用?
就是可以一次性发送多个命令,然后统一响应,不用等待
24.怎么理解redis事务?
redis事务跟普通数据库ACID对比来说,只有CI,一致性和隔离性(单线程),不具备原子性(因为不能同时成功,且不能回滚),不具备持久性(数据同步有延迟,当采用AOF并且选择模式为always同步时就具备了持久性)
25.redis事务相关的命令?
MULTI,EXEC,WATCH,UNWATCH,DISCARD
26.redis的过期时间和永久有效怎么设置?
EXPIRE和PERSIST
27.redis如何做内存优化?
尽可能使用散列表,散列表使用的内存非常小,可以将一些数据放到散列表(HASH)里面
28.redis回收使用的是什么算法?
LRU算法
29.redis如何做大量数据插入?
用redis2.6之后提供的pipe-mode模式,命令.text文件,转成protocl,然后执行命令-- pipe  速度比一般的要快很多
30.为什么要使用redis分区?
分区可以让redis管理更大的内存,可以使用所有机器的内存,高可用性
31.你知道哪些redis分区实现方案?(同redis集群实现方案)
同10
32.redis分区与什么缺点?
涉及多个key的操作不会支持。不支持多个实例的key取交集;不支持多个key的事务操作;不支持非常长的排序key存储数据;rdb/aof文件备份,必须将不同实例的文件聚集在一起备份。
添加和删除机器非常复杂,可以采用预分片技术。
33.Redis持久化数据和缓存怎么做扩容?
缓存:可以用一致性哈希做扩容   持久化数据:redis集群,预分片扩容
34.分布式redis是前期做还是后期做好?
肯定是前期做,首先轻量级,单个实例只需要1M内存,在一台服务器上部署多个实例,这时候后面如果服务器增加了,直接将实例移动到另一台服务器即可
35.redis是单线程的,如何提高CPU使用率?
同一台服务器部署多个redis实例
36.一个Redis实例最多能存放多少的keys?
list,set,z-set是2^32个key, 一个string存储最大是512M
37.redis有哪几种持久化方式?
两种。AOF和RDB
默认RDB RDB:快照的方式。数据先进入内存,然后开启异步子进程将数据写到临时的文件(有一定的时间延迟),写完后直接替换掉磁盘上的dump.rdb文件
AOF:追加模式。配置文件appendonly:yes;命令行文件appendonly.aof,默认appendfsync:every second(还有always,no),每一秒同步一次,将命令同步写到磁盘上的aof文件中;
采用aof模式写的时候,即使中途服务器宕机了,还可以用redis-check-aof工具来恢复数据保证一致性
4.0版本之后增加了混合持久化,配置文件,aof-use-rdb-preamble开启,开启后aof重写时会将rdb文件内容放在aof文件开头,这样做可以综合两者优点,可以快速加载
同时数据完整性提高,缺点是可读性差,上面是rdb格式的,下面是aof格式的
aof文件过大会进行合并重写,就是将四个命令set + incr + incr + incr 合并成一个set,重写的时候也是开启异步子进程,重写完了之后再替换
注意:aof会维护一个aof缓冲区,记录重写的时候新的写命令,重写完成后,会将这些缓冲的数据放到新aof文件的末尾,保证数据的一致性与完整性,然后替换旧的aof文件
两种模式同时开启后,数据恢复会优先采用AOF方式
38.如何选择合适的持久化方式?
如果要求数据备份,速度快的,对数据完整性要求没那么高的选择RDB;如果是对数据完整性要求高的,选择AOF
同时aof可能会有一些程序bug,比如:
该redis以前开启过 AOF ,后来停止AOF。info信息里面的  aof_last_cow_size:153202688 信息不为0
当redis写入数据达到 auto-aof-rewrite-percentage * aof_last_cow_size 时候就会触发BGREWRITEAOF 尽管appendonly  no 。
建议:redis不想开启AOF的时候 ,设置:
auto-aof-rewrite-percentage 0
appendonly  no 
以防止莫名的bgsave阻塞。
39.redis怎么对过期的key进行删除的?
定期删除 + 惰性删除 + 数据淘汰策略 (为什么不用定时删除?因为定时任务删除太消耗性能,一过期就删除多消耗性能啊)
每隔一段时间比如100ms,随机选取部分的key,如果过期了就删除;
查询数据的时候,如果这个key过期了就删除;
5.0之后8种数据淘汰策略
40.缓存穿透,缓存击穿,缓存雪崩?
缓存穿透:恶意代码或者缺陷代码大量访问redis与数据库中都不存在的key,导致请求打到底层都搜不到数据
解决方法:1)给不存在的key缓存一个null值,这样就不会打到数据库,但是要设置一个短一点的合适的过期时间
2)布隆过滤器(不存在的一定不存在,存在的有可能不存在(这个是通过多个hash函数来确定的,一个hash函数确定不在,那一定不在;若多个hash函数都检测存在,那数据才存在)
),将所有可能存在的数据hash到一个足够大的bitmap中,不存在性校验,对key设置命名规则,如果不匹配直接过滤掉,不会走查询
缓存击穿:大量的key在同一时间失效,那么就会使请求直接到数据库,造成数据库崩溃。
解决方法:1)合理设置key的过期时间,尽量避免这种情况发生;或者暴力的设置热点数据永不过期
2)加互斥锁,但这样并发量高不合适
3)加二级缓存,A1一级,复制一份A2二级,一级不行查二级
缓存雪崩:redis崩溃或者重启时,导致大量的请求会直接打到sql数据库,导致sql崩溃
解决方法:1)未雨绸缪:采用主从复制和集群等,保证高可用,有备用的redis实例能够提供服务
2)雪崩时,增加hystrics断路器限流和降级,保护数据库
3)雪崩后,要利用redis持久化机制及时恢复数据
41.redis为什么这么快?
1)redis是基于内存的,查询很快
2)redis是单线程的,就没有多线程的上下文切换的CPU消耗,少了锁就不会有死锁产生的性能损耗
3)数据结构简单,对数据操作也很简单,专门设计的
4)非阻塞的多路I/O复用模型 对于请求非阻塞,但是对于套接字处理阻塞。
5)使用底层模型不一样,与客户端通讯协议单独的一套,构建了自己的VM机制,一般调用系统函数会浪费时间请求。(redis通讯协议)
42.redis的线程模型?
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、
文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。

当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 
这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字(里面是一个队列,分派器一个个去拿), 文件事件处理器既实现了高性能的网络通信模型, 
又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。
43.redis有哪几种模式?
单机,哨兵,集群
44.什么是哨兵模式?哨兵模式有什么优点?
哨兵模式就是监视主从服务的一个服务,这个哨兵也是要做成集群的,高可用性,最少三个,两个不行,一个挂了,大多数就不成立了(master宕机后,要大多数哨兵同意才行)
优点:1)监控主从redis的运行状态   2)发现异常后及时告警,通知管理员  3)故障转移,涉及到重新选举主节点 4)配置中心 故障转移后,及时告知客户端新的master节点
具体一些:
主观下线与客观下线:
SDOWN:主观下线~当前一个sentinel对某个redis服务做出下线判断
ODOWN:客观下线~多个sentinel对某个主redis服务做出下线判断
哨兵工作的具体原理:(围绕主观下线与客观下线)
①每个 Sentinel 以每秒钟一次的频率向它所知的 Master,Slave 以及其他 Sentinel 实例发送一个 PING 命 令 ;
②如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所 指定的值, 则这个实例会被 Sentinel 标记为主观下线;
③如果一个 Master 被标记为主观下线,则正在监视这个 Master 的所有 Sentinel 要以每秒一次的频率确认 Master 的确进入了主观下线状态;
④当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态, 则 Master 会被标记为客观下线 ;
⑤在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令
⑥当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的 频率会从 10 秒一次改为每秒一次 ;
⑦若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除; 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除;
哨兵模式选择主机机制:
①选择主机的条件:1)优先级最高,priority最小 2)偏移量最大的(数据量最大的) 3)runid最小
②选完主机后,sentinel向所有从机发送slaveof指令,群龙俯首
③如果原主机又上线了,sentinel发送slaveof执行让原主机俯首
45.分布式寻址有哪几种算法?
1)hash算法,有大量缓存重建  2)一致性哈希算法  3)hash槽的算法(crc16并对16384取模,定位到目标节点(首先是打到随机节点))
46.集群 3.0之后出来的
node1(master1,slave2,slave3) node2(master2,slave1,slave3),node3(master3,slave1,slave2)  一个node节点对应多个哈希槽,读数据的时候key值过来首先找一个随机节点,然后根据算法
重定向到指定节点  
47.主从复制模式 高并发高可用
一主多从 主用来写,同步到从 从用来读
注意点:1)从节点复制的时候,不会影响主节点的正常工作 2)从节点复制时,不会影响自己的查询操作(旧的查询)
48.redis主从复制的核心原理?
从redis启动时,会发送一个PSYNC命令给主节点,如果是初次连接,那么会进行全量复制。
master会后台启动一个线程生成RDB文件,同时新的写命令会缓存到缓冲区中,RDB从生成完成以后,会将此文件发给slave,slave会先写入本地磁盘,然后读到内存中,
接着缓冲区的也会发给slave,slave进行同步这些。如果第一次连接,就是增量复制。发生故障断开重连后也是增量复制。
缺点:都是由master节点进行处理,可能造成master节点压力大。解决方案:主节点--》从节点==》从节点...这样子也可以快速解决单点故障
49.缓存预热?缓存降级?
缓存预热就是系统上线时将redis直接加载到内存,而不是查询的时候塞到内存。可以采用启动时自动加载;或者写个逻辑,线上直接调用这个逻辑,直接调接口刷一下
缓存降级:高并发或者几个redis宕机后,这时候可以做一个降级操作,比如redis挂了,直接返回默认值,不去查询数据库
50.假设redis中有一亿个key,有好多以goods前缀的,我想查这些键用什么命令?
正常用keys goods* 但是redis是单线程的,这个命令执行的时候会阻塞redis系统运行,线上操作redis会阻塞;
怎么办呢?采用scan 可以无阻塞的查询,scan 0(游标值) match goods* 1000,从0开始遍历,遍历1000个,但是时间会长一点
51.redis如何实现队列与延时队列?
lpush生产者/rpop消费者;消费者下线后,生产的消息会丢失
延时队列:采用z-set,时间戳作为score,消息内容作为key,zadd生产消息,然后zrangbyscore获取n秒前的数据做轮询处理
52.z-set命令有哪些?
zadd key score值 值 / zrevrange key 0 2:获取排名前三的用户 /zrank key lisi:查询lisi选手的排名
53.redis为啥一般要设置成精灵模式?
设置成精灵模式,将redis设置成守护线程,这样子进程关掉还会再后台运行
54.主从设置配置的命令是什么?
slaveof 主服务器地址与端口(临时建立) 在从机配置文件设置slaveof(永久建立)
55.redis常用的命令?
set/get/setnx(0已存在,1不存在)/expire(设置过期时间)/ttl(查看还剩多少时间,返回负数则不存在了失效了)/setex(设置值同时设置过期时间)/mset(一次设置多个key的值)
getset(set新值,并返回旧值)/incr(增加1)/incrby(增加指定值)/decr(减少一)/decrby(减少指定值)/append(给给定字符串追加)/strlen(获取指定字符串长度)/persist(取销过期时间)
randomkey(随即返回key)/rename(重命名)/type(返回数据类型) 
56.简单说下redis的内部结构?
dic:类似map,查询用/sds:可以存储任意二进制数据,但是没有结束符,需要设置长度/跳跃表(skiplist):多指针链表,堪比平衡二叉树/ziplist(压缩表):特殊编码的连续内存块
组成的顺序结构
57.介绍一下布隆过滤器?
bloomFilter:就是将数据存放到一个足够大的bitmap中,各个位默认都是0,添加数据的时候,通过多个哈希函数放进去,比如hash1(key) = 1,hash(key) = 5,
就是第二位跟第六位的数据上置为1;数据来了,用同样的hash函数计算,如果计算出是0,那么该key一定不存在这个bitmap中,可以判断不存在该key,如果计算出1,
那么该key不确定是否存在,也可能是其他的key把它这一位弄成1的,所以布隆过滤器特点:不存在性校验
58.什么是redis通讯协议(RESP)?有什么特点?知道回复的首字节的含义么?
redis服务端与客户端的协议;非常简单,又快速,可读性也好。一个node两个tcp连接,一个负责c/s通讯:6379,一个负责node之间的通讯 16379
+:简单字符串 -:错误 $:复杂字符串 ::整数Integer *:数组
59.说下什么是一致性哈希算法?
简单来讲一致性哈希算法就是一个hash圆环,比如0-2^32分布在圆环上,然后有4个节点通过hash函数计算出节点位置,ABCD,数据过来后会找到顺时针的第一个节点;
如果是删除节点或者新增节点,都只会影响该节点到前一个节点之前的数据,可用性好,不需要重新计算整个hash缓冲
60.redis哈希槽?
redis哈希槽一共16384个槽位,作者说2^14足够用,crc16算法最多支持2^16太多了浪费;
哈希槽增删节点十分方便,增节点,只需要把部分其他节点上哈希槽移动到到新的节点上;删节点,只需要把该节点上的哈希槽移到其他节点
61.事务中用的是乐观锁机制?
是的,用的是watch: 我不锁你,认为你这个key不会变不会被操作,结果你被操作了,那么就是exec直接执行失败;操作了我就失败(乐观锁的体现)
62.redis的数据结构?
strng:数字+字符串 hash:字典 + 压缩列表 list:压缩列表 + 双端列表 set:整数集合 + 字典 有序集合:压缩列表 + 跳跃表/// 还有sds
63.讲一讲redis新增的stream?
生产者消费者,消费组的概念
向指定的stream增加一个新的条目:XADD mystream * sensor-id 1234 temperature 19.8 返回值:1518951480106-0(*代表自动生成条目,1518951480106当前时间,0代表id)
XLEN:获取一个stream条目的数量 XLEN mystream
XRANGE mystream - +: 返回查询stream的区间数据,-,+分别表示最小与最大id
XREAD COUNT 2 STREAMS mystream 0:所以我们想要流 mystream中所有ID大于0-0的消息
XDEL mystream 1526654999635-0: 删除单个项目
消费者组:能够让N个不同的消费者接收stream流的不同部分
XGROUP CREATE mystream mygroup 创建一个消费者组
XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >XREADGROUP的响应内容就像XREAD一样。但是请注意上面提供的GROUP <group-name> <consumer-name>,
这表示我想要使用消费者组mygroup从Stream中读取,我是消费者Alice
XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >Bob要求最多两条消息,并通过同一消费者组mygroup读取。所以发生的是Redis仅报告新消息。正如你所看到的,
消息”apple”未被传递,因为它已经被传递给Alice,所以Bob获取到了orange和strawberry,以此类推。
64.讲讲redis的pub/sub模式吧?
说白了就是主题订阅模式。pub发布消息到channel管道,sub订阅从管道订阅消息
65.什么是sds?了解么?
顾名思义,simple dynamic string 简单动态字符串,是基于c语言字符串传统的缺陷(比如长度不可变)重新设计的,几乎贯穿了redis的所有数据结构
struct sdshdr { int len(buf数组已经使用的字节数量,即sds字符串的长度); int free(buf数组中未使用字节的数量); char buf[](字节数组)}
从上述定义能看出特点:1)sds获取字符串长度复杂度是O(1) 2)用free这种.采用了空间预分配策略,减少了内存重新分配的次数
66.预分片是干啥的?
Presharding。如果一开始只有三台Redis服务器,后来发现需要加多一台才能满足业务需要,要怎么办?Redis提供了一种策略,叫:Presharding
很简单,就是一台服务器部署多个redis实例,比如三个,那么一共就是9个实例,扩容的时候增加一台服务器,只需要把redis实例移动一下到新的服务器即可,但是要改一些服务器
地址啥的
67.如何解决 Redis 的并发竞争 Key 问题?
这个问题大致就是,同时有多个子系统去 Set 一个 Key。这个时候要注意什么呢?大家基本都是推荐用 Redis 事务机制。
但是我并不推荐使用 Redis 的事务机制。因为我们的生产环境,基本都是 Redis 集群环境,做了数据分片操作。你一个事务中有涉及到多个 Key 操作的时候,这多个 Key 不一定
都存储在同一个 redis-server 上。因此,Redis 的事务机制,十分鸡肋。
如果对这个 Key 操作,不要求顺序。这种情况下,准备一个分布式锁,大家去抢锁,抢到锁就做 set 操作即可,比较简单。
如果对这个 Key 操作,要求顺序
假设有一个 key1,系统 A 需要将 key1 设置为 valueA,系统 B 需要将 key1 设置为 valueB,系统 C 需要将 key1 设置为 valueC。
期望按照 key1 的 value 值按照 valueA > valueB > valueC 的顺序变化。这种时候我们在数据写入数据库的时候,需要保存一个时间戳。
假设时间戳如下:
系统 A key 1 {valueA 3:00}
系统 B key 1 {valueB 3:05}
系统 C key 1 {valueC 3:10}
那么,假设系统 B 先抢到锁,将 key1 设置为{valueB 3:05}。接下来系统 A 抢到锁,发现自己的 valueA 的时间戳早于缓存中的时间戳,那就不做 set 操作了,以此类推。
68.Redis--各个数据类型最大存储量
string:521M, 其他:2^32 - 1(跟内存相关)
69.为什么要用redis?你怎么理解redis?
主要两点:高性能(提升速度) + 高并发(高可用缓解数据库压力)
70.redis优化?除了优化本身redis。你觉得服务器需要怎么优化呢?(拓展)
1)内存分配控制
vm.overcommit_memory=1 overcommit_memory:linux的内存分配策略  
0:内核检查是否有足够可用内存,有则通过。没有则申请失败,并返回错误给进程 
1:表示内核允许超量使用内存直到用完为止 
2:表示内核绝不过量的使用内存
采用 Redis 建议的配置是为了在极端情况下 Linux 可以挤出来一些内存供 Redis 备份,但是更建议优先配置好 maxmemory ,给机器留 20%~30% 的空闲内存
2)修改swappiness的值,或者禁用swap内存交换
3)修改THP内存页的大小 提示告诉我们建议修改 Transparent Huge Pages (THP) 的配置
4)最大连接数限制 通过 ulimit -a 命令查看和设置当前用户进程的资源数,其中包含 open files 参数,是单个用户同时打开的最大文件描述符个数
虽然 Redis 中可以配置最大的客户端连接数(默认 10000,且是对外提供的) 。Redis 内部最多使用 32 个文件描述符。当 open files = 4096 时,Redis 最大提供 4096-32=4064 个
连接。因为它不能突破操作系统的限制。如果需要,使用如下命令修改:ulimit -Sn {max-open-files}


版权声明:本文为zhangxiansin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。