redis系列3---理解内存

理解内存

为什么要理解内存呢?redis所有的数据都存在内存中如何高效利用内存,实现用更少的内存存更多的数据,从而降低成本
如何统计内存使用?info memory可以获取内存相关指标,如下:used_memory:redis分配器分配的内存总量used_memory_human:以可读格式返回used_memoryused_memory_rss:从操作系统的角度显示redis占用的物理内存总量used_memory_peak:内存使用的最大值,表示used_memory的峰值used_memory_peak_human:以可读格式返回used_memory_peakused_memory_lua:Lua引擎所消耗的内存大小mem_fragmentation_ratio:used_memory_rss/used_memory比值,表示内存碎片率mem_allocator:redis所使用的内存分配器,默认为jemalloc(注:mem_fragmentation_ratio>1出现内存碎片,mem_fragmentation_ratio<1出现操作系统把redis内存Swap到硬盘现象)
内存消耗自身内存对象内存(sizeof(keys)+sizeof(values))缓冲内存客户端缓冲(所有接入到redis服务器TCP连接的输入输出缓冲,输入缓冲无法控制,最大空间1G,超过将断开连接。输出缓冲通过参数client-output-buffer-limit控制)普通客户端(除了复制和订阅的客户端之外的所有连接)从客户端(主节点会为每个从节点单独建立一条连接用于命令复制)订阅客户端(当使用发布订阅功能时,连接客户端使用单独的输出缓冲区)复制积压缓冲区(一个可重用的固定大小缓冲区用于实现部分复制功能,repl-backlog-size)AOF缓冲区(用于redis重写期间保存最近的写入命令)内存碎片内存分配策略(小,大,巨大)容易出现内存碎片的场景(频繁做更新操作、大量过期键删除)如何解决(数据对齐、安全重启)子进程消耗(执行AOF/RDB重写时redis创建的子进程内存消耗)
内存管理设置内存上限(maxmemory)动态调整内存上限(config set maxmemory 6GB)内存回收策略删除到达过期时间的键对象惰性删除(当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,节省CPU,存在内存泄漏问题)定时任务删除(自适应算法,键的过期比例、使用快慢两种模式)内存使用达到maxmemory上限时触发内存溢出控制策略(maxmemory-policy控制)noeviction:不会删除任何数据,拒绝所有写入操作并返回客户端错误信息volatile-lru:根据LRU算法删除设置了超时属性的键,直到腾出足够空间为止,如果没有删除的键,回退到noevictionallkeys-lru:根据LRU算法删除所有键,直到腾出足够空间为止allkeys-random:随机删除所有键,直到腾出足够空间为止volatile-random:随机删除过期键,直到腾出足够空间为止volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据,如果没有,回退到noeviction
内存优化首先了解一下RedisObject对象type字段:表示当前对象使用的数据类型encoding字段:表示redis内部编码类型lru字段:记录对象最后一次被访问的时间(object idletime {key}查看键的空闲时间)refcount字段:记录当前对象被引用的次数(object refcount {key}获取当前对象的引用)*ptr字段:与对象的数据内容有关,如果是整数,直接存储数据,否则表示指向数据的指针有哪些具体优化手段?缩减键值对象(key尽可能短,value采用序列化或者压缩算法)共享对象池(redis内部维护[0-9999]的整数对象池)注意:当设置maxmemory并启用LRU相关淘汰策略时,redis禁止使用共享对象池;对于ziplist编码的值对象,即使内部数据为整数也无法使用共享对象池字符串优化SDS(字符串长度、已用长度、未用长度)预分配机制(减少字符串频繁修改操作)字符串重构编码优化什么是编码?具体使用哪种底层数据结构来实现string--rawembstrinthash----hashtableziplist(value<=hash-max-ziplist-value and count(field)<=hash-max-ziplist-entries)list----linkedlistziplist(value<=list-max-ziplist-value and 链表长度<=list-max-ziplist-entries)quicklistset-----hashtableintset(元素为整数 and 集合长度<=set-max-intset-entries)zset----skiplistziplist(value<=zset-max-ziplist-value and 有序集合长度<=zset-max-ziplist-entries)(hashtable、ziplist、linkedlist、quicklist、intset、skiplist)注意:小编码可以转大编码,大不能转小ziplist(所有数据采用线性连续的内存结构,节约内存)zlbytes:记录整个压缩列表所占字节长度,方便重新调整ziplist空间。类型是int-32,长度为4字节zltail:记录距离尾节点的偏移量,方便尾节点弹出操作。类型int-32,4字节zllen:记录压缩链表节点数量,类型是int-16,2字节entry:记录具体的节点prev_entry_bytes_length:记录前一个节点所占空间,用于快速定位上一个节点,可实现列表反向迭代encoding:当前节点编码和长度,前两位表示类型,其余表示长度contents:节点的值zlend:记录列表结尾,1字节intset(存储有序、不重复的整数集)encoding:表示类型length:集合元素个数contents:整数数组,从小到大顺序保存控制键的数量针对自己现在使用的模式,分析其内存消耗和可优化的地方。复制代码

转载于:https://juejin.im/post/5bc42e06f265da0acd20e423

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google发布了Tensorflow Lite,用于移动电话的神经网络库

Google的工程副总Dave Burke宣布了一个专门针对移动电话而优化的Tensorflow新版本。\\这一新的软件库称为Tensorflow Lite&#xff0c;允许开发人员在用户的移动电话上实时地运行人工智能应用。据Burke介绍&#xff0c;该库在设计上力求更快和更小的同时&#xff0c;依然支持最…

4. ZooKeeper 基本操作

ZooKeeper的数据模型及其API支持以下九个基本操作&#xff1a; 操作描述create在ZooKeeper命名空间的指定路径中创建一个znodedelete从ZooKeeper命名空间的指定路径中删除一个znodeexists检查路径中是否存在znodegetChildren获取znode的子节点列表getData获取与znode相关的数据…

byte java byte_详解java中的byte类型

Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位Java也提供了一个byte数据类型&#xff0c;并且是基本类型中的整数类型。java byte是作为最小的数字来处理的&#xff0c;因此它的值域被定义为-128~127&#xff0c;也就是signed byte。下面这篇文章主要给大家…

zabbix 3.0.0beta1安装-centos6.8版本

zabbix 3.0安装 zabbix最低需要mysql 5.5 php5.3 查询mysql版本yum list installed | grep mysql##mysql-libs.x86_64 5.1.73-5.el6_6 anaconda-CentOS-201508042137.x86_64/6.7 卸载mysqlyum remove mysql* 指定mysql源rpm -ivh http://dev.mysql.com/get/mysql-community-rel…

技术走向管理一些思考

在《IT项目管理》一书中针对IT行业定义了一个新的“工种”--多才多艺者&#xff0c;并预言未来的IT产业中多才多艺者的重要性将逐渐凸显。多才多艺者即是具有技术背景&#xff0c;同一时候了解业务部门、能规划和实施IT计划、添加商业价值、培养公司内外部关系的人。 想想还认为…

npm 安装 chromedriver 失败的解决办法

https://segmentfault.com/a/1190000008310875 npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver转载于:https://www.cnblogs.com/chenxijywc/p/7825024.html

微软正式发布Azure Functions 2.0

微软正式发布Azure Functions的第二个版本&#xff0c;这是一个事件驱动的、按需计算的Azure平台服务。与版本1相比&#xff0c;新版本的Azure Functions包含的多项特性使开发人员可以更轻松地构建可伸缩的无服务器应用程序。2016年初&#xff0c;微软首次推出Azure Functions预…

CSS-下拉导航条

Web网站中很多时候都会出现下拉导航条&#xff0c;有的是通过CSS实现&#xff0c;有的通过JavaScript插件实现&#xff0c;其实CSS实现起来比较简单,先来看一个简版的下拉菜单: Html代码通过ul列表实现: 123456789101112131415161718<ul class"nav"> <li>…

#UnityTips# 2017.11.14

hi&#xff0c;all。最近比较忙&#xff0c;所以更新也比较慢了。 今天就来和大家分享一个小Tip&#xff0c;它是关于UGUI的坑的。 使用过UGUI的朋友们都知道&#xff0c;Canvas的渲染方式有三种&#xff1a; Screen Space OverlayScreen Space CameraWorld Space其中后两者都需…

细聊.Net Core中IServiceScope的工作方式

前言自从.Net Core引入IOC相关的体系之后&#xff0c;关于它的讨论就从来没有停止过&#xff0c;因为它是.Net Core体系的底层框架&#xff0c;你只要使用了.Net Core的时候就必然会用到它。当然关于使用它的过程中产生的问题也从来没停止过。我对待问题的态度向来都是&#xf…

WPF 获取鼠标屏幕位置、窗口位置、控件位置

原文:WPF 获取鼠标屏幕位置、窗口位置、控件位置public struct POINT{public int X;public int Y;public POINT(int x, int y){this.X x;this.Y y;}}[DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT lpPoint);//e.GetPosition(this);…

java 复制excel_Java 复制Excel工作表

本文归纳了关于Java如何复制Excel工作表的方法&#xff0c;按不同复制需求&#xff0c;可分为&#xff1a;1. 复制工作表1.1 在同一个工作簿内复制工作表1.2 在不同工作簿间复制工作表2. 复制指定单元格数据对于复制方法copy()&#xff0c;这里简单整理了一个表格&#xff0c;其…

AngularDart 现已全面采用 Dart 开发

一直以来&#xff0c;Angular 2依然采用TypeScript作为主流开发语言&#xff0c;然后自动编译成JavaScript 和 Dart。Dart开发者一直在进行Angular 2拆分&#xff0c;将其分为TypeScript/JavaScript版本和Dart版本&#xff0c;并成立了AngularDart团队。 昨天&#xff0c;Angul…

Blazor学习之旅(4)数据共享

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。前几天没有发布本篇就发布了第五篇&#xff0c;属于操作失误哈&#xff0c;这次把第四篇补上&#xff01;本篇&#xff0c;我们来了解下在Blazor中数据是如何共享的&#xff0c;组件之间又该如何传递参数。关于Blaz…

Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)

操作系统&#xff1a;Ubuntu14.04.5 LTS 64bit OpenCV&#xff1a;OpenCV 3.1.0、opencv_contrib gcc&#xff1a;gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) arm-xilinx-linux-gnueabi-gcc&#xff1a;gcc version 4.9.2 (Sourcery CodeBench Lite 2015.05-17) 一、U…

# 20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结

20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结 教材学习内容总结 查找 1.线性查找&#xff1a;从该列表头开始依次比较每一个值&#xff0c;直至找到该目标元素。2.二分查找法&#xff1a;二分查找是从排序列表的中间开始查找&#xff0c;如果没有在那个中间元素则…

java 生成jni_Javah生成JNI头文件

在eclipse中建一项目&#xff0c;建一class1 packageesmart.colfile.parse;2 3 publicclassTestHello {4 static{5 System.loadLibrary("TestHello");6 }7 8 publicstaticnativevoidhello(String msg);9 10 publicstaticvoidmain(String[] args) {11 12 hello("…

IBM 的大型机 z Systems 引入 Go 语言

据 cbronline 报道&#xff0c;IBM 正把 Go 语言运用到旗下的大型机上。 IBM 将开源的 Go 语言引入到 z Systems 大型机后&#xff0c;可以给用户多一个的选择&#xff0c;即在大型机上使用 Linux 或基于 Go 的应用&#xff0c;同时也使大型机更加灵活。Go 语言在高并发的网络应…

WPF-10 逻辑树和可视化树

我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念&#xff0c;我们这节来介绍这两棵树逻辑树&#xff08;Logical Tree&#xff09;逻辑树是由每个控件的节点组成&#xff0c;本质上就是XAML文件中的UI元素&#xff0c;我们可以通过LogicalTreeHelper类提供的…

洛谷P4364 [九省联考2018]IIIDX(线段树)

传送门 题解看得……很……迷&#xff1f; 因为取完一个数后&#xff0c;它的子树中只能取权值小于等于它的数。我们先把权值从大到小排序&#xff0c;然后记$a_i$为他左边&#xff08;包括自己&#xff09;所有取完他还能取的数的个数。那么当取完一个点$x$的数之后&#xff0…