Laravel-如何使用Redis

 RorinL     2022年04月03日 星期日 14:27:41     laravel      laravel   php    

首先配置.env,如果有不同的地方自己更改即可

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=123456
REDIS_PORT=6379

基本用法:

a.设置一个值
Redis::set('key','value');

b.设置一个值,并且这个值只能设置一次;往后再set也改不了value
Redis::setnx('key','value');

c.设置这个值的过期时间,单位秒[注意不是时间戳]
Redis::expire('key',time);

d.删除
Redis::del('key');

e.获取key剩下多少时间,返回秒数
Redis::ttl('key');

f.获取key对应值
Redis::get('key');

接下来简单介绍一下如何使用redis维护用户登录状态

//登录
use Illuminate\Http\Request;

public function login(Request $req){
    $account = $req['account'];
    $pwd = $req['pwd'];
    //数据库判断用户
    //获取用户数据$data
    $token = encrypt($data['id']); //返回给客户端的token
    try {
        if(Redis::exists($data['id'])){ //登录状态未过期
            $redisdataget = Redis::get($data['id']);
            $unserializedata = unserialize(decrypt($redisdataget));
            $expires_at = $unserializedata['expires_in'];
        }else{ //登录状态过期重新设置
            $cuedate = date('Y-m-d h:i:s');
            $expires_at = strtotime("$cuedate +7 day"); //自登录时间开始7天过期
            $decode = encrypt(serialize([
                "id"=>$data['id'],
                "expires_in" => $expires_at,
            ]));
            Redis::setnx($data['id'], $decode); //设置数据值
            Redis::expire($data['id'], $expires_at-strtotime($cuedate)); //设置过期时间(秒)=过期值-第一次值
        }

        $this->success(['data'=>[
            'uid' => $data['id'],
            'token'=> $token,
            'expires_in' => $expires_at
        ],'msg'=>'登录成功']);
    } catch (\Exception $e) {
    $this->error(['msg'=>$e->getMessage()]);
    }
}

//设置中间件
class verifyPermission
{
    /**token认证
    public function handle(Request $request, Closure $next)
    {
        $token = $request->header('token'); //获取token
        $tokendata = $this->Tokenbydata($token); //redisToken检测
        $user_detail = $this->userexists($tokendata['user']); //用户检测
        $request->merge(['user_detail'=>$user_detail]); //增加req参数user_detail,并向下传递用户数据
        return $next($request);
    }

    //根据token获取token数据值
    protected function Tokenbydata($token){
        if($token==''){
            $this->error(['msg'=>'token为空']);
        }
        $openid = decrypt($token);
        if(!Redis::exists($openid)){
            $this->error(['msg'=>'token不存在']);
        }
        //判断是否过期:剩余秒数小于30分钟
        if(Redis::ttl($openid)<=43200){
            Redis::del($openid); //删除旧记录
            $this->error(['msg'=>'用户登录已过期,请重新登录']);
        }
        $redisdataget = Redis::get($openid);
        $unserializedata = unserialize(decrypt($redisdataget));
        return $unserializedata;
    }

    //用户存在?
    protected function userexists($userid){
        $data = User::find($userid)->makeHidden(['email_verified_at','login_vertified_at','open_id','session_key']);
        if(!$data){
            $this->error(['msg'=>'非法用户']);
        }
        return $data;
    }

    protected function error($parms){
        $rdata = array_merge(['code'=>404,'data'=>null,'msg'=>''], $parms);
        http_response_code($rdata['code']);
        echo json_encode($rdata);die;
    }
    protected function success($parms){
        $rdata = array_merge(['code'=>200,'data'=>null,'msg'=>''], $parms);
        http_response_code($rdata['code']);
        echo json_encode($rdata);die;
    }
}

其实还可以使用laravel推荐的api认证,但是多掌握一种方法也不失一件好事;


暂无评论

发表回复

您的电子邮箱地址不会被公开。

CAPTCHAis initialing...