分布式缓冲之memcache

1.memcache简介memcache是danga.com的一个项目,它是一款开源的高性能的分布式内存对象缓存系统,,最早是给LiveJournal提供服务的,后来逐渐被越来越多的大型网站所采用

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1. memcache简介

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

  分布式缓冲之memcache

  为了在内存中提供数据的高速查找能力,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.17.tar.gz

配置、编译、安装memcache:
./configure

make

sudo make install 

3. memcache启动和关闭

(1)启动memcache服务

/use/local/bin/memcache -d -m 10 -u root -l 192.168.1.10 -p 11211 -c 32 -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.17.tar.gz

./confiure
make
sudo make install

 安装目录 /usr/local/include /usr/local/lib

6. libmemcached API

分布式缓冲之memcache
分布式缓冲之memcache

/*  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

View Code

#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 = 0;    uint32_t  flags = 0;    memc = memcached_create(NULL);    server = memcached_server_list_append(NULL, "127.0.0.1", 11211, &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 0;}

分布式缓冲之memcache

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120095.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月28日 下午10:00
下一篇 2021年12月28日 下午11:00


相关推荐

  • 蓝屏代码0x000000be_电脑蓝屏0*000000ed怎么解决

    蓝屏代码0x000000be_电脑蓝屏0*000000ed怎么解决windows系统相信大家最怕的就是遇到蓝屏的问题了,不太好解决,这不有朋友反馈电脑出现蓝屏代码0x000000BE的问题,电脑此时已经不能用了,那么要怎么解决呢?如果不知道如何操作的话,不妨先试试小编教大家的方法。蓝屏代码0x000000BE是什么意思?0x000000BE错误表示硬件设备的驱动程序试图向只读内存错误地写入数据,这个错误一般是因为硬件设备驱动程序存在BUG或安装不正确引起的。解决…

    2022年10月8日
    4
  • Python list列表删除元素(4种方法)

    Python list列表删除元素(4种方法)Pythonlist 列表删除元素 4 种方法 在 Python 列表中删除元素主要分为以下 3 种场景 根据目标元素所在位置的索引进行删除 可以使用 del 关键字或者 pop 方法 根据元素本身的值进行删除 可使用列表 list 类型 提供的 remove 方法 将列表中所有元素全部删除 可使用列表 list 类型 提供的 clear 方法 del 根据索引值删除元素 del 是 Python 中的关键字 专门用来执行删除操作 它不仅可以删除整个列表 还可以删除列表中的某些元素 我们已经

    2025年7月8日
    7
  • net share 共享文件夹

    net share 共享文件夹共享文件夹并设置共享文件夹为读写 netshareali M test unlimited grant everyone full 同时还需要配合 cacls 来设置文件夹访问权限 caclsM test geveryone rR 读取 W 写入 C 更改 写入 F 完全控制 netshareali M test unlimited grant everyone fullcaclsM test geveryone r

    2025年12月11日
    6
  • XMind快捷键汇总

    XMind快捷键汇总在XMind:ZEN中,快捷键是可以大大提高绘图效率的存在。掌握常用的快捷键组合,就可以在键盘上运指如飞,快速地进行思维导图的绘制。还在等什么?感兴趣的朋友,下面就和小编一起来看看吧!XMind快捷键汇总在XMind:ZEN中,主要的快捷键类型有四种,分别是:文件(File)、插入(Insert)、编辑(Edit)和查看(View)。文件文件快捷键,指的是对当前…

    2022年6月6日
    44
  • 我们可以使用命令kill来结束Linux系统下运行的进程(kill强制杀死进程)

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志。首先使用ps-ef命令确定要杀死进程的PID,然后输入以下命令:#kill–pid注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。确定要杀死进程的PID或PPID#ps-ef|grephttpd以优雅的方式结束进

    2022年4月16日
    83
  • thread 守护线程_守护线程与非守护线程

    thread 守护线程_守护线程与非守护线程  Java中线程分为用户线程(userthread)和守护线程(daemonthread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。  一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:Threadparent=currentThread();this.daemon=parent.isDaemon();  当虚拟机中剩余运行

    2022年10月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号