作者
阿文
责编
Elle
双十一、双十二都是买买买的节奏,但是你知道吗?像京东、淘宝这样的电子商城是如何扛得住几亿的请求吗?
下面是一个电商网站的基本架构,他包括了一个前端入口和一个缓存集群以及数据库集群。
一般来说,web服务器作为前端入口,在web服务器内会把一些静态文件通过CDN分发到各个节点分摊服务器的请求压力。同时也能加速网站的访问。
当用户的一些查询请求,比如要查询一个商品的信息,会通过前端页面会经过缓存层,如果这些信息在缓存层就已经存在了,则直接返回给客户端,如果没有则去数据库集群查询,并经过缓存层缓存然后返回给客户端。
这样设计的好处是可以大大减小数据库集群的压力。我们都知道类似MySQL这种关系型数据库最大的瓶颈就是当出现像双十一这样的高并发请求时候会给IO带来巨大的压力,导致IO出现瓶颈。哪怕你的数据库优化做的再好,也不能改变这个基本事实。那么在数据库的上面加一道缓存层就可以大大缓解后端数据库的压力,通过类似Redis这样的内存型数据库将热点数据存储在内存中,可以大大提高读写效率和请求时延。
那么,本文就来和大家分享下Redis内存的相关优化措施。
Redis内存的消耗
要知道如何优化Redis的内存,我们需要先了解Redis都有哪些地方需要消耗内存。
众所周知,Redis默认会把内存存储在内存中,当然你可以通过一些持久化方案,例如AOF或RDB的方式来将内存中的数据写入到磁盘中,但是Redis默认读取数据还是从内存中读取,因为内存的速度要比磁盘的读写速度快很多倍,那在Redis中是如何对内存的消耗进行统计的呢?我们可以这样查看与内存相关的参数:
.0.0.1:infomemory#Memoryused_memory:812used_memory_human:.66Kused_memory_rss:used_memory_rss_human:5.75Mused_memory_peak:812used_memory_peak_human:.66Ktotal_system_memory:total_system_memory_human:1.72Gused_memory_lua:used_memory_lua_human:37.00Kmaxmemory:0maxmemory_human:0Bmaxmemory_policy:noevictionmem_fragmentation_ratio:7.42mem_allocator:jemalloc-3.6.0
其中参数含义:
used_memory以字节的形式表示Redis分配器分配的内存总量,也就是存储在Redis存储中的所有数据的占用量。
used_memory_rss是从操作系统的角度显示Redis进程占用的物理内存总量。
used_memory_peak是内存使用的最大值,表示used_memory的峰值。
total_system_memory表示操作系统的最大内存。
used_memory_lua表示Lua引擎所消耗的内存大小。
maxmemoryRedis可分配使用的最大内存量。
maxmemory_policy当Redis使用超过最大分配内存采用什么方式来剔除旧数据,默认是noeviction
mem_fragmentation_ratio表示used_memory_rss/used_memory比值,表示内存碎片率
mem_allocator表示Redis的内存分配器,默认是jemalloc
在infomemory中,你会发现有类似used_memory_human、used_memory_rss_human等参数带human的,这些都是以可读的形式显示对应参数的信息。
在这些参数中,作为运维和相关开发人员,我们应该重点