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

  • 相关阅读:
    java实训
    二维数组转置
    java第四次上机
    建立一个窗体
    java第三次上机
    数据结构晚自习
    Java程序设计第一次作业
    JAVA程序设计的第一次作业
    java中窗体的转化
    数据结构串的使用
  • 原文地址:https://www.cnblogs.com/knighterrant/p/10696782.html
Copyright © 2011-2022 走看看