`
he_wen
  • 浏览: 238679 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Redis细节积累

 
阅读更多

Redis细节积累

 

                               本文主要说明一些redis优点和缺点以免网站架构时乱用

一、优点

 

  • key/value存储支持丰富的数据结构操作(list、set、map等操作)
  • 支持批量的操作,减少网络的开销
  • 支持replication机制,弥补了aof、snapshot性能上不足,达到了数据可持久化
  • 支持虚拟内存,没有开来操作系统的虚拟内存管理,而是自己开发封装,具体原因参考:http://blog.nosqlfan.com/html/868.html?ref=rediszt

 

二、缺点

 

 

  • 是基于内存管理,也就是自己申请内存管理数据,当进程重启或者挂了就会丢失数据,所以可以考虑使用内存文件系统,只要系统部重启数据不会丢失,细节参见:http://blog.nosqlfan.com/html/3638.html
  • 关于使用hashtable的时候,当数据达到zimap数据的临界值的时候,有一次rehash的扩容,这个时间点会有性能上的缺陷,只是个人看源代码的想法,欢迎指教
  • 复制机制的缺陷:没有像MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题。详细见:http://blog.nosqlfan.com/html/3153.html?ref=rediszt

三、redis复制缺陷的解决方案

 

  • 主动复制避开Redis复制缺陷

       我们可以采用主动复制的方式来搭建我们的集群环境,所谓主动复制是指由业务端或者通过代理中间件对Redis存储的数据进行双写或多写,通过数据的多份存储来达到与复制相同的目的。但是会造成数据一致性问题,这样需要看项目的应用场景是否对数据一致性要求高不高

 

  • 通过presharding进行Redis在线扩容

     resharding的方案来解决动态扩容和数据分区的问题,实际就是在同一台机器上部署多个Redis实例的方式,当容量不够时将多个实例拆分到不同的机器上,这样实际就达到了扩容的效果。但是实际还是依赖redis的复制功能,所以做这个拆分的过程最好选择为业务访问低峰时段进行。

  • Redis复制的改进

   首先写Redis的AOF文件,并对这个AOF文件按文件大小进行自动分割滚动,同时关闭Redis的Rewrite命令,然后会在业务低峰时间进行内存 快照存储,并把当前的AOF文件位置一起写入到快照文件中,这样我们可以使快照文件与AOF文件的位置保持一致性,这样我们得到了系统某一时刻的内存快 照,并且同时也能知道这一时刻对应的AOF文件的位置,那么当从库发送同步命令时,我们首先会把快照文件发送给从库,然后从库会取出该快照文件中存储的 AOF文件位置,并将该位置发给主库,主库会随后发送该位置之后的所有命令,以后的复制就都是这个位置之后的增量信息了。

  • Redis与MySQL的结合

四、内存优化

 

hash-max-zipmap-entries 64 
hash-max-zipmap-value 512 
hash-max-zipmap-entries

当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,即value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。

hash-max-zipmap-value 含义是当 value这个Map内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。

以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是不是设置的越大越好呢,答案当然是否定 的,HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好这个值的设置,总体上还是最根本的时间成本和空间成本上的权衡。

 

同理list:

list-max-ziplist-entries 512
set-max-intset-entries 512 

不过如果在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销,即在系统启动时先分配一个从1~n 那么多个数值对象放在一个池子中,如果存储的数据恰好是这个数值范围内的数据,则直接从池子里取出该对象,并且通过引用计数的方式来共享,这样在系统存储 了大量数值下,也能一定程度上节省内存并且提高性能,这个参数值n的设置需要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值 默认是10000,可以根据自己的需要进行修改,修改后重新编译就可以了。

 

有Redis线上运维经验的人会发现Redis在物理内存使用比较多,但还没有超过实际物理内存总容量时就会发生不稳定甚至崩溃的问题,有人认为是 基于快照方式持久化的fork系统调用造成内存占用加倍而导致的,这种观点是不准确的,因为fork 调用的copy-on-write机制是基于操作系统页这个单位的,也就是只有有写入的脏页会被复制,但是一般你的系统不会在短时间内所有的页都发生了写 入而导致复制,那么是什么原因导致Redis崩溃的呢?

答案是Redis的持久化使用了Buffer IO造成的,所谓Buffer IO是指Redis对持久化文件的写入和读取操作都会使用物理内存的Page Cache,而大多数数据库系统会使用Direct IO来绕过这层Page Cache并自行维护一个数据的Cache,而当Redis的持久化文件过大(尤其是快照文件),并对其进行读写时,磁盘文件中的数据都会被加载到物理内 存中作为操作系统对该文件的一层Cache,而这层Cache的数据与Redis内存中管理的数据实际是重复存储的,虽然内核在物理内存紧张时会做 Page Cache的剔除工作,但内核很可能认为某块Page Cache更重要,而让你的进程开始Swap ,这时你的系统就会开始出现不稳定或者崩溃了。我们的经验是当你的Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了。

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    redis源码日志(源码分析)

    Redis是一款高性能的键值存储系统,其开源代码的解析对于深入理解其内部机制至关重要。"redis源码日志(源码分析)"是...通过学习,读者不仅可以掌握Redis的设计理念,还能为自己的软件开发实践积累宝贵的底层知识。

    新浪微博redis技术演化

    ### 新浪微博Redis技术...通过上述内容可以看出,新浪微博在Redis的应用过程中不断探索和实践,积累了许多宝贵的经验。这些经验不仅有助于提升系统的稳定性和性能,也为其他企业在面对类似挑战时提供了重要的参考案例。

    Squirrel技术分享.pdf

    通过对Avatar-Cache的深入理解和技术积累,Squirrel实现了更好的兼容性和稳定性。 **基于Redis Cluster的Key-Value存储框架** Squirrel采用了Redis Cluster作为其底层存储机制,充分利用了Redis Cluster的强大功能...

    商城项目点卡通可运行

    【标签】"商城源码"表明这个项目提供完整的源代码,学习者可以深入研究每个模块的实现细节,包括但不限于: - 用户模块:注册、登录、密码找回等功能的实现。 - 商品模块:商品分类、展示、搜索、详情页等。 - ...

    cpp-xcache是喜马拉雅内部使用的一套分布式缓存解决方案

    1. **Pika和Codis源码分析**:研究两个开源项目的代码结构,理解其设计原理和实现细节。 2. **分布式缓存理论**:学习CAP理论、数据一致性模型以及分布式系统的设计原则。 3. **性能优化技巧**:探索如何通过调整...

    Bonree Ants大数据计算引擎1

    【应用场景】Bonree Ants适用于大数据技术积累较少的企业或项目团队,通过简化开发流程和提供配置化工具,使得非研发业务人员也能完成部分数据处理任务,从而极大地提高了开发效率和降低了维护成本。在博睿内部项目...

    软件基础实践-项目报告1

    该项目旨在为企业提供宣传平台并快速积累用户。 1. **系统主要架构**: - 投票系统分为后台管理模块和用户投票模块两部分。后台管理模块包括首页(展示投票数据和趋势)、所有频道(管理频道名称和简介,查看投票...

    基于Springboot的校园求职招聘系统(有报告) Javaee项目,springboot项目

    《基于Springboot的校园求职招聘系统》是一款JavaEE项目的实现,它充分利用了Spring Boot框架的...通过该项目,开发者不仅可以提升自己的编程技能,还能了解到完整的项目开发流程,为实际工作中的项目开发积累经验。

    数据库实战的概要介绍与分析

    - **《Redis实战》**:对于希望了解NoSQL数据库特别是Redis的读者来说,这本书是非常实用的选择,涵盖了Redis的各种应用场景和技术细节。 #### 二、在线编程平台 - **LeetCode**:作为一个知名的在线编程平台,...

    阿里javap6、p7面试重点

    通过上述内容的总结可以看出,阿里Java P6、P7面试的重点不仅在于对技术细节的掌握,更在于能否将这些技术应用到实际工作中解决问题。因此,在准备面试时,除了巩固基础知识外,还需要注重实践经验和项目案例的积累...

    运维简历模板.docx

    此外,求职者还展示了他在非技术领域的实践经验,如在学院会计系办公室担任行政助理,负责文档处理、会议组织等工作,这体现了他的组织协调能力和细节关注度。 在自我评价中,求职者强调了自己的成熟稳重、沟通能力...

    工作过程中的学习笔记

    学习数据库的应用细节涉及到多个方面,首先是数据库的类型,常见的有关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如MongoDB、Redis)。关系型数据库遵循ACID(原子性、一致性、隔离性、持久性)...

    python学习计划

    - **Python 后端开发工程师**:主要负责网站后端逻辑的编写,包括但不限于 Django、Flask、Tornado、Twisted 等框架的应用,以及 MySQL、Redis、MongoDB 等数据库的操作。这类职位适合对 Web 开发感兴趣的同学,可以...

    基于PHP的麒麟积分下载系统v1.0Beta4源码.zip

    系统的核心功能是通过积分作为媒介,让用户能够用积累的积分兑换或下载特定资源,如软件、电子书、视频教程等。V1.0Beta4是该系统的早期版本,可能包含了基本的功能实现和完善。 首先,我们要理解PHP的基础知识。...

    基于ssm+mysql的在线投票系统源码数据库.zip

    下面我们将详细探讨该系统的核心技术和实现细节。 首先,Spring框架作为整个系统的基石,提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的能力,使得代码更易于...

    java源码 仿0buy京东商城源码 京东JavaWeb项目源代码毕业设计—(包含完整源码可运行).zip

    该压缩包文件“java源码 仿0buy京东商城源码 京东JavaWeb项目源代码毕业设计—...通过深入研究和运行此项目,开发者可以提升自己的JavaWeb开发技能,了解电商系统的实现细节,并且为自己的毕业设计或实际项目积累经验。

    仿12306汽车售票系统

    由于描述中提到"一些小的细节没有完成,自己补充",这意味着该项目可能是一个半成品,需要开发者根据提供的代码和注释进行完善。 首先,前端部分通常会使用HTML、CSS和JavaScript来构建。HTML负责页面结构,CSS负责...

    基于SSM的校园订餐系统(有报告) Javaee项目 ssm项目

    项目描述中提到的资源详情链接指向了一篇CSDN博客文章,虽然具体内容无法在当前环境下查看,但可以推测这篇博客可能包含了项目的实现细节、设计思路以及可能的技术难点解析。通常,一个基于SSM的校园订餐系统会包含...

    基于springcloud的儿童照相服务管理系统源码数据库.zip

    本文将对这一系统的核心技术和实现细节进行深入探讨。 首先,SpringCloud是微服务架构的首选框架,它提供了服务发现、配置中心、断路器、路由、微代理等组件,使得开发者可以快速构建分布式系统。在本系统中,...

Global site tag (gtag.js) - Google Analytics