大数据_MemCached

本文介绍NoSQL内存数据库MemCached和Redis的特点及应用。探讨为何选择内存存储数据,并详细讲解MemCached的基本原理、安装配置及操作方法。同时,对比不同路由算法的影响,并提供主主复制功能的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


NoSQL数据库:MemCached、Redis ----> 特点:基于内存

一、为什么要把数据存入内存?
    1、原因:快
    2、举例:在B/S架构中,如何去优化(提高)性能?
    3、常见的内存数据库
        (*)MemCached:看成Redis的前身,严格来说Memcached的不能叫数据库,原因:不支持持久化
        (*)Redis:内存数据库,持久化(RDB、AOF)
        (*)Oracle TimesTen
        (*)SAP HANA

这里写图片描述

二、MemCached缓存技术
    1、基本原理和体系结构
        (*) 就是在内存中,维护一张巨大的Hash表
        (*) MemCached通过一个路由算法(由客户端决定),来决定数据保存到哪一个节点上

这里写图片描述

    2、安装和配置
        (*) 前提1:安装gcc的编译器(之前:在HUE的时候,已经安装了)
        (*) 前提2:安装libevent
            (1) 确定、删除自带的libevent
               rpm -qa|grep libevent  =-==> 确定是否已有
               rpm -e libevent-2.0.21-4.el7.x86_64 --nodeps  (不要删除相关的依赖)

            (2) tar -zxvf libevent-2.0.21-stable.tar.gz
            (3) 安装到: /root/training/libevent
                 ./configure --prefix=/root/training/libevent
                 make
                 make install

        (*) 安装MemCached: 官方的版本:memcached-1.4.25.tar.gz 
             tar -zxvf memcached-1.4.25.tar.gz
             安装目录:/root/training/memcached
             配置:./configure --prefix=/root/training/memcached --with-libevent=/root/training/libevent
             make
             make install

        (*) 启动:./memcached -u root -d -m 128 -p 11211
                  ./memcached -u root -d -m 128 -p 11212
                  ./memcached -u root -d -m 128 -p 11213

    3、操作MemCached
        (1)命令行:telnet
            (*) 安装telnet:rpm -ivh telnet-0.17-64.el7.x86_64.rpm
            (*) telnet 127.0.0.1 11211
            (*) 插入数据: add/set
                   set: 如果key已经存在,会替换原来的值
                   add: 如果key已经存在,返回信息(错误): NOT_STROED

                   举例:add key1 0 0 4
                             key1: key-value的键
                             第一个0:标志位
                             第二个0:数据过期的时间,0表示永远不过期
                             4表示:数据的长度
                统计信息的命令:
                stats 
                stats items
                stats slabs

        (2)JAVA API


4、MemCached路由算法:由客户端来决定
    (1)求余数路由算法
        缺点:如果需要扩容或者有宕机的情况,会造成数据的丢失。
        举例:                   扩容
                 3台MemCached   ----> 4台MemCached
        key
        1         1                    1
        2         2                    2
        3         0                    3
        4         1                    0
        5         2                    1
        6         0                    2
        7         1                    3
        8         2                    0
        9         0                    1
        10        1                    2



    (2)一致性的hash算法

    参考讲义:P6
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;

import org.junit.Test;

import net.spy.memcached.MemcachedClient;

public class TestMemCached {

    @Test
    public void testInsert() throws Exception{
        //插入一个字符串
        //创建一个客户端
        MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.157.11", 11211));

        //插入数据
        Future<Boolean> f = client.set("key1", 0, "HelloWorld");
        if(f.get().booleanValue()){
            //表示插入成功
            client.shutdown();
        }
    }


    @Test
    public void testInsertObject() throws Exception{
        //插入一个对象:(*)必须实现序列化  (*) 不建议保存大对象
        //创建一个客户端
        MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.157.11", 11211));

        //插入数据
        Future<Boolean> f = client.set("stu001", 0, new Student());
        if(f.get().booleanValue()){
            //表示插入成功
            client.shutdown();
        }       
    }

    @Test
    public void testGet() throws Exception{
        //创建一个客户端
        MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.157.11", 11211));   
        Object obj = client.get("key1");
        System.out.println(obj);
        client.shutdown();
    }

    @Test
    public void testInsertList() throws Exception{
        /*
         * 启动三个MemCached实例,客户端的路由算法
         */
        //创建一个List
        List<InetSocketAddress> list = new ArrayList<>();
        list.add(new InetSocketAddress("192.168.157.11", 11211));
        list.add(new InetSocketAddress("192.168.157.11", 11212));
        list.add(new InetSocketAddress("192.168.157.11", 11213));

        //创建一个客户端
        MemcachedClient client = new MemcachedClient(list);

        //插入20条数据
        for(int i=0;i<20;i++){
            System.out.println("插入的数据是:" + "key"+i+"    "+"value"+i);

            client.set("key"+i, 0, "value"+i);

            //睡1秒
            Thread.sleep(1000);
        }

        //关闭客户端
        client.shutdown();
    }

}

//定义一个类
class Student implements Serializable{

}

    5、MemCached主主复制功能(双机热备)
    (1)不能使用官方的版本
        一个日本的工程师改写了官方的版本,支持主主复制功能
        memcached-1.2.8-repcached-2.2.tar.gz

    (2)准备两台:bigdata11  bigdata12
        (*)  tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz
        (*)  ./configure --prefix=/root/training/memcached_replication --with-libevent=/root/training/libevent --enable-replication
              make
                错误:error: ‘IOV_MAX’ undeclared (first use in this function)
                vi memcached.c
                     55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */
                     56 #ifndef IOV_MAX
                     57 //#if defined(__FreeBSD__) || defined(__APPLE__)
                     58 # define IOV_MAX 1024
                     59 //#endif
                     60 #endif

              make install

    (3) 启动:需要指定对端的Memcached地址: -x参数
        bigdata11:  ./memcached -d -u root -m 128 -x bigdata12
        bigdata12:  ./memcached -d -u root -m 128 -x bigdata11

        错误:
        ./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: 
                     No such file or directory

        判断:命令memcached依赖的库有哪些?
            ldd memcached
                linux-vdso.so.1 =>  (0x00007ffee936b000)
                libevent-2.0.so.5 => not found
                libc.so.6 => /lib64/libc.so.6 (0x00007fc26923e000)
                /lib64/ld-linux-x86-64.so.2 (0x00005579c379b000)

            创建一个连接,让系统的libevent-2.0.so.5 指向我们自己的libevent-2.0.so.5 
                (64位系统) ln -s /root/training/libevent/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
                (32位系统) ln -s /root/training/libevent/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5

        telnet退出:  ctrl + ]




三、Redis内存数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值