初步使用pymemcache对memcached进行数据缓存操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/89945155

初步使用pymemcache对memcached进行数据缓存操作


本章将介绍通过python中pymemcache模块对memcached缓存进行操作。

一、初始memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

以上内容来自:https://www.runoob.com/memcached/memcached-tutorial.html

以下为网站读取Memcached数据时的工作流程
在这里插入图片描述
首先客户端发送请求,通过web/app调用memcached接口去找数据,如果找到数据直接返回给客户端,如果没有数据则访问数据库,并返回,在返回数据的过程中在memcached缓存中存一份,当下一次客户端请求数据时直接通过memcached返回即可。减少了数据库的压力。本章会通过pymemcache模块模拟以上访问过程。

1.1、安装memcached
[root@yankai ~]# yum install memcached -y
Loaded plugins: fastestmirror
base                                                                                                                                                | 3.6 kB  00:00:00     
extras                                                                                                                                              | 3.4 kB  00:00:00     
mariadb                                                                                                                                               | 2.9 kB  00:00:00    
updates                                                                                                                                               | 3.4 kB  00:00:00    
Loading mirror speeds from cached hostfile
 * base: ftp.sjtu.edu.cn
 * extras: ftp.sjtu.edu.cn
 * updates: ftp.sjtu.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.15-10.el7_3.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================================================================================
 Package                                  Arch                                  Version                                          Repository                           Size
===========================================================================================================================================================================
Installing:
 memcached                                x86_64                                1.4.15-10.el7_3.1                                base                                 85 k

Transaction Summary
===========================================================================================================================================================================
Install  1 Package

Total download size: 85 k
Installed size: 176 k
Downloading packages:
memcached-1.4.15-10.el7_3.1.x86_64.rpm                                                                                                              |  85 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : memcached-1.4.15-10.el7_3.1.x86_64                                                                                                                      1/1 
  Verifying  : memcached-1.4.15-10.el7_3.1.x86_64                                                                                                                      1/1 

Installed:
  memcached.x86_64 0:1.4.15-10.el7_3.1                                                                                                                                     

Complete!
1.2、启动memcached
[root@yankai ~]# /usr/bin/memcached -p 11211 -m 128M -vv -u root
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       120 perslab    8738
slab class   3: chunk size       152 perslab    6898
slab class   4: chunk size       192 perslab    5461
slab class   5: chunk size       240 perslab    4369
slab class   6: chunk size       304 perslab    3449
slab class   7: chunk size       384 perslab    2730
slab class   8: chunk size       480 perslab    2184
slab class   9: chunk size       600 perslab    1747
slab class  10: chunk size       752 perslab    1394
slab class  11: chunk size       944 perslab    1110
slab class  12: chunk size      1184 perslab     885
slab class  13: chunk size      1480 perslab     708
slab class  14: chunk size      1856 perslab     564
slab class  15: chunk size      2320 perslab     451
slab class  16: chunk size      2904 perslab     361
slab class  17: chunk size      3632 perslab     288
slab class  18: chunk size      4544 perslab     230
slab class  19: chunk size      5680 perslab     184
slab class  20: chunk size      7104 perslab     147
slab class  21: chunk size      8880 perslab     118
slab class  22: chunk size     11104 perslab      94
slab class  23: chunk size     13880 perslab      75
slab class  24: chunk size     17352 perslab      60
slab class  25: chunk size     21696 perslab      48
slab class  26: chunk size     27120 perslab      38
slab class  27: chunk size     33904 perslab      30
slab class  28: chunk size     42384 perslab      24
slab class  29: chunk size     52984 perslab      19
slab class  30: chunk size     66232 perslab      15
slab class  31: chunk size     82792 perslab      12
slab class  32: chunk size    103496 perslab      10
slab class  33: chunk size    129376 perslab       8
slab class  34: chunk size    161720 perslab       6
slab class  35: chunk size    202152 perslab       5
slab class  36: chunk size    252696 perslab       4
slab class  37: chunk size    315872 perslab       3
slab class  38: chunk size    394840 perslab       2
slab class  39: chunk size    493552 perslab       2
slab class  40: chunk size    616944 perslab       1
slab class  41: chunk size    771184 perslab       1
slab class  42: chunk size   1048576 perslab       1
<26 server listening (auto-negotiate)
<27 server listening (auto-negotiate)
<28 send buffer was 212992, now 268435456
<29 send buffer was 212992, now 268435456
<28 server listening (udp)
<28 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)

/usr/bin/memcached -p 11211 -m 128M -vv -u root # -p:端口 -m设置最大内存默认为:64M,-vv, 输出详细信息 -u 用户名

二、通过telnet连接memcached进行操作

[root@yankai ~]# telnet localhost 11211

telnet localhost 11211 # 通过telnet 连接地址为 localhost 端口为11211的服务

2.1、Memcached set 命令

Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

set基本语法:

set key flags exptime bytes [noreply] 
value 

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

操作:

[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set name 0 20 2
yk
STORED
get name
VALUE name 0 2
yk
END
get name
END

在这里插入图片描述验证在缓存中存储的字节数:

[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set password 0 20 6
yankerp
CLIENT_ERROR bad data chunk
ERROR
get password  
END
set password 0 20 6
yanker
STORED
get password
VALUE password 0 6
yanker
END
set password 0 0 6
yanker
STORED
get password
VALUE password 0 6
yanker
END
三、通过pymemcache模块对memcached进行操作
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/5/7 18:26
# @Author  : YanZanG
# @File    : memcached.py
# @Function: -----------

import time
import json
from pymemcache.client.base import Client


def get_data():
    """获取数据

    1.从mysql中获取
    2.从其他的一些接口获取数据
    """
    data = {'iphone': ['iphone6', 'iphone7', 'iphone8'], 'Android': ['oppo', 'vivo']}
    time.sleep(5)
    return data


def show_data(data):
    """显示数据内容
    """
    for k, v in data.items():
        print(f"{k} : {v}")


def set_memcache(k, data):
    """将数据加入到缓存中
    """
    try:
        client = Client(('172.20.10.7', 11211))
        client.set(k, json.dumps(data))
        return True
    except Exception as e:
        print(e)
        return False


def get_memcached(k):
    """获取memcached数据
    """
    try:
        client = Client(('172.20.10.7', 11211))
        return json.loads(client.get(k))
    except Exception as e:
        print(e)
        return False


def main():
    """入口函数
    """
    k = "Phone_menu"
    result = get_memcached(k)
    if result:
        print("这是从缓存中取数据")
        show_data(result)
    else:
        print("这是从数据库取数据")
        data = get_data()
        show_data(data)
        set_memcache(k, data)
main()
# ---------------------------第一次运行--------------------------
这是从数据库取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第二次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第三次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------清除memcached数据再次运行--------------------------
这是从数据库取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第二次再次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']

清除memcached缓存数据

[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
flush_all
OK

希望对您有所帮助,再见~

猜你喜欢

转载自blog.csdn.net/qq_39591494/article/details/89945155
今日推荐