©
                    本文档使用
                    php中文网手册 发布
                
Note: 版本需求、依赖性和状态
可以从 concepts section 获取更多的内容。
数据库群组可以设定不同的一致性级别。从 1.2.0 版本,我们建议插件仅仅从群组节点选择上 考虑使用的一致性级别。例如,如果使用异步的 MySQL 主从同步,他采用群组的最终一致性, 建议在任何时间通过 mysqlnd_ms_set_quos() 使用 Session 一致性。 这可以参考 服务级别与一致性
Example #1 Recap: quality of service to request read your writes
 
if (!mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_SESSION))
  die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));  假设插件使用最终一致性服务级别,而不采用其他更高要求的一致性策略。那么插件可能使用 通过 TTL 失效策略控制的缓存来替代从数据库节点读取数据。数据库节点和缓存都采用 最终一致性策略,他们可能保存的不是最新的数据。
通过本地缓存替代数据库操作,可以有效的提升性能,降低数据库压力。 如果其他客户端比创建这个缓存条目的客户端更频繁使用他,那么数据库的访问就被降低下来, 从而降低数据库压力。并且,由于本地缓存的速度快于数据库查询,那么整体计算性能就被提升。
Example #2 Plugin config: no special entries for caching
{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "127.0.0.1",
                "port": "3306"
            }
        },
    }
} 
Example #3 Caching a slave request
  <?php
$mysqli  = new  mysqli ( "myapp" ,  "username" ,  "password" ,  "database" );
if (! $mysqli )
   
   die( sprintf ( "[%d] %s\n" ,  mysqli_connect_errno (),  mysqli_connect_error ()));
if (! $mysqli -> query ( "DROP TABLE IF EXISTS test" ) ||
    ! $mysqli -> query ( "CREATE TABLE test(id INT)" ) ||
    ! $mysqli -> query ( "INSERT INTO test(id) VALUES (1)" ))
  die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
 
 if ( false  ==  mysqlnd_ms_set_qos ( $mysqli ,  MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL ,  MYSQLND_MS_QOS_OPTION_CACHE ,  60 )) {
    die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
}
 
 $attempts  =  0 ;
do {
   
   if ( $res  =  $mysqli -> query ( "SELECT id FROM test" )) {
    break;
  } else if ( $mysqli -> errno ) {
    die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
  }
   
   usleep ( 200000 );
} while ( $attempts ++ <  10 );
 
 assert ( $res );
 var_dump ( $res -> fetch_assoc ());
 
 $res  =  $mysqli -> query ( "SELECT id FROM test" );
 ?>   上面的范例说明如何使用缓存功能。通过 mysqlnd_ms_set_qos() 设定最终一致性服务器级别,并且允许使用缓存。然后任何只读的操作都会被放入 缓存中,存活时间通过 mysqlnd_ms_set_qos() 指定。
实际的 TTL 要比通过 mysqlnd_ms_set_qos() 设定的要小,设定值 是他的最大值。插件会在 TTL 上扣除 slave 同步延迟,用于计算实际的 TTL。在范例中, 如果 slave 的同步延迟是 10 秒,TTL 的最大值是 60 秒,那么计算的 TTL 值是 50 秒。 TTL 的计算,对于每一个缓存条目是独立的。
Example #4 Read your writes and caching combined
  <?php
$mysqli  = new  mysqli ( "myapp" ,  "username" ,  "password" ,  "database" );
if (! $mysqli )
   
   die( sprintf ( "[%d] %s\n" ,  mysqli_connect_errno (),  mysqli_connect_error ()));
if (! $mysqli -> query ( "DROP TABLE IF EXISTS test" ) ||
    ! $mysqli -> query ( "CREATE TABLE test(id INT)" ) ||
    ! $mysqli -> query ( "INSERT INTO test(id) VALUES (1)" ))
  die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
 
 if ( false  ==  mysqlnd_ms_set_qos ( $mysqli ,  MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL ,  MYSQLND_MS_QOS_OPTION_CACHE ,  60 )) {
    die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
}
 
 $attempts  =  0 ;
do {
   
   if ( $res  =  $mysqli -> query ( "SELECT id FROM test" )) {
    break;
  } else if ( $mysqli -> errno ) {
    die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
  }
   
   usleep ( 200000 );
} while ( $attempts ++ <  10 );
 assert ( $res );
 
 var_dump ( $res -> fetch_assoc ());
 
 if (!( $res  =  $mysqli -> query ( "SELECT id FROM test" )))
 die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
 var_dump ( $res -> fetch_assoc ());
 
 if (! $mysqli -> query ( "UPDATE test SET id = 2" ))
 die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
 
 if ( false  ==  mysqlnd_ms_set_qos ( $mysqli ,  MYSQLND_MS_QOS_CONSISTENCY_SESSION )) {
    die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
}
 
 if (!( $res  =  $mysqli -> query ( "SELECT id FROM test" )))
 die( sprintf ( "[%d] %s\n" ,  $mysqli -> errno ,  $mysqli -> error ));
 var_dump ( $res -> fetch_assoc ());
 ?>   服务设定可以随时改变,用于屏蔽缓存的使用。如果需要,你可以变更为 Session 一致性策略, 这时缓存将不会被使用,并且被更新为最新的数据结果。