您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
redis是什么(redis原理详解)
节点,哨兵,内存redis是什么(redis原理详解)
发布时间:2020-12-06加入收藏来源:互联网点击:
内存大页:Redis 默认支持内存大页是 2MB,使用内存大页,一定程度上可以减少 Redis 的内存分配次数,但是对数据持久化会有一定影响。
Redis 在 AOF 重写和 RDB 快照过程中,如果主线程收到新的写请求,就需要 CopyOnWrite。
使用了内存大页,即使 Redis 只修改其中一个大小是 1kb 的 key,也需要拷贝一整页的数据,即 2MB。在写入量较多时,大量拷贝就会导致 Redis 性能下降。
命令复杂度高:执行复杂度高的命令是造成 Redis 阻塞的常见原因。比如对一个 set 或者 list 数据类型执行 SORT 操作,复杂度是 O(N M*log(M))。
bigkey 操作:如果一个 key 的 value 非常大,创建的时候分配内存会很耗时,删除的时候释放内存也很耗时。
Redis 4.0 以后引入了 layfree 机制,可以使用子进程异步删除,从而不影响主线程执行。用 UNLINK 命令替代 DEL 命令,就可以使用子进程异步删除。
Redis 6.0 增加了配置项 lazyfree-lazy-user-del,配置成 yes 后,del 命令也可以用子进程异步删除。
如果 lazyfree-lazy-user-del 不设置为 yes,那 Redis 是否采用异步删除,是要看删除的时机的。
对于 String 类型和底层采用整数数组和压缩列表的数据类型,Redis 是不会采用异步删除的。
从节点全量同步:从节点全量同步过程中,需要先清除内存中的数据,然后再加载 RDB 文件,这个过程中是阻塞的,如果有读请求到来,只能等到加载 RDB 文件完成后才能处理请求,所以响应会很慢。
另外,如果 Redis 实例很大,也会造成 RDB 文件太大,从库加载时间长。所以尽量保持 Redis 实例不要太大,比如单个实例限制 4G,如果超出就采用切片集群。
AOF 同步写盘:appendfsync 策略有 3 种:always、everysec、no,如果采用 always,每个命令都会同步写盘,这个过程是阻塞的,等写盘成功后才能处理下一条命令。
除非是严格不能丢数据的场景,否则尽量不要选择 always 策略,推荐尽量选择 everysec 策略,如果对丢失数据不敏感,可以采用 no。
内存达到 maxmemory:需要使用淘汰策略来淘汰部分 key。即使采用 lazyfree 异步删除,选择 key 的过程也是阻塞的。
可以选择较快的淘汰策略,比如用随机淘汰来替换 LRU 和 LFU 算法淘汰。也可以扩大切片数量来减轻淘汰 key 的时间消耗。
②操作系统限制
使用了 swap:使用 swap 的原因是操作系统不能给 Redis 分配足够大的内存,如果操作其他开启了 swap,内存数据就需要不停地跟 swap 换入和换出,对性能影响非常大。
操作系统没有能力分配内存的原因也可能是其他进程使用了大量的内存。
网络问题:如果网卡负载很大,对 Redis 性能影响会很大。这一方面有可能 Redis 的访问量确实很高,另一方面也可能是有其他流量大的程序占用了带宽。
这个最好从运维层面进行监控。
线程上下文切换:Redis 虽然是单线程的,但是在多核 CPU 的情况下,也可能会发生上下文切换。
如果主线程从一个物理核切换到了另一个物理核,那就不能使用 CPU 高效的一级缓存和二级缓存了。
如下图所示:
为防止这种情况,可以把 Redis 绑定到一个 CPU 物理核。
磁盘性能低:对于 AOF 同步写盘的使用场景,如果磁盘性能低,也会影响 Redis 的响应。可以优先采用性能更好的 SSD 硬盘。
设计排行榜功能
Redis 的 zset 类型保存了分数值,可以方便的实现排行榜的功能。
比如要统计 10 篇文章的排行榜,可以先建立一个存放 10 篇文章的 zset,每当有读者阅读一篇文章时,就用 ZINCRBY 命令给这篇文章的分数加 1,最后可以用 range 命令统计排行榜前几位的文章。
Redis 实现分布式锁
①Redis 单节点的分布式锁
如下图,一个服务部署了 2 个客户端,获取分布式锁时一个成功,另一个就失败了。
Redis 一般使用 setnx 实现分布式锁,命令如下:
SETNX KEY_NAME VALUE
设置成功返回 1,设置失败返回 0。使用单节点分布式锁存在一些问题。
客户端 1 获取锁后发生了故障:结果锁就不能释放了,其他客户端永远获取不到锁。
解决方法是用下面命令对 key 设置过期时间:
SET key value [EX seconds] [PX milliseconds] NX
客户端 2 误删除了锁:解决方法是对 key 设置 value 时加入一个客户端表示,比如在客户端 1 设置 key 时在 value 前拼接一个字符串 application1,删除的时候做一下判断。
②Redis 红锁
上一篇:redmi note 7 pro怎么样 准备好入手了吗
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |