THINKPHP利用redis更新数据库表

13 篇文章 0 订阅

一、common.php

<?php
// 应用公共文件
use think\cache\driver\Redis;
use think\facade\Db;


/**
 * @param $key [待删除的redis中的键,可以理解为虚拟表名]
 */

function delRedis($key){
        $redis=new Redis();
        $redis->delete($key);
    }

/**
 * @param $key [待更新或创建的redis的key即,待创建的表名]
 * @param $value [key对应的值,可以是很多类型的参数]
 */
function setRedis($key,$value){
    $redis=new Redis();
    $redis->set($key,$value);
}

/**
 * @param $key [待提取或查询的redis的key即,某个表名]
 * @return mixed|null
 */
function getRedis($key){
    $redis=new Redis();
    return $redis->get($key);
}


/**
 * @param $tablename [数据库表名]
 * @return mixed|null
 */
function dbMy($tablename){
    return Db::name($tablename);
}


/**
 * @param $tablename [sqlite数据库表名]
 * @return mixed|null
 */
function dbLite($tablename){
    $prefix=config("database.connections.sqlite.prefix");
    return Db::connect('sqlite')->table($prefix.$tablename);
}

function rePost($key){
    return request()->post($key);
}

二、database controller,一次更新50条。也可以设置更多。当有新数据时,插入,无新数据时,更新旧数据。

  function renewDbData($table_name,$lite_table){
        //rk=redisKey
        $rk = 'renewData';
        if(repost('table_name')){
            $table_name=repost('table_name');
        }
        if(repost('lite_table')){
            $lite_table=repost('lite_table');
        }
        //初始化redis表,rd=redisData
        //如果第二次以后运行直接取出redis表,并赋给变量
        if(repost('initial')){
            $this->renewInitial($rk,$table_name,$lite_table);
        }
        $rd = getRedis($rk);
        $newData = dbLite($lite_table)->page($rd['page'],50)->select()->toArray();
        foreach($newData as $key=>$item){
            $newID = $item['id'];
            $newDate = $item['partition_key'];
            if(isset($rd['oldData'][$newID])){
                //如果存在相同的数据则直接略过,并把更新数量加1
                if($newDate==$rd['oldData'][$newID]){
                    //开始改变redis值了
                    $rd['sameCount']++;
                    $rd['alreadyRenewCount']=$rd['sameCount']+
                        $rd['insCount']+$rd['updateCount'];
                    $rd['progress'] =
                        round($rd['alreadyRenewCount']/$rd['renewCount'],
                            2);
                    unset($rd['oldData'][$newID]);
                    if($rd['progress']==1){
                        $rd['isEnd']=1;
                        setRedis($rk,$rd);
                        if(repost('lite_table')){
                            return json($rd);
                        }
                        return $rd;
                    }
                    setRedis($rk,$rd);
                    continue;
                }
                //如果没有相同版本数据,则update
                unset($rd['oldData'][$newID]);
                dbMy($table_name)->save($item);
                $rd['updateCount']++;
            }
            else{
                $rd['insCount'] += dbMy($table_name)->insert($item);
            }
            $rd['alreadyRenewCount']=$rd['sameCount']+
                $rd['insCount']+$rd['updateCount'];
            $rd['progress'] =
                round($rd['alreadyRenewCount']/$rd['renewCount'],
                    2);
            setRedis($rk,$rd);
        }

        if($rd['progress']==1){
            $rd['isEnd']=1;
        }elseif($rd['page']*50<=$rd['renewCount']){
            $rd['page']++;
        }
        setRedis($rk,$rd);
        if(repost('lite_table')){
            return json($rd);
        }
        return $rd;
    }

    function renewInitial($redisKey,$table_name,$lite_table){
        //先删除原来的数据
        delRedis($redisKey);
        $rd = ['renewCount'=>0,'sameCount'=>0,'alreadyRenewCount'=>0,
            'page'=>1,'insCount'=>0,'updateCount'=>0,'oldData'=>[]];
        $oldData=dbMy($table_name)->field('id,partition_key')->
        select()->toArray();
        $oldData=$this->oldData($oldData);
        $newData = dbLite($lite_table)->field('count(*) count')->select()->toArray();
        $count = $newData[0]['count']*1;
        $rd['renewCount']=$count;
        $rd['oldData']=$oldData;
        setRedis($redisKey,$rd);

    }
    function oldData($data){
        $res = [];
        foreach($data as $key=>$item){
            $value = $item['partition_key'];
            if($value){
                $res[$item['id']]=$value;
            }
            else{
                $res[$item['id']]='无数据';
            }
        }
        return $res;
    }

    function progress(){
        return getRedis('renewData');
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 ThinkPHP 中查询 Redis 数组的方法如下: 1. 首先,在项目中引入 Redis 的 PHP 扩展。 2. 然后,使用以下代码连接 Redis 服务器: ``` $redis = new Redis(); $redis->connect('127.0.0.1', 6379); ``` 3. 接下来,使用以下代码查询 Redis 数组: ``` $array = $redis->hGetAll('key'); ``` 其中,'key' 是 Redis 数组的名称。 4. 最后,使用以下代码关闭 Redis 连接: ``` $redis->close(); ``` 希望这些信息对您有帮助。 ### 回答2: 在ThinkPHP中,要使用Redis进行数组查询,可以按照以下步骤进行操作: 1. 首先,确保已经安装并配置好了Redis服务,可以通过在配置文件中设置相应的Redis连接信息来实现。 2. 在控制器或者模型中,使用ThinkPHP提供的Redis类库,通过实例化Redis类来连接到Redis服务器。 3. 通过Redis实例调用相关方法来进行数组的查询操作。例如,使用lrange方法来查询Redis中的List类型数据,使用hgetall方法来查询Redis中的Hash类型数据等。具体的查询方法可以根据数据类型的不同来选择合适的方法。 4. 根据查询的结果,进行后续的业务逻辑处理。可以使用ThinkPHP提供的模板引擎或者返回Json数据等方式将查询结果展示给用户。 需要注意的是,使用Redis查询数组时,还需要了解Redis的数据类型及相关操作方法,以便根据实际需求进行查询。此外,为了提高查询效率,可以根据业务需求合理设计和使用Redis的数据结构,避免不必要的查询操作。 ### 回答3: thinkphp可以通过使用第三方的Redis扩展来查询Redis数组。 首先,确保已经在项目中安装了Redis扩展,并且在`database.php`配置文件中正确配置了Redis连接信息。 在控制器中,可以使用以下代码查询Redis数组: ```php use think\facade\Cache; public function redisArrayQuery() { // 设置Redis的key值 $key = 'my_array_key'; // 查询Redis数组 $array = Cache::store('redis')->get($key); if (empty($array)) { // 如果数组为空,则进行相关处理 // ... // 将处理后的数组重新保存到Redis中 Cache::store('redis')->set($key, $array); } // 返回查询结果 return $array; } ``` 在上述代码中,首先通过`Cache::store('redis')->get($key)`来查询指定的Redis数组,如果数组为空,则可以进行相关处理,并将处理后的数组使用`Cache::store('redis')->set($key, $array)`重新保存到Redis中。最后,通过`return $array`将查询结果返回。 请注意,在使用Redis扩展前确保已经正确安装并配置了Redis扩展,并且正确配置了`database.php`中的Redis连接信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值