- <?php
- # 原子缓存
- header( 'content-type:text/html;charset=utf-8' );
- $mysql_obj = new mysqli(
- '127.0.0.1',
- 'root',
- '',
- 'yii_shop'
- );
- $mysql_obj -> query( 'set names utf8' );
- $redis_obj = new Redis();
- $redis_obj -> connect( '127.0.0.1' , '6379' );
- $redis_obj -> auth('likang');
- #
- $p = empty($_GET['p'] ) ? 1 : $_GET['p'];
- $name = empty($_GET['name'] ) ? '' : $_GET['name'];
- if( $name ){
- $where_str = ' where phone = "'. $_GET['name'] . '"';
- }else{
- $where_str = '';
- }
- $key = 'user_list_'.$where_str . '_' . $p;
- echo $key , '<hr/>';
- $key = md5( $key );
- if( false === $redis_list = unserialize($redis_obj -> get( $key ) ) ){
- $limit = ( $p - 1 ) * 5;
- $sql = 'select account_id from shop_account ' . ' order by account_id limit ' . $limit . ',5' ;
- echo $sql;
- $user_list = $mysql_obj -> query( $sql ) -> fetch_all( MYSQLI_ASSOC );
- if( !empty( $user_list ) ){
- echo '取到数据,设置缓存<hr/>';
- # 设置缓存,并且设置有效期 15-20分钟
- $redis_obj -> set( $key , serialize($user_list) , rand( 900, 1200 ) );
- }else{
- echo '数据库不存在数据,设置NULL<hr/>';
- # 为了解决缓存穿透的问题,把查询不到的数据缓存一个NULl
- # 随机生成一个缓存时间 , 防止统一时间失效的key太多 导致缓存服务器压力过大
- $redis_obj -> set( $key , NULL , rand(20,30) );
- }
- }else{
- echo '从redis读取的数据<hr/>';
- // var_dump( $redis_list );
- # 用户的详情缓存 user_detail_1
- foreach( $redis_list as $key => $v ){
- $redis_key = 'user_detail_' .$v['account_id'];
- $result = $redis_obj -> get( $redis_key);
- if( $result === false ){
- $one_sql = 'select * from shop_account where account_id= ' . $v['account_id'] ;
- $data_result = $mysql_obj -> query( $one_sql ) ->fetch_assoc();
- $redis_obj -> set( $redis_key , serialize($data_result) );
- }else{
- $data_result = unserialize($result);
- }
- $all[] = $data_result;
- }
- var_dump($all);exit;
- }