2018-01-26 16:17:50 living_ren 阅读数 2637
  • Redis数据

    Redis是现在流行的缓存数据库,利用Redis可以实现10W/秒的数据操作,利用Redis可以解决高并发的数据访问问题,同时Redis又可以与许多的集群架构进行整合处理。

    4373 人正在学习 去看看 李兴华

1.php操作string类型所使用的常用方法:

set : 赋值
get : 获取值
decr: 减值
incr: 增值

这里写图片描述
下图输出结果为:
这里写图片描述
2.php操作list类型所使用的常用方法:

lpush:从左边插入
rpush:从右边插入
lpop:从左边弹出
rpop:从右边弹出

这里写图片描述
运行结果为:
这里写图片描述
3.php操作set类型所使用的常用方法:

sadd:添加
scard:统计元素个数
smembers:以数组形式统计元素个数

这里写图片描述
运行结果为:
这里写图片描述
4.php操作hash类型所使用的常用方法:

hset:给属性赋值
hget:获取单个属性的值
hmget:获取多个属性的值

这里写图片描述
这里写图片描述
5.php操作sort-set数据类型所使用的常用方法:

zadd:给某个score添加值
zrange:从低到高查询
zrevrange:从高到低查询

这里写图片描述
这里写图片描述

2017-04-30 23:11:03 abc1991234 阅读数 2284
  • Redis数据

    Redis是现在流行的缓存数据库,利用Redis可以实现10W/秒的数据操作,利用Redis可以解决高并发的数据访问问题,同时Redis又可以与许多的集群架构进行整合处理。

    4373 人正在学习 去看看 李兴华

PHP 操作 Redis

  • Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
  • Redis 将数据库完全保存在内存中,仅使用磁盘进行持久化。所以可以实现非常高的读写操作;
  • Redis 跟其他键值存储的数据相比,具有丰富的数据类型。
  • Redis 可以将数据复制到任意的从机中。
  • 在一些需要大容量数据集的应用,Redis也并不适合,因为它的数据集不会超过系统可用的内存。所以如果你有大数据应用,而且主要是读取访问模式,那么Redis并不是正确的选择。

PHP 操作 Redis 基本步骤如下:
1. 实例化 Redis 对象 $redis = new Redis();
2. 连接 Redis 服务器 $redis->connect('127.0.0.1', 6379);
3. 设置 Redis 模式;
4. 进行基本的操作;

//创建redis实例
$redis = new Redis();
//连接redis实例,有以下几种方式
$redis->connect('127.0.0.1', 6379);
$redis->connect('127.0.0.1'); // port 6379 by default
$redis->connect('127.0.0.1', 6379, 2.5); // 2.5 sec timeout.
$redis->connect('/tmp/redis.sock'); // unix domain socket.
$redis->connect('127.0.0.1', 6379, 1, NULL, 100); // 1 sec timeout, 100ms delay between reconnection attempts.
//如果设置密码,则使用以下方法进行密码认证
$redis->auth('foobared');

返回类型

Redis::REDIS_STRING - String
Redis::REDIS_SET - Set
Redis::REDIS_LIST - List
Redis::REDIS_ZSET - Sorted set
Redis::REDIS_HASH - Hash
Redis::REDIS_NOT_FOUND - Not found / other

string 操作

Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,除了一般的set,get之外还有以下功能:
- 获取字符串长度
- 往字符串append内容
- 设置和获取字符串的某一段内容
- 设置及获取字符串的某一位(bit)
- 批量设置一系列字符串的内容

string 操作用到的命令有:
getSet append getRange setRange strlen getBit/setBit incr, incrBy decr, decrBy get set setex setnx delete mset mget

使用场景

  1. 计数

Example-1

<?php
 $redis= new Redis();
 $redis->connect('127.0.0.1',6379);
 $redis->set('key','string value');
 $redis->set('test','123');
 $result = $redis->getMultiple(['key','test']);
 echo "<pre>";
 var_dump($redis->incr('test'));
 var_dump($redis->decr('test'));
 print_r($result);

list 操作

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

list 操作用到的命令有(以l开头):
lPush/rPush lPushx/rPushx lPop/rPop blPop/brPop lSize lIndex, lGet lSet lRange, lGetRange lTrim, listTrim lRem, lRemove lInsert rpoplpush

使用场景

  1. 显示最新的项目列表
  2. 删除与过滤

Example-2

<?php
 $redis= new Redis();
 $redis->connect('127.0.0.1',6379);
 $redis->delete('test');
 $redis->lpush('test','111');
 $redis->lpush('test','222');
 $redis->rpush('test','333');
 $redis->rpush('test','444');
 var_dump($redis->lpop('test')); //string(3) "222"
 var_dump($redis->rpop('test')); //string(3) "444"
 var_dump($redis->lsize('test')); //int(2)
 var_dump($redis->lset('test',1,'555')); //bool(true) "555"
 var_dump($redis->lget('test',1)); //string(3)
 var_dump($redis->lgetRange('test',0,-1));

set 操作

Set 集合的概念就是一堆不重复值的组合
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis 还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能。

set 操作用到的命令有(以s开头):
sAdd sRem, sRemove sMove sIsMember, sContains sCard, sSize sPop sRandMember sInter sInterStore sUnion sUnionStore sDiff sDiffStore sMembers, sGetMembers

使用场景

  1. 特定时间内的特定项目
  2. 删除与过滤

Example-3

<?php
 $redis= new Redis();
 $redis->connect('127.0.0.1',6379);
 $redis->delete('test');
 $redis->delete('test1');
 $redis->sadd('test',111);
 $redis->sadd('test',333);
 $redis->sadd('test',222);
 $redis->sadd('test1',444);
 $redis->sadd('test1',555);
 $redis->sremove('test',111);
 $redis->smove('test','test1',333);
 echo "<pre>";
 var_dump($redis->sort('test1'));
 var_dump($redis->scontains('test1',555)); //检查集合中是否存在指定的值
 echo $redis->ssize('test1'); //返回集合中存储值的数量
 var_dump($redis->sinter('test','test1')); //返回一个所有指定键的交集。
 var_dump($redis->sdiffstore('new','test','test1')); //执行sdiff命令并把结果储存到新建的变量中。
 print_r($redis->smembers('new')); //返回集合的内容

zset (sorted set)操作

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构。

zset 操作用到的命令有(以z开头):
zAdd zDelete, zRem zRange zRevRange zRangeByScore, zRevRangeByScore zCount zRemRangeByScore, zDeleteRangeByScore zSize, zCard zScore zRank, zRevRank zIncrBy zUnion/zInter

使用场景

  1. 排行榜相关
  2. 按照用户投票和时间排序
  3. 处理过期项目
  4. 社交关系

Example-4

<?php
 $redis= new Redis();
 $redis->connect('127.0.0.1',6379);
 $redis->zadd('zset',1,'b'); //向有序集合key中添加元素value,score用于排序。
 $redis->zadd('zset',0,'a');
 $redis->zadd('zset',2,'c');
 $redis->zAdd('zset', 4, 'R');
 $redis->zAdd('zset', 5, 'd');
 $redis->zdelete('zset','c'); // 删除有序集合key中的元素value
 print_r($redis->zrange('zset',0,-1)); // 返回有序集合key中的index从start到end的所有元素【升序】
 print_r($redis->zcount('zset',0,3)); // 返回有序集合key中,index从start到end间的【包括start和end】所有元素的个数。
 $redis->zIncrBy('zset', 2, 'R'); // 将有序集合key中的元素value的score增加increment,不存在则创建
 print_r($redis->zScore('zset','R')); // 返回有序集合key中元素value的score

hash 操作

Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。
Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现:
- 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap;
- 当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

hash 操作用到的命令有(以h开头):
hSet hGet hLen hDel hKeys hVals hGetAll hIncrBy hExists hMset hMget

使用场景

  1. 消息通知

Example-5

<?php
 $redis= new Redis();
 $redis->connect('127.0.0.1',6379);
 $redis->hset('hash','lang1','php'); // 向哈希表hash中添加key为key,值为value的元素。
 $redis->hset('hash','lang2','mysql');
 $redis->hset('hash','lang3','mysql2');
 $redis->hset('hash','lang4','1');
 echo $redis->hget('hash','lang1');
 echo $redis->hlen('hash'); // 返回哈希表hash中元素的个数
 $redis->hdel('hash','lang3');
 print_r($redis->hvals('hash')); // 返回哈希表hash中所有的value
 print_r($redis->hgetall('hash')); // 返回哈希表hash中所有的元素
 var_dump( $redis->hExists('hash', 'lang1') ); // 检测哈希表hash中是否有元素key
 var_dump($redis->hincrby('hash','lang4',3)); // 哈希表hash中元素key的value加number
 $redis->hMSet('hash',['lang5'=>'java','lang6'=>'c']); // 批量向哈希表hash中添加元素。
 var_dump($redis->hMget('hash',['lang1','lang2'])); // 量获取哈希表hash中的元素。

Redis 操作

  • 事务模式: multi, exec, discard 分别是开启事务,执行事务,取消事务
  • 清除数据库
    a. 清除当前数据库 flushDB
    b. 清除所有数据库 flushAll

  • 随机返回key randomKey

  • 选择一个数据库 select
  • 转移一个 key 到另一个数据库 move
  • 查看数据库有多少key dbSize
  • 使用 AOF 进行数据持久化 bgrewriteaof
  • 选择从服务器 saveof
  • 数据保存到磁盘
    a. 同步保存到磁盘 save
    b. 异步保存到磁盘 bgsave

  • 返回 Redis 的版本信息 info

友情链接

2017-03-07 13:00:56 baochao95 阅读数 8044
  • Redis数据

    Redis是现在流行的缓存数据库,利用Redis可以实现10W/秒的数据操作,利用Redis可以解决高并发的数据访问问题,同时Redis又可以与许多的集群架构进行整合处理。

    4373 人正在学习 去看看 李兴华

场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况

这个场景可以使用redis+mysql冷热数据交换来解决。

何为冷热数据交换?

冷数据:之前使用的数据,热数据:当前使用的数据。
交换:将Redis中的数据周期的存储到MySQL中

业务流程

用户进行投票后,首先将投票数据保存到Redis中,这些数据就是热数据,然后定期(如5s)将热数据保存到MySQL中,这些数据就变为冷数据,然后将冷数据从Redis中删除,周而复始,知道一个小时投票结束。

项目结构图

这里写图片描述

index.html文件

这是投票的首页,有3个投票按钮,模拟给3个用户投票,点击按钮,使用ajax调用vote.php文件

<!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" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<body>
    <p><span id="uid1">0</span><input type="button" value="用户1" onclick="vote(1);" /></p>
    <p><span id="uid2">0</span><input type="button" value="用户2" onclick="vote(2);" /></p>
    <p><span id="uid3">0</span><input type="button" value="用户3" onclick="vote(3);" /></p>
</body>
<script>
    function vote(i){
        $.get('vote.php?uid='+i,function(rs){
            var span = '#uid'+i;
            $(span).html(rs);
        });
    }
</script>
</html>

vote.php

这个文件主要实现投票的逻辑。首先连接上Redis服务器,然后保存投票人id,然后将投票人id为key记录每个用户的票数,然后返回给index.html文件,最后使用global_voteid作为key记录总票数,也可以作为MySQL的自增长的键。然后记录uid,ip,time等数据。

注意格式有一定的要求:

假如voteid为3,记录的是ip,那么键为vote:3:ip:127.0.0.1

<?php
$redis = new Redis();
$redis->connect('localhost',6379);
//计算每个用户的总票数
$uid = intval($_GET['uid']);
//$uid = mt_rand(1,3);//随机指定投票人员,方便进行压力测试
echo $redis->incr($uid);

$voteid = $redis->incr('global_voteid');
$redis->set('vote:'.$voteid.':uid',$uid);
$ip = $_SERVER['REMOTE_ADDR'];
$redis->set('vote:'.$voteid.':ip',$ip);
$redis->set('vote:'.$voteid.':time',time());                                      

重点内容

这个文件主要实现冷热数据交换,首先连接MySQL数据库和redis服务器,然后每隔5秒去执行while循环,在while循环里获取自增长的投票主键和最近一次插入mysql的投票主键(位置)。判断插入的位置是否存在,如果不存在就从头插入,如果全部插入完毕,就进行等待,如果没有插入完毕,就进行插入操作。

<?php
//连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test','root','1234');
$pdo->query('set names utf8');

//连接redis
$redis = new Redis();
$redis->connect('localhost',6379);

//永真循环
while(true){
    $vid = $redis->get('global_voteid');//自增长的主键
    $last = $redis->get('last');//最近一次插入mysql的投票主键
    //如果没有插入数据库,刚开始的肯定为true
    if(!$last){
        $last = 0;//设置为0
    }
    //如果所有的数据都被插入到MySQL中
    if($vid == $last){
        echo "wait\n";//输出等待
    }else{
        //进行插入到数据库操作
        $sql = 'insert into vote(vid,uid,ip,time) values';
        for($i = $vid;$i>$last;$i--){
            $k1 = 'vote:'.$i.':uid';
            $k2 = 'vote:'.$i.':ip';
            $k3 = 'vote:'.$i.':time';
            $row = $redis->mget([$k1,$k2,$k3]);
            $sql.="($i,$row[0],'$row[1]',$row[2]),";
                        $redis->delete($k1,$k2,$k3);
        }
        $sql = substr($sql,0,-1);
        $pdo->exec($sql);
        $redis->set('last',$vid);//设置插入的主键位置
        echo 'OK';
    }
    sleep(5);//每隔5秒执行循环
}

vote表

这里写图片描述

运行步骤:

1、使用php命令行工具调用swap.php

这里写图片描述

2、使用Apache的ab工具进行压力测试。

这里写图片描述

2018-01-04 11:28:58 menghuanzhiming 阅读数 2936
  • Redis数据

    Redis是现在流行的缓存数据库,利用Redis可以实现10W/秒的数据操作,利用Redis可以解决高并发的数据访问问题,同时Redis又可以与许多的集群架构进行整合处理。

    4373 人正在学习 去看看 李兴华

转载:深入理解Redis:底层数据结构–http://blog.csdn.net/hanhuili/article/details/17710781

简介

redis[1]是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。通常我们并不需要理解其底层数据结构,但如果能了解一下相关知识将会有助于我们更有效地使用Redis,并能够将这些知识应用到我们的工作中。
Redis内部实现如下数据结构[2,3,4,10]:
1 String
2 Hash Table
3 Doubly Linked List
4 Skip List
5 Zip List
6 Int Sets
7 Zip Maps (从2.6版本开始废弃)

Hash table[5]:
在Redis中,所有key-value对都存储在一个hash table中。这个Hash table是一个二维结构。其包括一个一维固定长度的数组,每个槽位上保存一个dictEntry对象。key计算hash值后按照这个定长数组求模,结果相同的key-balue通过链表保存在同一个槽位上,这样便形成了一个二维结构。需要说明的是,hash table中这个固定长度的数组能够根据key-value数量动态调整大小,细节说明请参看引用[5],这里不做更多说明。

这里再看一下dictEntry的定义,主要关注其中的联合体v的val成员:

struct dictEntry {  
    void *key;  
    union {  
        void *val;  
        uint64_t u64;  
        int64_t s64;  
    } v;  
    struct dictEntry *next;  
} dictEntry;

val是一个类型为robj的数据结构,其中的type标示了当前的value的数据类型(即string、list、set、zset或者hash),encoding标示了当前value存储方式(即ziplist,String,hash table或者double linked list等)

struct redisObject {  
    unsigned type:4;  
    unsigned notused:2;     /* Not used */  
    unsigned encoding:4;  
    unsigned lru:22;        /* lru time (relative to server.lruclock) */  
    int refcount;  
    void *ptr;  
} robj;

encoding目前支持的范围如下所示,具体可参考[1]源代码实现,其中的zipmap由于表示范围的限制已经在2.6版本中废弃,相关说明参见[6]

#define REDIS_ENCODING_RAW 0        /* Raw representation */  
#define REDIS_ENCODING_INT 1        /* Encoded as integer */  
#define REDIS_ENCODING_HT 2         /* Encoded as hash table */  
#define REDIS_ENCODING_ZIPMAP 3     /* Encoded as zipmap */  
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */  
#define REDIS_ENCODING_ZIPLIST 5    /* Encoded as ziplist */  
#define REDIS_ENCODING_INTSET 6     /* Encoded as intset */  
#define REDIS_ENCODING_SKIPLIST 7   /* Encoded as skiplist */ 

五种数据类型的内部实现

Redis在收到客户端的请求后,为每一个参数创建一个robj对象,type定义为REDIS_STRING,encoding为REDIS_ENCODING_RAW。接下来Redis根据第一个robj对象(也就是命令名)查找对应的函数,并调用查找到的函数,命令执行过程可参考[7]。

String

如果一个String类型的value能够保存为整数,则将对应robj对象的encoding修改为REDIS_ENCODING_INT,将对应robj对象的ptr值改为对应的数值。如果不能转为整数,保持原有encoding为REDIS_ENCODING_RAW。
因此String类型的数据可能使用原始的字符串存储(实际为sds - Simple Dynamic Strings[9],对应encoding为REDIS_ENCODING_RAW)或者整数存储。
具体查看某一个key的encoding,参考Redis命令object[8]

下面是具体的例子:
redis 127.0.0.1:6379> set hello 1
OK
redis 127.0.0.1:6379> OBJECT ENCODING hello
“int”
redis 127.0.0.1:6379> set hello world
OK
redis 127.0.0.1:6379> OBJECT ENCODING hello
“raw”

List

List类型的key创建时使用zip list结构存储,robj对象的encoding字段设置为REDIS_ENCODING_ZIPLIST。zip list实现细节可参考[3]。概况来讲,zip list通过一个连续的内存块实现list结构,其中的每个entry节点头部保存前后节点长度信息,实现双向链表功能。这个头部可根据前后entry长度进行内存压缩,而如果直接使用指针的话则至少需要两个指针,对64位系统来说将占用16个字节,使用zip list时最好情况下只需要两个字节,这在具有大量list类型的key-value对且各个value较小的应用来说,可以节省大量内存。
当list的elem数小于配置值: hash-max-ziplist-entries 或者elem_value字符串的长度小于 hash-max-ziplist-value, 可以编码成 REDIS_ENCODING_ZIPLIST 类型存储,以节约内存;但由于在zip list添加和删除元素会涉及到数据移动,因此当list内容较多时,转而使用双向链表。双向链表的实现可参考数据结构相关教科书。
相关内存优化说明请参考[11]。

Hash

新建的Hash类型也使用ziplist存储value,保存数据过多时,转而使用hast table。

Set

创建Set类型的key-value时,如果value能够表示为整数,则使用intset类型保存value。intset使用和ziplist相似的实现方式保存整数[4]。数据量大时,切换为使用hash table保存各个value。

Zset

zset指排序的set,如果新建的zset包含value数大于配置或者value长度大于配置值[11],则直接使用hash table和skip list[12]存储value,skip list实现对value的排序;否则直接使用skip list存储value。Redis可以保存相同score的value值,其实现可参考源代码[1]以及文献[12],Redis是参考[12]中伪代码实现的。

本文只对Redis底层数据结构实现进行了简单归并汇总,各部分实现细节请参考引用链接即Redis源代码。本文内容基于Redis 2.6版本。

引用

[1] http://redis.io/
[2] http://stackoverflow.com/questions/9625246/what-are-the-underlying-data-structures-used-for-redis
[3] 《Redis ziplist内部结构分析》, http://www.searchdatabase.com.cn/showcontent_60781.htm
[4] 《解读Redis中ziplist、zipmap、intset实现细节》, http://www.wzxue.com/%E8%A7%A3%E8%AF%BBredis%E4%B8%ADziplist%E5%AE%9E%E7%8E%B0%E7%BB%86%E8%8A%82/
[5] 《redis源代码分析 – hash table》,http://www.kuqin.com/database/20110904/264306.html
[6] zipmap zmlen is too short, https://github.com/antirez/redis/issues/188
[7] 《深入理解Redis:命令处理流程 》, http://blog.csdn.net/hanhuili/article/details/17339005
[8] http://redis.io/commands/object
[9] 《Redis sds数据结构实现分析》,http://www.searchdatabase.com.cn/showcontent_64553.htm
[10] 《Redis内存存储结构分析》,http://www.searchtb.com/2011/05/redis-storage.html
[11] http://redis.io/topics/memory-optimization
[12] http://homepage.divms.uiowa.edu/~ghosh/skip.pdf

2017-09-08 13:01:34 fjnjxr 阅读数 275
  • Redis数据

    Redis是现在流行的缓存数据库,利用Redis可以实现10W/秒的数据操作,利用Redis可以解决高并发的数据访问问题,同时Redis又可以与许多的集群架构进行整合处理。

    4373 人正在学习 去看看 李兴华

1、 Redis简介 
redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。 
2、 互联网时代背景下大机遇,什么要使用Nosql? 
1) 当数据量的总大小一个机器放不下时。 
2) 数据索引一个机器的内存放不下时。 
3) 访问量(读写混合)一个实例放不下时。

单机时代模型 
这里写图片描述
如果每次存储成千上万条数据,这样很会导致MySQL的性能很差,存储以及读取速度很慢,然后就演变成缓存+mysql+垂直拆分的方式。 
这里写图片描述
Cache作为中间缓存 
将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。 
但是当数据再次增加到又一个量级,上面的方式也不能满足需求,由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。 
这里写图片描述
主从分离模式 
在redis的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。 
这里写图片描述
分表分库模式 
将变化小的、业务相关的放在一个数据库,变化多的,不相关的数据放在一个数据库。 
3、 nosql数据库的优势 
1)易扩展 
这些类型的数据存储不需要固定的模式,无需多余的操作就可以进行横向的扩展。相对于关系型数据库可以减少表和字段特别多的情况。也无型之间在架构的层面上带来了可扩展的能力 
2)大数据量提高性能 
3)多样灵活的数据模型 
在nosql中不仅可以存储String,hash,set、Zset等数据类型,还可以保存javaBean以及多种复杂的数据类型。 
4、 NoSql的应用 
1) 大数据时代淘宝、微信、以及微博等都广泛的使用了redis数据库,将一些固定不变的数据例如学校,区域等固定的信息保存在关系型数据库中。然后对于经常变化的数据例如淘宝每个节日都会有比较热门的搜索显示在搜索框,当节日过去关键字自动删除,为了便于管理,可以将这些数据保存在redis数据库中,并设置过期时间,到达时间就自动删除。 
2)为了缓解数据库压力,微博首先将发送的微博保存到redis数据库,自己可以立即查看到,然后将内存中的数据同步到关系型数据库。

php_redis 扩展

阅读数 125

没有更多推荐了,返回首页