分布式缓冲之memcache
1. memcache简介
memcache是danga.com的一个项目,它是一款开源的高性能的分布式内存对象缓存系统,,最早是给LiveJournal提供服务的,后来逐渐被越来越多的大型网站所采用,用于在应用中减少对数据库的访问,提高应用的访问速度,并降低数据库的负载。

为了在内存中提供数据的高速查找能力,memcache使用key-value形式存储和访问数据,在内存中维护一张巨大的HashTable,使得对数据查询的时间复杂度降低到O(1),保证了对数据的高性能访问,内存的空间总是有限的,当内存没有更多的空间来存储新的数据时,memcache就会使用LRU(Least Recently Used)算法,将最近不常用的数据淘汰掉,以腾出空间来存放新的数据。memcache存储支持的数据个事业是灵活多样的,通过对象的序列化机制,可以将更高层抽象的对象转换为二进制数据,存储在缓存服务器中,当前端应用需要时,又可以通过二进制内容反序列化,将数据还原成原有对象。
2. memcache安装
由于memcache使用了libevent来进行高效的网络链接处理,因此在安装memcache之前,需要安装libevent
下载libevent,这里采用的是1.4.14版本的libevent
wget https://github.com/downloads/libevent/libevent/libevent-1.4.14b-stable.tar.gz 解压:
tar -xf llibevent-1.4.14b-stable.tar.gz 配置、编译、安装libevent:
./configure make sudo make install
下载memcache,并解压
wget http://www/memcache.org/files/memcache-1.4.17.tar.gz
tar -xzvf memcache-1.4..tar.gz 配置、编译、安装memcache:
./configure make sudo make install
3. memcache启动和关闭
(1)启动memcache服务
/use/local/bin/memcache -d -m -u root -l 192.168.1.10 -p -c -p /tem/memcached.pid
@ -d:表示启动一个守护进程
@ -m:指定分配给memcache的内存数量,单位为MB,这里指定的是10MB
@ -u:用户名
@ -l:ip
@ -p:port
@ -c:最大运行的并发连接数
@ -P:指定memcache的pid文件保存的位置
(2)关闭memcache服务
kill `cat /tmp/memcached.pid`
4. memcache支持读取/写入数据方式
(1)set将数据保存到缓存服务器,如果缓冲服务器存在同样的key,则替换之
(2)add将数据保存到缓存服务器,如果缓冲服务器存在同样的key,则新增失败
(3)replace将数据替换缓冲服务器中的相同的key,如果缓冲服务器中不存在同样的key,则替换失败
(4)append将数据追加到已经存在的数据后面
(5)prepend将数据追加到已经存在的数据的前面
(6)cats提供对变量的cas操作,它将保证在进行数据更新之前,数据没有被其它人更改
(7)get从缓存服务器获取数据
(8)iner对计数器进行增量操作
(9)decr对计数器进行减量操作
(10)delete将缓存服务器上的数据删除
5. memcache C/C++客户端库libmemcached
(1)下载libmemcached,下载地址:https://launchpad.net/libmemcached/+download
(2)我下载的是libmemcached-1.0.17.tar.gz
(3)解压、配置、安装
cd /usr/local
tar -vzxf libmemcached-1.0..tar.gz ./confiure
make
sudo make install
安装目录 /usr/local/include /usr/local/lib
6. libmemcached API
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
*
* Libmemcached library
*
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*
* * The names of its contributors may not be used to endorse or
* promote products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/ #pragma once /* This seems to be required for older compilers @note http://stackoverflow.com/questions/8132399/how-to-printf-uint64-t */
#ifndef __STDC_FORMAT_MACROS
# define __STDC_FORMAT_MACROS
#endif #ifdef __cplusplus
# include <tr1/cinttypes>
# include <cstddef>
# include <cstdlib>
#else
# include <inttypes.h>
# include <stddef.h>
# include <stdlib.h>
# include <stdbool.h>
#endif #include <sys/types.h> #include <libmemcached-1.0/visibility.h>
#include <libmemcached-1.0/configure.h>
#include <libmemcached-1.0/platform.h> #include <libmemcached-1.0/limits.h>
#include <libmemcached-1.0/defaults.h> #include <libmemcached-1.0/types/behavior.h>
#include <libmemcached-1.0/types/callback.h>
#include <libmemcached-1.0/types/connection.h>
#include <libmemcached-1.0/types/hash.h>
#include <libmemcached-1.0/types/return.h>
#include <libmemcached-1.0/types/server_distribution.h> #include <libmemcached-1.0/return.h> #include <libmemcached-1.0/types.h>
#include <libmemcached-1.0/callbacks.h>
#include <libmemcached-1.0/alloc.h>
#include <libmemcached-1.0/triggers.h> #include <libhashkit-1.0/hashkit.h> #include <libmemcached-1.0/struct/callback.h>
#include <libmemcached-1.0/struct/string.h>
#include <libmemcached-1.0/struct/result.h>
#include <libmemcached-1.0/struct/allocator.h>
#include <libmemcached-1.0/struct/sasl.h>
#include <libmemcached-1.0/struct/memcached.h>
#include <libmemcached-1.0/struct/server.h>
#include <libmemcached-1.0/struct/stat.h> #include <libmemcached-1.0/basic_string.h>
#include <libmemcached-1.0/error.h>
#include <libmemcached-1.0/stats.h> // Everything above this line must be in the order specified.
#include <libmemcached-1.0/allocators.h>
#include <libmemcached-1.0/analyze.h>
#include <libmemcached-1.0/auto.h>
#include <libmemcached-1.0/behavior.h>
#include <libmemcached-1.0/callback.h>
#include <libmemcached-1.0/delete.h>
#include <libmemcached-1.0/dump.h>
#include <libmemcached-1.0/encoding_key.h>
#include <libmemcached-1.0/exist.h>
#include <libmemcached-1.0/fetch.h>
#include <libmemcached-1.0/flush.h>
#include <libmemcached-1.0/flush_buffers.h>
#include <libmemcached-1.0/get.h>
#include <libmemcached-1.0/hash.h>
#include <libmemcached-1.0/options.h>
#include <libmemcached-1.0/parse.h>
#include <libmemcached-1.0/quit.h>
#include <libmemcached-1.0/result.h>
#include <libmemcached-1.0/server.h>
#include <libmemcached-1.0/server_list.h>
#include <libmemcached-1.0/storage.h>
#include <libmemcached-1.0/strerror.h>
#include <libmemcached-1.0/touch.h>
#include <libmemcached-1.0/verbosity.h>
#include <libmemcached-1.0/version.h>
#include <libmemcached-1.0/sasl.h> #include <libmemcached-1.0/deprecated_types.h> #ifdef __cplusplus
extern "C" {
#endif LIBMEMCACHED_API
void memcached_servers_reset(memcached_st *ptr); LIBMEMCACHED_API
memcached_st *memcached_create(memcached_st *ptr); LIBMEMCACHED_API
memcached_st *memcached(const char *string, size_t string_length); LIBMEMCACHED_API
void memcached_free(memcached_st *ptr); LIBMEMCACHED_API
memcached_return_t memcached_reset(memcached_st *ptr); LIBMEMCACHED_API
void memcached_reset_last_disconnected_server(memcached_st *ptr); LIBMEMCACHED_API
memcached_st *memcached_clone(memcached_st *clone, const memcached_st *ptr); LIBMEMCACHED_API
void *memcached_get_user_data(const memcached_st *ptr); LIBMEMCACHED_API
void *memcached_set_user_data(memcached_st *ptr, void *data); LIBMEMCACHED_API
memcached_return_t memcached_push(memcached_st *destination, const memcached_st *source); LIBMEMCACHED_API
memcached_server_instance_st memcached_server_instance_by_position(const memcached_st *ptr, uint32_t server_key); LIBMEMCACHED_API
uint32_t memcached_server_count(const memcached_st *); LIBMEMCACHED_API
uint64_t memcached_query_id(const memcached_st *); #ifdef __cplusplus
} // extern "C"
#endif
#include "stdio.h"
#include <string>
#include <iostream>
using namespace std; #include <libmemcached/memcached.h> int main()
{
memcached_st *memc;
memcached_return rc;
memcached_server_st *server;
time_t expiration = ;
uint32_t flags = ; memc = memcached_create(NULL);
server = memcached_server_list_append(NULL, "127.0.0.1", , &rc);
rc = memcached_server_push(memc, server);
memcached_server_list_free(server); string key = "key";
string value = "value";
size_t value_length = value.length();
size_t key_length = key.length(); //Save data
rc = memcached_set(memc, key.c_str(), key.length(), value.c_str(), value.length(), expiration, flags);
cout << rc << endl;
if (rc == MEMCACHED_SUCCESS)
{
cout << "Save data:" << value << " sucessful!" << endl;
} //Get data
char* result = memcached_get(memc, key.c_str(), key_length, &value_length, &flags, &rc);
if (rc == MEMCACHED_SUCCESS)
{
cout << "Get value:" << result << " sucessful!" << endl;
} //Delete data
rc = memcached_delete(memc, key.c_str(), key_length, expiration);
if (rc == MEMCACHED_SUCCESS)
{
cout << "Delete key:" << key << " sucessful!" << endl;
} //free
memcached_free(memc);
return ;
}

分布式缓冲之memcache的更多相关文章
- 分布式缓存之 memcache 实现分布式缓存
最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可 ...
- memcache分布式实现、memcache分布…
Memcache的分布式介绍 memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能.服务器端仅包括内存存储功能,其实现非常简单.至于m ...
- 分布式缓存之Memcache
〇.为什么要用分布式缓存 1.软件从单机到分布式 走向分布式第一步就是解决:多台机器共享登录信息的问题. 例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享 ...
- 分布式缓存系统——memcache
一.简介 memcache是一个自由开源的.高性能的.分布式内存对象缓存系统.它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API调用等. ...
- memcache 分布式缓存
转载地址:http://www.cnblogs.com/phpstudy2015-6/p/6713164.html 作者:那一叶随风 1.memcached分布式简介 memcached虽然称为“分布 ...
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...
- memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法
1 网络IO模型 安装memcached需要先安装libevent Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描 ...
- 分布式缓存(Cache)
1. 单层分布式cache. 如memcache. 2. 多层分布式cache. 服务端和调用者本地都存放cache, 使用udp组播解决cache同步更新问题,但不可靠. 3. 改进的多层分布式ca ...
- memcached分布式缓存
1.memcached分布式简介 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能.Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算 ...
随机推荐
- NIO复习03
SocketChannel: 1. Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChan ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 会话控制Cookie的应用
Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户端对服务器的请求中发回它.PHP透明地支持HTTP Cookie.可以利用他在远程浏览器端存储数据并以此来跟 ...
- 20145217《网络对抗》 Web安全基础实践
20145217<网络对抗> Web安全基础实践 一.实践任务 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 二.实验后回答问题 (1)SQL注入攻击原理,如 ...
- Python 面向对象的综合应用
# 面向对象的综合应用 # 计算器:实现一些基本的计算操作,已经打印结果 # --------------- 代码1 ---------------------- def add(x, y): ret ...
- 读取Excel复杂的数据
涉及到合并单元格的数据读取: package com.util; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util ...
- coredump调试小结
在已经启动的进程中使用gdb,用gdb attach 查看so文件中的函数列表 nm -D *.so 关于c.c++类的gdb调试,强烈推荐一本书:debug hack
- MyEclipse安装aptana插件, 8.5之前版本 和 之后版本, MyEclipse10安装aptana
MyEclipse8.5安装aptana插件说明: 1.在myeclipse的安装目录下,有个common文件夹,建一个myplugIns,此目录下建aptana_update_024747目录 2. ...
- SpiralOrderTraverse,螺旋遍历二叉树,利用两个栈
问题描述:s型遍历二叉树,或者反s型遍历二叉树 算法分析:层序遍历二叉树只需要一个队列,因为每一层都是从左往右遍历,而s型遍历二叉树就要用两个栈了,因为每次方向相反. public static vo ...
- ThinkPad.E440_FN键反了
1.一直不知道,为何我的 FN键反了(Fn+F1 才是F1的功能),想改过来.查到是 BIOS中改,但是 BIOS里面没有 那些个修改的选项,于是 还原了BIOS的设置,于是出问题了... 2.问题1 ...