• python使用memcached


    本文介绍如何在linux下安装使用memcached

    安装准备:

    1.libevent

    地址:http://libevent.org/

    2.memcached(依赖libevent)

    地址:http://www.memcached.org/

    3.python-memcached

    地址:https://pypi.python.org/pypi/python-memcached

    安装libevent

    到官网下载安装

    注意,编译安装需到默认路径,否则memcached找不到

    或者yum install libevent-devel

    安装 memcached:

    1、下载地址:http://www.memcached.org/files/memcached-1.4.21.tar.gz

    2、tar -zxvf memcached-1.4.21.tar.gz

    3、./configure --prefix=/usr/local/memcached && make && make install

     

    安装python API组件:

    1、下载地址:https://pypi.python.org/packages/source/p/python-memcached/python-memcached-1.53.tar.gz

    2、tar xvzf python-memcached-1.53.tar.gz

    3、python setup.py install

     

    启动memcached

    memcached -d -m 64 -l 10.1.41.113 -p 11211

    启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为64M(-m), 监听(-l)服务器10.1.41.113的11212号端口(-p)

    root下要加-u 指定user参数

    memcached -u bj1822 -d -m 64 -l 10.1.41.113 -p 11211

     

    #杀掉缓存

    ps aux|grep memcached

    killall memcached

     

    #启动缓存                           

    /usr/local/memcached/bin/memcached -d -m 1024 -c 2048 -p 7788 -t 8 -u nobody

    /usr/local/memcached/bin/memcached -d -m 1024 -c 2048 -p 7789 -t 8 -u nobody

     

    memcached -h

    memcached 1.2.2

    -p <num>      TCP port number to listen on (default: 11211)

    -U <num>      UDP port number to listen on (default: 0, off)

    -s <file>     unix socket path to listen on (disables network support)

    -l <ip_addr> interface to listen on, default is INDRR_ANY

    -d            run as a daemon

    -r            maximize core file limit

    -u <username> assume identity of <username> (only when run as root)

    -m <num>      max memory to use for items in megabytes, default is 64 MB

    -M            return error on memory exhausted (rather than removing items)

    -c <num>      max simultaneous connections, default is 1024

    -k            lock down all paged memory

    -v            verbose (print errors/warnings while in event loop)

    -vv           very verbose (also print client commands/reponses)

    -h            print this help and exit

    -i            print memcached and libevent license

    -b            run a managed instanced (mnemonic: buckets)

    -P <file>     save PID in <file>, only used with -d option

    -f <factor>   chunk size growth factor, default 1.25

    -n <bytes>    minimum space allocated for key+value+flags, default 48

     

    编写python程序:

    import memcache, time

    mc = memcache.Client(['10.1.41.113:11211'], debug=0)

    连接到10.1.41.113的11211端口,也就是memcachd启动的端口。

     

    mc.set("some_key", "Some value")

    设置key和value,第三个参数默认为0,也就是数据永不超时。

    如果这样设置:

    mc.set("some_key", "Some value",1)

    表示一秒后超时

    过两秒打印value的话

    time.sleep ( 2)

    value = mc.get("some_key")

    print value

    结果就是None了。

     

    删除

    mc.set("another_key", 3)

    mc.delete("another_key")                                                                                                           

    自增和自减

    mc.set("key", "1")                                                                                

    mc.incr("key")                                                                                

    mc.decr("key")          

     

    关于LRU

    LRU是缓冲超过存储上限时删掉队尾也就是最长时间没人访问的元素,参数是-M。但设置了-M和过期时效会存在将未失效的元素删去的风险。所以网上有人改了下代码,增加对过期时效的判断:

     

    返回超时时间的代码:

    if (exptime > REALTIME_MAXDELTA) 

         return (rel_time_t) (exptime - stats.started);   

    else { 

         return (rel_time_t) (exptime + current_time); 

    }

    memcached的失效时间格式有两种,当大于60*60*24*30也就是30天的秒数时就是过期距1970年1月1日零时的秒数,否则是有效的秒数。

     

    删除cache的代码:

    for (search = tails[id]; tries>0 && search; tries--, search=search->prev) { 

    if (search->refcount==0) { 

       item_unlink(search); 

        break; 

    }

    增加条件:

    search->exptime && search->exptime <= current_time 

    这样就可以保证删除的都是过期了的元素了。

  • 相关阅读:
    python 数据结构--Set(集合)
    python 数据结构--Dictionary(字典)
    idea使用心得
    SpringBoot(一):构建第一个SpringBoot工程
    springboot服务的一些问题
    maven使用问题总结

    多线程学习三:Thread API,ThreadLocal,synchronized,volatile和Condition
    多线程学习二:线程池 ExecutorService
    多线程学习一:创建多线程的方式
  • 原文地址:https://www.cnblogs.com/ggjjl1/p/4148128.html
Copyright © 2020-2023  润新知