原子缓存

本文介绍了一个使用PHP实现的原子缓存应用实例,通过结合MySQL和Redis来提高数据查询效率。该实例展示了如何利用Redis缓存数据库查询结果,减少数据库负载,并解决了缓存穿透问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?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;

}





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇葩也是花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值