Memcache

前戏

  Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象减少读取数据库的次数,从而减小数据库的压力,提高动态,数据库网站的速度。Memcached基于一个存储 键/值对的hashmap。其守护进程是用C编写的,但是客户端可以用任何语言来编程,并通过Memcached协议和守护进程通信。

Memcached安装及基本使用

  Memcached服务端的安装

#依赖libevent,先安装
yum install libvent-devel*
#用wget去http://memcached.org下载最新源码
tar -zxvf memcached-1.4.29.tar.gz
#编译安装
./configure && make && make test && sudo make install  

  Memcached的启动

memcached -d -m 10 -u root -p 12000 -c 256 -P /tmp/memcached.pid参数概述:-d 启动一个线程;-m 分配给Memcached使用的内存数量,单位是MB;-u 运行Memcached的用户;-l 监听的服务器IP地址(可选)-p 设置Memcache监听的端口,最好是1024以上的端口;-c 最大运行的并发连接数,默认是1024,按照服务器的负载量来设定-P 设置保存Memcached的pip文件

 Memcached的基本操作命令

memcached的操作分为三类:存储操作:      setaddreplaceappendprependcas获取操作:getgets其他命令:deletestats

使用python操作Memcached

在python中使用Memcached,首先安装memcache:install python-memcached

连接使用

import memcachem = memcache.Client(['192.168.12.12:8800'],debug=True)
m.set('liu','qingyang')
res = m.get('liu')
print(res)
#打印qingyang
#debug=True表示运行错误时,显示错误信息,生产环境中不需要

集群支持

python-memcached模块支持集群操作。就是在内存维护一个主机列表,而且集群中主机的权重值与主机在列表中出现的次数成正比。

    主机                    权重
192.0.0.1                  1
192.0.0.2                  2
192.0.0.3                  1
#内存主机列表:HostList = ["192.0.0.1","192.0.0.2","192.0.0.2","192.0.0.3"]   

set操作

#set:设置一个键值对,如果key不存在,就创建;如果存在,就更新value;
#set_multi:设置多个键值对,如果key不存在,就创建;如果存在,就更新values。import memcache
m = memcache.Client(["192.0.0.1:8800"],debug=True)
m.set('liu',111)
m.set_mulit({'liu':111,'wu':222})

get操作

#get 获取一个键值对
#get_multi 获取多个键值对import memcachem = memcache.Client(['192.0.0.1:8800'],debug=True)
print(m.get('liu'))
print(m.get_multi(['liu','wu']))

add操作

#add 添加一个键值对,如果key已经存在,操作将会报错:MemCached: while expecting 'STORED', got unexpected response 'NOT_STORED'
#add 和 set 都是存储操作,但是set可以更新value,add不可以。
import memcachem = memcache.Client(['192.0.0.1:8800'],debug=True)
m.set('liu','111')
m.add('wu',222)     #如果已经存在'wu'的key,会报错 

replace操作

#replace 替换,修改key的值,如果key不存在,则报错:MemCached: while expecting 'STORED', got unexpected response 'NOT_STORED'
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.replace('liu',222)
m.replace('li',333)   #如果不存在'li'的key,会报错

delete操作

#delete 删除指定的一个键值对,如果没有指定的key,不会报错
#delete_multi 删除多个键值对
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.delete('liu')
m.delete('wu')
m.delete_multi(['liu','wu'])

append,prepend操作

#append:修改指定key的值,在值的后面追加数据,无指定key会报异常
#prepend:修改指定key的值,在值的前面插入数据
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.append('cc','dd')
m.append('ds','dsdsds')    #不存在ds,会报异常m.prepend('cc','aa')

decr,incr操作

#incr:自增,将Memcached中的某一个值增加N,(N默认为1),如果值非数字,会报错
#decr:自减,将Memcached中的某一个值减少N,(N默认为1),如果值非数字,会报错
import memcachem=memcache.Client(['192.0.0.1:8800'],debug=True)
m.incr('liu')
m.decr('liu',30)

gets cas使用

#为了避免在生产环境中产生脏数据,使用gets和cas,类似MySQL中的事务
import memcachemc=memcache.Client(['192.0.01:8800'],debug=True)
m.set('count',999)
print(m.gets('count'))
# 如果有人在gets之后和cas之前修改了product_count,那么,下面的设置将会执行失败,抛出异常,从而避免非正常数据的产生
m.cas('count',998)
#cas也能创建一个不存在key的键值对
m.cas('w',90)
print(m.gets('w'))
#每次执行gets时,会从memcache中获取一个自增的数字,通过cas去修改gets的值时,会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交,如果不想等,那表示在gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。

 memcached和redis的区别

1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。 
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。 
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 
4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire liu 111
5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从 
6、存储数据安全–memcache挂掉后,数据没了;redis可以定期持久化 
7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复 
8、Redis支持数据的备份,即master-slave模式的数据备份。

  

  

转载于:https://www.cnblogs.com/liuqingyang/p/10987876.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Button自动刷新页面的问题

一、问题 <button class"am-btn am-btn-default am-btn-xs am-text-secondary" data-id"99" data-type1><span class"am-icon-pencil-square-o"></span>修改</button>11 页面上有这样一个按钮&#xff0c;每次点击这个…

Django.1

Django官方网站&#xff1a;https://www.djangoproject.com/ 使用终端创建Django文件 创建工程 django-admin startproject XXX 创建应用 python manage.py startapp YYY 迁移系统指令&#xff1a; 首先生成迁移文件 python manage.py makemigrations 执行迁移文件 python ma…

vue项目水印添加

import DomSize from wd-domsize-monitor; // 此处为 npm 下载的第三方模块包 import Api_login from "/assets/api/login" // 此处是用户信息接口调用var id shuiyinDiv var isInit false let callback function (ele) {DomSize.bind(ele, function () {//水印被…

mybatis传参

在mybatis的学习中&#xff0c;会发现经常需要传参&#xff0c;这里以上一节写的实体类为基础&#xff0c;当我们要添加一个员工时&#xff0c;需要添加员工的基本信息&#xff0c;以及所属部门&#xff0c;按照以前的方法&#xff0c;在实体类中&#xff0c;添加部门id属性&am…

自定义步骤条

展示图&#xff1a; <template><div classcreateorder><!-- 顶部步骤条 --><div class"createorder_top"><div class"createorder_top_left"><!-- 0 --><span class"createorder_left_set" :class"…

jquery让页面滚动到底部

function scrollToEnd(){//滚动到底部var h $(document).height()-$(window).height();$(document).scrollTop(h); }

迭代器

一、定义 1.iterator.(迭代器&#xff09; 2.iterable.&#xff08;可迭代的&#xff09; 一般来说&#xff0c;可以被for循环的就是可以迭代的&#xff0c;迭代器一定可以迭代&#xff0c;但是可迭代的类型不一定是迭代器。 二、说明 1.有__iter__方法&#xff0c;说明可迭代 …

css获取到指定元素的宽度,在回调返回宽度值

<script type"text/javascript">//获取到指定元素的宽度&#xff0c;在回调返回宽度值//通过处理这个value&#xff0c;重新设置新的宽度$(.sixth).css("width",function(index,value){//value带单位&#xff0c;先分解value value.split(px);//返回…

android 文件读写

读取&#xff1a; public static String _getJsonString(String fileName) throws IOException { if ((fileName null) || fileName.isEmpty()) { return ""; } String retString ""; FileInputStream fis null; String state Environment.getExternal…

element组件库中table自定义分页效果

1.在data中设置初始值 // 页数 页码search: { offset: 1, // 当前页limit: 10, // 条数total:0, //总数},2.设置获取后的数据分配 :data"tableData.slice((search.offset - 1) * search.limit, search.offset * search.limit)" 3.展示效果&#xff1a;

Django信号量

信号 Django中提供了“信号调度”&#xff0c;用于在框架执行操作时解耦。通俗来讲&#xff0c;就是一些动作发生的时候&#xff0c;信号允许特定的发送者去提醒一些接受者。 1、Django内置信号 1 Model signals2 pre_init # django的modal执行其构造方…

uni-app 调用接口封装文档

1.创建 util 文件夹 &#xff0c;并在文件夹中创建 api.js const BASE_URL http://localhost:8082 // 域名头 export const myRequest (options)>{return new Promise((resolve,reject)>{uni.request({url:BASE_URLoptions.url,method: options.method || GET,data: …

HTML中INPUT type=date标签如何赋值注意问题

现在的html5 input标签支持type"date" 显示有日期的日历控件&#xff0c;一行简单的代码就能显示出一个日历控件&#xff0c;但是有的时候需要给它一个默认的日期值&#xff0c;这个时候可能就要用到val()&#xff0c; attr("value","")等方法&a…

数据轮播图翻页封装(左右点击)

效果图&#xff1a; <template><div class"box" style"height:200px;"><!-- 左 --><div class"box-left" click"submitrote(left)" mouseenter"chenge_menu(1)" mouseleave"chenge_menu(2)"…

jquery自动点击按钮

jquery自动点击按钮$(document).ready(function(){$("#imgcode_img").trigger("click");});

087-把PHP数组中的元素按随机顺序重新排列shuffle

<?php$arrarray(3,23,A,f,123,hello); //定义一个数组echo 排序之前的数组信息&#xff1a;<br>;print_r($arr);shuffle($arr); //对数组进行随机排序echo <br>排序之后的数组信息&#xff1a;<br>;print_r($arr); //输出数组信息#…

highcharts图表高级入门之polar:极地图的基本配置以及一些关键配置说明

highcharts图表组件内的极地图polar的实现和效果都还是很简单和美观的。 1、需要设置chart的polar属性为true&#xff1b;以表示是极地图&#xff1b; 2、其他的设置和普通图表就没什么区别了的&#xff0c;这里附上一个完整的示例代码&#xff1a; highcharts图表组件内的极地…

基于Element ui 实现输入框只能输入数字并支持千分位

实现效果 设置子组件 <template><el-inputref"money"v-model.trim"money":placeholder"placeholder"v-bind"$attrs"v-on"$listeners"input"formatNumber(money,money)"keyup.enter.native"moneyCh…

Vue-使用webpack+vue-cli搭建项目

一、准备 安装NodeJs 安装Webpack 配置环境变量 技巧使用&#xff1a; 1. npm 淘宝路径配置&#xff1a;npm config set registryhttps://registry.npm.taobao.org  2.查看npm命令列表 > $ npm help 二、搭建项目 1、全局安装vue脚手架工具 vue-cli npm install vue…

element 日历组件-自定义内容

这只是个子组件 <template><div ref"topBox" class"swiper-in page-container bg-white"><div class"w-full page-head">我的排班<i class"close-btn el-icon-close" click"closeCurrentPage"><…