热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

什么是memcache?为什么要使用它?

1.背景介绍什么是Memcache?MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,MemCaChe是一个存储键值对的HashMap,在内存中对任意的
1.背景介绍

什么是Memcache?

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,

MemCaChe是一个存储键值对的HashMap,

在内存中对任意的数据(比如字符串、对象等)使用key-value存储,

数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,

它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题

为什么要使用Memcache?

主要用于动态Web应用以减轻数据库的负载。

它通过在内存中缓存数据和对象来减少读取数据库的次数,

从而提高了网站访问的速度。

Memcache的实现原理

memcache处理的原子是每一个key、val,key会通过一个hash表转换成hash的key,便于查找对比以及竟可能的做到散列。同时mem用的是一个二级散列,通过一个hash表来维护。

memcache有两个核心组件:服务端和客户端

在一个memcache组件查询中,client先通过key的hash值来确定kv在service端的位置,当server端确定后,客户端就会发一个请求个server端。让它来查找出确切数据,因为这之间没有交互以及多播协议,因此mem带给网络的影响最小

2.知识剖析

Memcache的安装

需要注意1.4.5版本之前和1.45之后的区别

MemCache和MemCached的区别

1、MemCache是项目的名称

2、MemCached服务器端可以执行文件的名称

MemCache命令

《什么是memcache?为什么要使用它?》

stats指令解读

《什么是memcache?为什么要使用它?》

stats slab指令解读

《什么是memcache?为什么要使用它?》

三种Memcached Client

Memcached Client for Java

SpyMemcached

XMemcached

Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛;

SpyMemcached 比 Memcached Client for Java更高效;

XMemcached 比 SpyMemcache并发效果更好。

3.常见问题

memcache如何储存java对象?

memcache连接无需验证,如何保证安全?

数据库信息更改,怎么保证缓存和数据库的信息一致?

4.解决方案

用序列化和反序列化储存对象

使用内网IP访问,防火墙限制IP和端口

在service中及时修改和维护缓存中的内容

5.编码实战

参考文章下方视频链接

6.扩展思考

JAVA中缓存的实质是什么?

计算机缓存的定义 :缓存是CPU的一部分,它存在于CPU中

就此可以说明 CPU中不可能存放大量的数据

所以java 的缓存 不是真正意义上的缓存


JAVA缓存有两种:
一、文件缓存,是指把数据存储在磁盘上,可以XML格式,也可以序列化文件DAT格式还是其它文件格式。

二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查。

7.参考文献

百度百科

memcache超详细解读:http://www.cnblogs.com/xrq730/p/4948707.html

Memcache安全配置:http://blog.csdn.net/myhuashengmi/article/details/51992519

Memcached笔记:http://snowolf.iteye.com/blog/1471805

8.更多讨论

什么样的数据适合使用缓存?是把所有的数据都通过缓存进行存储吗

并不是把所有的数据都存进缓存,相对来说比较固定的数据更适合存进缓存比如用户的账户以及生日

存对象必须序列化吗?

不是String类型都必须序列化

memcache怎么实现分布式?

在项目配置文件中配置多个节点,与部署的多台服务器缓存IP节点对应

或者直接使用Xmemcache,更容易配置并发

memcache 的优缺点?

优点:稳定,几个月以来,一同装上去的apache已重启过多次,这期间memcache一直踏踏实实干活,一点都不需要中途加油。

配置简单,那是相当的简单,几乎不用配置,一个命令行的守护进程跑下来,就可以不管了

多机分布式存储,每个前端机都能匀出一些内存来跑memcache,这些内存加在一起,总大小也是相当的客观,能够应付足够多的缓存数据,如果开启了memcache的压缩选项MEMCACHE_COMPRESSED,存储量还能有进一步提升。

速度快,这个论点需要数据支持,俺手头之前有一些不同数据量级下set/get的速度对比,但是这里不方便列出来

缺点:不能持久化,不安全

memcache在项目中使用的时候需要注意的关键要素是什么?

为了避免使用Memcached时出现异常,使用Memcached的项目需要注意:

1.不能往Memcached存储一个大于1MB的数据.

2.往Memcached存储的所有数据,如果数据的大小分布于各种chunk大小区间,从64B到1MB都有,可能会造成内存的极大浪费以及Memcached的异常.

1. 命中率.

对于缓存服务而言,命中率是至关重要的.命中率的提升可以通过多种方案实现.其一,提高服务获取的内存总量.这无疑是增加命中的最直接的办法,将缓存数据完全放入数据池中.只要连接不失效,就一定命中.其二,提高空间利用率,这实际上也是另一种方式的增加内存总量.具体实现在下一个方面给出.其三,对于一些很特别的memcache应用,可以采用多个memcache服务进行侦听,分开处理,针对服务提供的频繁度划分服务内存,相当于在应用一级别上再来一次LRU.其四,对于整体命中率,可以采取有效的冗余策略,减少分布式服务时某个server发生服务抖动的情况.如,14台机器实现分布式memcache,划分两组服务,其中一组13台做一个分布式的memcache,一组1台做整个的memcache备份.对于update操作,需要进行两边,get操作只需要一遍,一旦访问失效,则访问备份服务器.这样,对于备份服务器需要内存比较大,而且只适应于读操作大于写操作的应用中.这可以认为是RAID3,当然,也可以采用RAID1完全镜像.

2. 空间利用率.

对于使用memcache做定长数据缓存服务而言,是可以在空间利用率上进行优化.甚至最简单的办法可以不用更改memcache的源码遍可以完成由-f和-n参数的配合可以做到定长优化,不过极可能需要浪费掉预分配的199M内存空间.当然前提是memcache的版本是1.2,同时如果使用的是1.2.0和1.2.1的话,需要更改掉一个BUG,那就是getopt时将opt串中最后一个”s”改成”n”,希望memcache能在以后的版本发现这个BUG.例如,如果key是一个定长id(如一个8位的流水号00000001),value是一个定长的串(如16位的任意字符串),对应于一个chunk_size可以这么计算:chunk_size = sizeof(item) + nkey + nsuffix + nbytes = 32 + 8 + (flag长度 + (16 – 2)的长度 + 2) + 16 = 40 + 5 + 16 = 61,那么可以通过-f 1.000001 -n 61来启动memcache.这种情况下,会浪费掉memcache预先分配的200M空间中的199M.从第2个预分配等级到第200个预分配等级将不会用到.然而,存在解决办法,那就是在编译memcache是加入编译参数-DDONT_PREALLOC_SLABS,或者在源代码中加入#define DONT_PREALLOC_SLABS即可,只是会去除memcache的预分配内存机制.

4. 安全性能.

memcache还存在一个比较显著的问题,那就是其安全性能.只要了解memcache监听的端口,对于能够使用分布式memcache进行数据通信的网络环境的机器,都可以通过memcache协议于memcache服务器进行通信,获取或种植数据.不能保证种植进内存里的数据不会被别有心意的人再利用.也不能保证服务器的内存不被漫天遍地的垃圾数据所堆积,造成命中极低.

memcache的设计理念在一个轻字,如果对每次Client的通讯需要校验身份,那么恐怕memcache也就达不到其想要的效果了.存在解决办法缓解这个问题,一般而言,需要使用memcache服务的机器,可以在Server维持一张红色列表.这张表上的机器便可以获取服务.很显然,memcache并非任意Client都能访问,只有信任的机器访问,那么为什么不将这些信任的机器放在一个/etc/mem_passwd下呢.

更多信息请查看视频

什么是MemCache?为什么要使用它?_腾讯视频

ppt链接:什么是memcache?为什么要使用它?

今天的小课堂就到这里,如果有问题,敬请留言讨论!

今天的小课堂就到这里,如果有问题,敬请留言讨论!


推荐阅读
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 本文将深入探讨MySQL与MongoDB在游戏账户服务中的应用特点及优劣。通过对比这两种数据库的性能、扩展性和数据一致性,结合实际案例,帮助开发者更好地选择适合游戏账户服务的数据库方案。同时,文章还将介绍如何利用Erlang语言进行高效的游戏服务器开发,提升系统的稳定性和并发处理能力。 ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • 0x00端口渗透端口扫描端口的指纹信息(版本信息)端口所对应运行的服务常见的默认端口号.尝试弱口令端口爆破hydra端口弱口令NTScanHs ... [详细]
author-avatar
提着变形金刚的Oceannk_737
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有