memcache和redis

Nosql

1、NoSQL的基本说明

    NoSQL(NoSQL = Not Only SQL),意味反sql运动,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势愈加高涨。它指的是非关系型的数据库。javascript

2、兴起的缘由

    随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模高并发的sns类型的web2.0纯动态网站已经显得力不从心,暴露了不少难以克服的问题,而非关系型的数据库则因为自己的特色获得了很是迅速的发展。php

3、特色

    优势:

        高并发读写的性能    大数据量的扩展(分布式存储)     配置简单css

        灵活、高效的操做与数据模型     低廉的成本html

    缺点:

        没有统一的标准     没有正式的官方支持     各类产品还不算成熟java

4、常见的nosql产品

    新浪微博 Redis    Google Bigtable    Amazon SimpleDB    淘宝数据平台 Tairmysql

    优酷视频 MongoDB    飞信空间 HandlerSocket    视觉中国网站 MongoDBlinux

Memcache

1、基本概念

  1. Memcached是danga的一个项目,最先是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被不少大型的网站采用。 官方网站: www.danga.com  和 memcached.orgweb

  2. Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界很多人使用这个缓存项目来构建本身大负载的网站,来分担数据库的压力,经过在内存里维护一个统一的巨大的hash表,它可以用来存储各类格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,而后从内存中读取,从而大大提升读取速度。(注: 摘自百度全科)redis

     Memcached是一个高性能的分布式的内存对象缓存系统sql

    分布式的概念:咱们在实际的项目中可使用多台memcache服务器,共同工做,存储的数据是分布式的。 

2、memcache的安装

    一、下载软件,并解压,拷贝到指定的位置,通常便于管理,和服务器的环境在同一个目录下

        

    

    二、以管理员的方式进入到cmd窗口,并进入到memcache所在的目录

        memcache.exe  –d install  安装:安装完成后,经过Windows+R调出运行界面输入services.msc查看服务以下

        

    三、安装完成后,启动memcache服务

        memcached.exe –d start

        启动后,能够经过netstat –an命令查看memcahce的端口是否监听状态,memcache的端口号是,11211

        

    四、安装可能失败的缘由: 

        a 若是你是用win7,win8系统,他对安全性要求高,所以,须要你们使用管理员的身份来安装和启动. 具体是 程序开始===>全部程序==》附件==》cmd(单击右键,选择以管理员的身份来执行)

        b存放memcached.exe 目录不要有中文或者特殊字符

        c 安装成功,可是启动会报告一个错误信息,提示缺乏xx.dll ,你能够从别的机器拷贝该dll文件,而后放入到system32下便可.

        d若是上面三个方法都不能够,能够直接 cmd>memcached.exe  -p  端口 【这种方式不能关闭窗口】

    五、在启动时指定的一些基本命令

        -p 监听的端口     -l <ip地址>绑定地址(默认:全部都容许,不管内外网或者本机ip,有安全隐患,若设置为127.0.0.1就只能本机访问)
        -d start 启动memcached服务     -d restart 重起memcached服务     -d stop|shutdown 关闭正在运行的memcached服务
        -d install 安装memcached服务     -d uninstall 卸载memcached服务    -u 以的身份运行 (仅在以root运行的时候有效)
        -m 最大内存使用,单位MB。默认64MB     -M 内存耗尽时返回错误,而不是删除项     -c 最大同时链接数,默认是1024
        -f 块大小增加因子,默认是1.25     -n 最小分配空间,key+value+flags默认是48     -h 显示帮助

3、如何链接memcache服务器进行使用

    

4、使用telnet链接到memcache服务器(相似于黑窗口)

    链接方式:telnet ip地址  端口号    telnet localhost 11211

    数据存储格式:相似于关联数组

    第一列                               第二列

    键名(通常是字符串)       具体的数据内容(除了资源)

    增删改查操做

    一、添加数据

        add 键的名称  0  缓存的时间  数据的长度  (回车后添加内容)  0表示不压缩:

        好比:add color 0 100 3   表示向memcache里面添加的数据键为color,缓存的周期是100秒,数据的长度是3

        

    二、获取数据

        get 键名    get color

    三、修改数据 

        replace 要求键名必须存在,若是不存在,则提示一个错误。

        set set 指令也能够替换数据,若是键存在则替换,若是不存在,则等于添加。

        

    四、删除数据

        基本语法:delete  键名称 

        flush_all 清空全部的数据

    五、其余的一些命令

        

    六、获取memcache查询的成功率

        memcache查询效率 = get_hits / cmd_get

        

5、经过php来链接memcache服务器

    一、从网上下载memcache php的扩展,该扩展要和php的版本一致。要下载php版本对应的memcache的扩展。

    二、把对应的memcache扩展拷贝到php安装目录的ext下面。

    三、修改php配置文件php.ini打开扩展支持    extension=php_memcache.dll

    四、重启apache,经过运行phpinfo()函数来进行测试。

    五、简单使用,能够存储字符串、整数、小数、对象、数组,其中存储数组时只能是一维数组,存储时以序列化方式存储        

<?php
$mem=new Memcache();
$mem->connect("localhost",11211);
//先完成数据的取出
//若是把取出的data数据给缓存到memcache里面
//取出的数据是由sql语句决定的。键由sql语句字符串,值就是取出的数据
$sql = "select title from dede_archives limit 5";
$key = md5($sql);
echo $key;
//先从memcache里面取出数据
$data = $mem->get($key);//根据键名称从memcache里面取出数据
//判断是否取出数据,若是数据为空,则从数据库里面获取数据。
if(!$data){
    $conn = mysql_connect("localhost",'root','root');
    mysql_query("use itdede");
    //mysql_select_db();
    mysql_query("set names utf8");
    $res = mysql_query($sql,$conn);
    $data = array();
    while($row=mysql_fetch_assoc($res)){
        $data[]=$row;
    }
    //从数据库里面获取的数据,添加到memcache里面。
    $mem->add($key,$data,MEMCACHE_COMPRESSED,100);  
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>新建网页</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" />
<script type="text/javascript"></script>
<style type="text/css"></style>
</head>
    <body>
    <?php foreach($data as $v){?>
    <li><?php echo $v['title']?></li>
    <?php }?>
    </body>
</html>

6、经过使用memcahe客户端源码链接操做memcache服务器

    使用范围:在没有php操做memcache扩展的前提下使用,推荐使用php,memcache的扩展。

    测试前:要关闭扩展。具体的使用步骤:

    一、把源码文件拷贝到项目的指定位置。

    二、引入源码文件

7、把session文件存储到memcache

    方法一:在php.ini文件中配置

        一、设置存储方式:    session.save_handler=memcache

        二、设置存储位置:session.save_path="tcp://localhost:11211,tpc://192.168.1.89:11211"

        session文件存储到memcache是经过sessionid做键的;把session文件存储到memcache后,不影响session的任何操做。

    方法二:直接在文件中设置,其实这样更好,由于不会影响到别人的使用session的方式  

        ini_set("session.save_handler","memcache");

        ini_set("session.save_path","tcp://localhost:11211");

8、memcache的分布式存储

    原理以下图:                                                                    具体代码以下图:

        

    若是只有一台电脑,无需虚拟机也能够模拟两台memcache 服务器。能够经过memcached.exe –p 11210来开启。

    具体代码如图:

9、memcache的细节讨论

    一、生命周期的问题

        ①秒数,可是有限制,不能超过 2592000秒(30天)。

        ②时间戳,好比咱们要设置超过1个月,则以下设置

            $mem->add('name1','yangguang',MEMCACHE_COMPRESSED,time()+3600*24*31);若是设置为0,则表示永不过时。

            存储到memcache里面的数据,什么状况下会丢失:

            (1)生命周期到了(2)关闭memcache服务(3)关机,重启。

    二、memcache中善于存储哪些数据

        ①更新比较频繁的数据(用户的在线状态),查询比较频繁,数据量不是很大。

        ②安全性不是很高。

        若是没有memcache这个产品,能够经过mysql的memory存储引擎。

    三、memcache的安全性

        

        ①内网(两块网卡,memcache在启动时指定那台访问) 

            memcached –d –u root –l 192.168.1.100 –p 11211.指定只有192.168.1.100服务器才能访问。 

        ②防火墙 

            在linux中,设置命令:iptables -a input -p 协议 -s 能够访问ip -dport 端口 -j ACCEPT

            例如: 

                iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT

                iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT

    四、Memcached机制深刻了解

        ①基于c/s架构,协议简单  

        ②基于libevent的事件处理

        ③内置内存存储方式

        ④基于客户端的分布式

Redis

1、基本介绍

    redis是一个开源的,先进的key-value存储。它一般被称为数据结构服务器,由于键能够包含字符串哈希链表集合有序集合

    (1)架构方式:c/s   客户端和服务器

    (2)redis不只能够存储到内存中,并且能够把数据同步到硬盘中,达到数据的存储持久化。

    (3)redis数据存储是键值对,存储的值的类型有五种:string(字符串),hash(哈希),list(链表),set(无序集合),zset(有序集合),这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操做、Redis支持各类不一样方式的排序。

    (4)提供的API语言包括:C C++ C# Clojure Common Lisp Erlang Haskell Java Javascript Lua Objective-C Perl PHP Python Ruby Scala Go Tcl

2、redis的安装

    一、下载安装包

        http://redis.googlecode.com/files/redis-2.4.17.tar.gz

    二、编译程序

        tar zxvf redis-2.4.17.tar.gz

        cd redis-2.4.17

        make

        cd src &&  make install

    三、为了便于管理,新建redis的管理目录

        mkdir -p /usr/local/redis/bin

        mkdir -p /usr/local/redis/etc

    四、把配置文件移动到新建的etc目录下面(配置文件在redis解压目录中)

        mv redis.conf /usr/local/redis/etc

    五、把解压目录下面的src目录下面的一些文件移动到新建的bin目录下

        mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin

    六、启动服务,经过bin目录下面的redis-server

        启动格式:redis-server  指定的配置文件

        /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

    七、启动后会占用当前的会话窗口,咱们应该让他在后台启动,所以要修改配置文件

        打开配置文件/etc/redis.conf,若是须要在后台运行,把daemonize项改成yes

    八、关闭redis的服务从新启动

        pkill redis-server

        

    九、客户端链接

        

3、redis的数据类型

    string(字符串):相似于memcache里面的数据存储方式    key values

    

    hash(哈希):相似于关系型数据库里面的行,也是键值对,值里面又有键值对

    

    list(链表):能够模拟队列和栈。数据存储是有顺序的。

        队列:先进先出。栈:先进后出。

    set(集合) 集合的示意图:

    

    zset(有序集合) 集合里面的内容是有序的

    

4、redis的数据类型相关命令

    一、string类型

        String是最简单的类型,一个 key对应一个Value,String类型是二进制安全的。Redis的 string能够包含任何数据,好比jpg图片或者序列化的对象。

        (1)set设置键值

                语法:set  键名称  值。set name zhangsan,从新设置则直接覆盖

        (2)get获取key对应的string值,若是key不存在返回nil

                语法:get 键值。get name

        (3)setnx设置键时,先判断否存在,若是已经存在则设置不成功,返回0,nx是not exist。

                setnx name zhangsan

        (4)setex设置key对应string类型的value,并指定键的有效期。

                语法:setex 名称 有效期   值。setex color 10 red

        (5)setrange替换字符串中字符。

                语法:setrange 键名称 开始替换序号 替换的内容。setrange email 7 qq.com

        (6)mset一次设置多个key的值,成功返回ok表示全部的值都设置了,失败返回0表示没有任何值被设置

                语法: mset 名称1   值1   名称2    值2        mset name lisi age 18 height 168

        (7)msetnx一次设置多个key,成功返回ok表示全部值都设置了,失败返回0表示没有任何值被设置,不覆盖已存在key

                msetnx name lisi age 18 height 168

        (8)getset设置key的值,并返回key的旧值。

                getset name wangwu

        (9)getrange获取key的value值的范围内的子字符串

                getrange name 0 5

        (10)mget一次获取多个key的值,若是对应key不存在则对应返回nil。

                mget name age height

        (11)incr对key值作加加操做并返回新值。incrby同incr相似,加指定值,key不存在会设置key,并认为原来value是0

                incr age        incrby age 45

        (12)decr对key值作减减操做。decrby同decr相似,减指定值

                decr age        decrby age 45

        (13)append给指定key的字符串追加value,返回新字符串值的长度

                append name is man

        (14)strlen取指定key的value值的长度

                strlen name

    二、hashes类型

        Redis hash是一个string类型的field和value的映射表。它的添加、删除操做都是0(1)(平均)。hash特别适合用于存储对象。相较于将对象的每一个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,而且能够更方便的存取整个对象。

        (1)hset设置hash field为指定值,若是 key不存在,则先建立。

                语法: hset  哈希名称  字段名称   值    hset myhash name xiaowang

        (2)hget取出hash field的值。

                语法:hget 哈希名称  字段名称    hget myhash name

        (3)hsetnx设置hash field为指定值,若是key不存在,则先建立,若是存在则返回0。

                hsetnx myhash name lisi

        (4)hmset同时设置hash的多个field

                语法:hmset 哈希名称  field1  value1 field2 value2    hmset hash2 name yuguo age 77

        (5)hmget获取所有指定的hash field

                语法:hmget 哈希名称 field1 field2    hmset hash2 name age

        (6)hincrby指定的 hash  field加上给定的值

                hincrby hash2 age 20

        (7)hexists测试指定的 field是否存在

                hexists hash2 age

        (8)hlen返回指定hash的field数量

                hlen hash2

        (9)hdel删除指定hash的field

                语法:hdel 哈希名 field    hdel hash2 age

        (10)hkeys返回hash的全部field

                hkeys hash2

        (11)hvals返回hash的全部 value

                hvals hash2

        (12)hgetall获取某个hash中所有的field及value

                hgetall hash2

    三、lists类型及操做

        list是一个链表结构,主要功能是push、pop、获取一个范围的全部值等等,操做中key 理解为链表的名字。redis的list类型其实就是一个每一个子元素都是string 类型的双向链表。咱们能够经过push、pop操做从链表的头部或者尾部添加删除元素,这样list既能够做为栈,又能够做为队列。

        (1)lpush在key对应list的头部添加字符串元素。

                语法:lpush 链表名称  值内容

        (2)lrange获取链表里面的值

                语法:lrange 链表名称  0 -1,注意0 和 -1 表示取值范围,从头部到尾部。

                

        (3)rpush在key对应list的尾部添加字符串元素。

                语法:rpush 链表名称  值内容

                

        (4)linsert在key对应list的特定位置前或后添加字符串

                

        (5)lset设置list中指定下标的元素值。注:下标从0开始计算

                

        (6)lrem从key对应list中删除n个和value相同的元素。(n<0从尾删除,n=0所有删除)

                

        (7)ltrim保留指定key的值范围内的数据

                

        (8)lpop从list的头部删除元素,并返回删除元素

                

        (9)rpop从 list的尾部删除元素,并返回删除元素

                

        (10)rpoplpush从第一个list的尾部移除元素并添加到第二个list的头部

                

        (11)lindex返回名称为key的list中 index位置的元素

                

        (12)llen返回key对应list的长度

                

    四、sets类型及操做

        set是集合,它是string类型的无序集合。set是经过hash table实现的、添加、删除和查找的复杂度都是0(1)。对集合咱们能够取并集、交集、差集。经过这些操做咱们能够实现sns中的好友推荐和blog的tag功能。

        (1)sadd向名称为key 的set中添加元素

                语法:sadd 集合名   元素

        (2)smembers 获取集合中内容,语法:smembers 集合名称

                

        (3)srem删除名称为key的set中的元素

                

        (4)spop随机返回并删除名称为key的set中一个元素

                

        (5)sdiff返回全部给定key与第一个key的差集

                

        (6)sdiffstore返回全部给定key与第一个key的差集,并将结果存为另外一个key。

                语法:sdiffstore 新的集合  集合1   集合2

                

        (7)sinter返回全部给定key的交集

                

        (8)sinterstore返回全部给定key的交集,并将结果存为另外一个key

                

        (9)sunion返回全部给定key的并集

                

        (10)sunionstore返回全部给定key的并集

                

        (11)smove从第一个key对应的set中移除member并添加到第二个对应的set中

                

        (12)scard返回名称为key的set的元素个数

                

        (13)sismember测试member是不是名称为 key的set的元素

                

        (14)srandmember随机返回名称为key的set的一个元素,但不删除元素

                

    五、sorted sets类型及操做

        sorted set是set的一个升级版本,他在set的基础上增长了一个顺序属性,这一属性在添加修改元素的时候能够指定,每次指定后,zset会自动从新按新的值调整顺序。能够理解为有两列的mysql表,一列存value,一列存顺序。操做中的key理解为zset的名字。

        (1)zadd向名称为key的zset中添加元素。若是该元素存在,则更新其顺序。

                语法:zadd 集合名  序号  内容

                

        (2)zrange获取有序集合中的内容

                

        (3)zrem删除名称为key的zset中的元素member

                

        (4)zincrby若是在名称为key的zset中已存在元素member,则该元素的score增长increment不然向该集合中添加该元素,其score的值为increment

                

        (5)zrank返回名称为key的zset中member元素的排名(按score从小到大排序)即下标

                

        (6)zrevrank返回名称为key的zset中member元素的排名(按score从大到小排序)即下标

                

        (7)zrevrange返回名称为key的zset(按score从大到小顺序)中的index从start到end的全部元素

                

        (8)zrangebyscore返回集合中score在给定区间的元素

                

        (9)zcount返回集合中score在给定区间的数量

                

        (10)zcard返回集合中元素的个数

                

        (11)zremrangebyrank删除集合中排名在给定区间的元素

                

        (12)zremrangebyscore删除集合中score在给定区间的元素

                

5、redis经常使用命令

    redis提供了丰富的命令对数据库和各类数据库类型进行操做,这些命令能够在linux终端使用。

    一、键值相关的命令

        (1)keys返回知足给定参数的全部key。用表达式*,表明取出全部的key

                

        (2)exists确认一个key是否存在

                

        (3)expire设置一个key的过时时间

                

        (4)move将当前数据库中的key转移到其它数据库中

                

        (5)persist移除给定key的过时时间

                

        (6)randomkey随机返回key空间的一个key

                

        (7)rename重命名key

                

        (8)type:返回值的类型

                

    二、服务器相关命令

        (1)select选择数据库。redis数据库编号从0-15,咱们能够选择任一个进行数据的存取,若不在编号内会报错

                

        (2)quit退出链接

                

        (3)dbsize返回当前数据库中key的数目

                

        (4)info获取服务器的信息和统计

                

        (5)config get获取参数的配置。

                本例中咱们获取了dir这个参数配置的值,若是想获取所有参数的配置只须要执行”config get *”便可将所有的值都显示出来

                

        (6)flushdb删除当前选择数据库中的全部key

                

        (7)flushall删除全部数据库中的全部的 key

                

6、redis的安全性

    设置客户端链接后进行任何其余操做前须要使用密码。注意:由于 redis速度至关快,因此在一台比较好的服务器下,一个外部的用户能够在一秒钟进行150k次的密码尝试,这意味着你须要指定很是很是强大的密码来防止暴力破解。

    一、设置密码的方式,打开redis的配置文件

        #requirepass 设置的密码        设置完密码后,redis服务要重启

        好比:requirepass guangzhou

    二、设置完成密码后,客户端登陆方式

        第一种方式:登陆后,执行auth 设置的密码  后才能操做,不然不能任何操做

        

        第二种方式:在登陆时,输入密码    /usr/local/redis/bin/redis-cli  –a  设置的密码

        

7、持久化机制

    redis是一个支持持久化的内存数据库,也就是说redis须要常常将内存中的数据同步到硬盘来保证持久化。

    redis支持两种持久化方式:

    一、snapshotting(快照)默认方式

        快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。能够经过配置设置自动作快照持久化的方式。咱们能够配置redis在n秒内若是超过mkey修改就自动作快照。

        

        快照方式的缺点:因为快照方式是在必定间隔作一次的,因此若是redis意外down掉的话,就会丢失最后一次快照后的全部修改。

    二、append-only file( 缩写aof)的方式

        aof比快照方式有更好的持久化性,是因为在使用aof时,redis会将每个收到的写命令都经过write函数追加到文件中,当redis重启时会经过从新执行文件中保存的写命令来在内存中重建整个数据库的内容。

        固然因为os会在内核中缓存write作的修改,因此可能不是当即写到磁盘上。这样aof方式的持久化也仍是有可能会丢失部分修改。能够经过配置文件告诉reids咱们想要经过fsync函数强制os写入到磁盘的时机。

        

8、redis配置文件经常使用的项

    daemonize若是须要在后台运行,把该项改成yes            pidfile:配置多个pid的地址 默认在/var/run/redis.pid

    bind:绑定ip,设置后只接受来自该ip的请求                     port:监听端口,默认为6379

    timeout:设置客户端链接时的超时时间,单位为秒。      logfile:配置log文件的地址。

    databases:设置数据库的个数,默认使用的数据库为0    sava:设置redis进行数据库镜像的频率。

    rdbcompression:在进行镜像备份时,是否进行压缩。     Dbfilename:镜像备份文件的文件名。

    Dir:数据库镜像备份的文件放置路径。                              Slaveof:设置数据库为其余数据库的从数据库。

    Masterauth:主数据库链接须要的密码验证。                 Requirepass:设置登陆时须要使用的密码。

    Maxclients:限制同时链接的客户数量                               Maxmemory:设置redis可以使用的最大内存。

    Appendonly:开启append only模式。

9、php支持redis

    一、下载扩展,在下载扩展时要注意,和php的版本要兼容

    二、把对应的扩展拷贝到,php的安装目录ext目录下面

            

    三、打开php.ini文件,引入扩展

            

    四、重启apache进行测试,写一个文件,运行phpinfo()函数测试

            

    五、基本使用

            

相关文章
相关标签/搜索