<?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;
}
原子缓存
最新推荐文章于 2024-12-05 16:19:16 发布