zoukankan      html  css  js  c++  java
  • linux 下如何安装memcached 和启动服务

    一、安装gcc

    # yum -y install gcc

    二、安装libevent

    # wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz
    # tar zxf libevent-2.0.12-stable.tar.gz 
    # cd libevent-2.0.12-stable
    #./configure  --prefix=/usr/local/lib
    # make && make install 

    三、下载安装最新版本:http://memcached.org/downloads

    # wget http://memcached.org/files/memcached-1.4.20.tar.gz

    #tar zxvf memcached-1.4.20.tar.gz

    # cd memcached-1.4.20

    #./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/lib && make && make install

    四、配置启动

    # vi /etc/rc.local  


    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.
    touch /var/lock/subsys/local

    /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null 2>&1 &
    /usr/local/agenttools/agent/startagent.sh  /usr/local/agenttools/agent /dev/null

    #secu-tcs-agent bootstart, install at Tue Apr 29 17:21:38 CST 2014.
    /usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null 2>&1

    /usr/local/memcached/bin/memcached -p 12677 -U 0 -d -r -u root -m 2040 -c 1024 -t 4

    保存后退出,手动启动服务

    # /usr/local/memcached/bin/memcached -p 12677 -U 0 -d -r -u root -m 2040 -c 1024 -t 4
    参数说明:
        -d 是启动一个守护进程
        -m 是分配给Memcache使用的内存数量,单位是MB
        -u 是运行Memcache的用户
        -l 是监听的服务器IP地址
        -p 是设置Memcache监听的端口,最好是1024以上的端口
        -c 选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
        -P 是设置保存Memcache的pid文件


    注:如果出现/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory异常在/etc/ld.so.conf中加入/usr/local/lib这一行,保存之后,再运行:/sbin/ldconfig –v更新一下配置即可。

    # vi /etc/ld.so.conf

    #  /sbin/ldconfig -V

    五、测试memcached

    # telnet 127.0.0.1 12677

    出现以下信息表示启动成功
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.(退出telnet的方法是:quit+回车)

    上部分转载自http://blog.csdn.net/fengyily/article/details/35569433

    Memcached命令

    1
    2
    3
    存储命令: set/add/replace/append/prepend/cas
    获取命令: get/gets
    其他命令: delete/stats..

    Python操作Memcached

    安装API

    1
     
     
    2
    python操作Memcached使用Python-memcached模块
    pip install python-memcached
     
    下载安装:https://pypi.python.org/pypi/python-memcached

    1、第一次操作

    1
    2
    3
    4
    5
    6
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
    mc.set("foo""bar")
    ret = mc.get('foo')
    print ret

    Ps:debug = True 表示运行出现错误时,现实错误信息,上线后移除该参数。

    2、天生支持集群

    python-memcached模块原生支持集群操作,其原理是在内存维护一个主机列表,且集群中主机的权重值和主机在列表中重复出现的次数成正比

    1
    2
    3
    4
    5
    6
    7
         主机    权重
        1.1.1.1   1
        1.1.1.2   2
        1.1.1.3   1
     
    那么在内存中主机列表为:
        host_list = ["1.1.1.1""1.1.1.2""1.1.1.2""1.1.1.3", ]

    如果用户根据如果要在内存中创建一个键值对(如:k1 = "v1"),那么要执行一下步骤:

    • 根据算法将 k1 转换成一个数字
    • 将数字和主机列表长度求余数,得到一个值 N( 0 <= N < 列表长度 )
    • 在主机列表中根据 第2步得到的值为索引获取主机,例如:host_list[N]
    • 连接 将第3步中获取的主机,将 k1 = "v1" 放置在该服务器的内存中

    代码实现如下:

    1
    2
    3
    mc = memcache.Client([('1.1.1.1:12000'1), ('1.1.1.2:12000'2), ('1.1.1.3:12000'1)], debug=True)
     
    mc.set('k1''v1')

    3、add
    添加一条键值对,如果已经存在的 key,重复执行add操作异常

    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
    mc.add('k1''v1')
    # mc.add('k1', 'v2') # 报错,对已经存在的key重复添加,失败!!!

    4、replace
    replace 修改某个key的值,如果key不存在,则异常

    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
    # 如果memcache中存在kkkk,则替换成功,否则一场
    mc.replace('kkkk','999')

    5、set 和 set_multi

    set            设置一个键值对,如果key不存在,则创建,如果key存在,则修改
    set_multi   设置多个键值对,如果key不存在,则创建,如果key存在,则修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
     
    mc.set('key0''wupeiqi')
     
    mc.set_multi({'key1''val1''key2''val2'})

    6、delete 和 delete_multi

    delete             在Memcached中删除指定的一个键值对
    delete_multi    在Memcached中删除指定的多个键值对

    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
     
    mc.delete('key0')
    mc.delete_multi(['key1''key2'])

    7、get 和 get_multi

    get            获取一个键值对
    get_multi   获取多一个键值对

    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
     
    val = mc.get('key0')
    item_dict = mc.get_multi(["key1""key2""key3"])

    8、append 和 prepend

    append    修改指定key的值,在该值 后面 追加内容
    prepend   修改指定key的值,在该值 前面 插入内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
    # k1 = "v1"
     
    mc.append('k1''after')
    # k1 = "v1after"
     
    mc.prepend('k1''before')
    # k1 = "beforev1after"

    9、decr 和 incr  

    incr  自增,将Memcached中的某一个值增加 N ( N默认为1 )
    decr 自减,将Memcached中的某一个值减少 N ( N默认为1 )

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
     
    mc = memcache.Client(['10.211.55.4:12000'], debug=True)
    mc.set('k1''777')
     
    mc.incr('k1')
    # k1 = 778
     
    mc.incr('k1'10)
    # k1 = 788
     
    mc.decr('k1')
    # k1 = 787
     
    mc.decr('k1'10)
    # k1 = 777

    10、gets 和 cas

    如商城商品剩余个数,假设改值保存在memcache中,product_count = 900
    A用户刷新页面从memcache中读取到product_count = 900
    B用户刷新页面从memcache中读取到product_count = 900

    如果A、B用户均购买商品

    A用户修改商品剩余个数 product_count=899
    B用户修改商品剩余个数 product_count=899

    如此一来缓存内的数据便不在正确,两个用户购买商品后,商品剩余还是 899
    如果使用python的set和get来操作以上过程,那么程序就会如上述所示情况!

    如果想要避免此情况的发生,只要使用 gets 和 cas 即可,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
    mc = memcache.Client(['10.211.55.4:12000'], debug=True, cache_cas=True)
     
    = mc.gets('product_count')
    # ...
    # 如果有人在gets之后和cas之前修改了product_count,那么,下面的设置将会执行失败,剖出异常,从而避免非正常数据的产生
    mc.cas('product_count'"899")

    Ps:本质上每次执行gets时,会从memcache中获取一个自增的数字,通过cas去修改gets的值时,会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交,如果不想等,那表示在gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。

    此部分转载:http://www.cnblogs.com/wupeiqi/articles/5132791.html

  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/knighterrant/p/10696782.html
Copyright © 2011-2022 走看看