月度归档: 2022 年 7 月

  • WordPress:获取当前页面菜单的current menu item,输出在菜单中的子菜单get sub menu

    WordPress:获取当前页面菜单的current menu item,输出在菜单中的子菜单get sub menu

    遇到一个问题,要显示当前页面的面包屑导航,只是这个面包屑路径反应的不是页面自身的层级关系,而是该页面在菜单导航中的位置。因此需要检测该页面所在菜单的current menu item,在stackexchange上找到了一个不错的方法,记录一下。

    使用wp_nav_menu_objects filter查找current menu item,在调用wp_nav_menu之前先过滤一下这个filter的值,找到current menu item,将需要的信息,例如menu ID,标题或url等,记录到一个全局变量里。等调用完wp_nav_menu后,就可以使用这个全局变量显示信息了。

    在当前菜单中做一下记号

    add_filter( 'wp_nav_menu_objects', 'uzi_wp_nav_menu_objects' );
    function uzi_wp_nav_menu_objects( $sorted_menu_items )
    {
        foreach ( $sorted_menu_items as $menu_item ) {
            if ( $menu_item->current ) {
                $_SESSION['uzi_current_menu'] = $menu_item;
                break;
            }
        }
        return $sorted_menu_items;
    }

    全局变量$_SESSION['uzi_current_menu']记录了当前菜单的current menu item的标题。

    一些比较有用的信息如下

    $menu_item->ID - Menu ID
    $menu_item->title - 该菜单项名称
    $menu_item->post_title - Post Title,不一定和菜单项名称相同
    $menu_item->url -  固定链接
    $menu_item->object_id - post ID
    $menu_item->post_parent - Post Parent(例如page的parent page)
    $menu_item->menu_item_parent - 指在该菜单中的层级关系

    输出main-nav菜单中,当前页面所在菜单的子菜单

    $locations = get_nav_menu_locations();
    $menu = wp_get_nav_menu_object($locations['main-nav']); // primary' is our nav menu's name
    $menu_items = wp_get_nav_menu_items($menu->term_id);
    // var_dump($menu,$_SESSION['uzi_current_menu']->ID,$menu_items);
    if (!empty($menu_items)) {
        echo '<ul>';
        foreach ($menu_items as $menu_item) {
            if($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->ID
               || $menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->			if ($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->ID
    				|| ($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->menu_item_parent && 0 != $menu_item->menu_item_parent)
    			) {
    				//判断当前页面是该菜单项的子项
    				if (is_page($menu_item->object_id) || is_category($menu_item->object_id)) {
    					echo '<li class="current-menu-item">';
    				} else {
    					echo '<li>';
    				}
    				echo '<a href="' . $menu_item->url . '">' . $menu_item->title . '</a>';
    				echo '</li>';
    			}        
        }
        echo '</ul>';
    }
  • php下用redis解决秒杀超卖问题

    php下用redis解决秒杀超卖问题

    秒杀超卖问题,就是有一个商品抢购活动,一个商品假如有100件库存,但是在抢购时有200人来抢购,这时就会并发,原本只有100的库存但是抢购的人过多,就会发生数据库里原本只有100的库存但是库存为0的时候还会有人提交成功,这就是超卖。

      今天简单的用redis的队列来解决超卖问题。因为redis有list类型,list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。先进先出  一端进  一端出这就是队列。这里用redis就解决了并发的问题,在队列里前一个走完之后,后一个才会走。

      实现原理

       将库存循环lpush进一个redis值goods_number里去,然后在下单的时候依次rpop出来。这样就是下一个单取出来一个,然后等goods_number的值为0时,停止下单。

      首先建立三个表 store商品表  order订单表  log日志表

    CREATE TABLE `store` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `goods_id` int(11) NOT NULL,
      `sku_id` int(10) unsigned NOT NULL DEFAULT '0',
      `number` int(10) NOT NULL DEFAULT '0',
      `freez` float(11,2) NOT NULL DEFAULT '0.00' COMMENT '虚拟库存',
      `price` int(10) NOT NULL COMMENT '价格:单位为分',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='库存';
     
    CREATE TABLE `order` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `order_sn` char(32) NOT NULL,
      `user_id` int(11) NOT NULL,
      `status` int(11) NOT NULL DEFAULT '0',
      `goods_id` int(11) NOT NULL DEFAULT '0',
      `sku_id` int(11) NOT NULL DEFAULT '0',
      `number` int(11) NOT NULL,
      `price` int(10) NOT NULL COMMENT '价格:单位为分',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4743 DEFAULT CHARSET=utf8 COMMENT='订单表';
     
    CREATE TABLE `order` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `order_sn` char(32) NOT NULL,
      `user_id` int(11) NOT NULL,
      `status` int(11) NOT NULL DEFAULT '0',
      `goods_id` int(11) NOT NULL DEFAULT '0',
      `sku_id` int(11) NOT NULL DEFAULT '0',
      `number` int(11) NOT NULL,
      `price` int(10) NOT NULL COMMENT '价格:单位为分',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4743 DEFAULT CHARSET=utf8 COMMENT='订单表';

    代码如下:

    <?php
    namespace Home\Controller;
    use Think\Cache\Driver\Redis;
    use Think\Controller;
    class TestController extends Controller
    {
        public function index()
        {
            $wheres = array();
            $wheres['goods_id'] = 1;
            $number = M('store')->where($wheres)->getField('number');
            $redis = new Redis();
            for ($i = 0; $i < $number; $i++) {
                $redis->lpush('goods_number', 1);
            }
            echo $redis->llen('goods_number');
        }
        //生成唯一订单号  
        function build_order_no()
        {
            return date('ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
        }
        //记录日志  
        function insertLog($event, $type = 0)
        {
            $data['event'] = $event;
            $data['type']  = $type;
            $res = M('log')->add($data);
        }
        //模拟下单操作  
        //下单前判断redis队列库存量  
        function order()
        {
            $sku_id  = 11;  //传入已知的sku_id;
            $wheres = array();
            $wheres['sku_id'] = $sku_id;
            $good_info = M('store')->where($wheres)->find();
            $user_id  = rand(1, 200);
            $goods_id = $good_info['goods_id'];
            $price    = $good_info['price'];
            $number   = 1; //抢购时每次买一件商品
    
            $redis = new Redis();
            $count = $redis->rpop('goods_number');  //下单时做rpop 从goods_number中取出1
            if ($count == 0) {
                $this->insertLog('error:no goods_number redis');
                return;
            }
    
            if (($good_info['number'] - $number) <= 0) {
                $this->insertLog('商品售罄');  //如果库存为0写入日志 并停止下单操作
                return;
            }
    
            //生成订单    
            $order_sn = $this->build_order_no();
            $data = array();
            $data['order_sn'] = $order_sn;
            $data['user_id']  = $user_id;
            $data['goods_id'] = $goods_id;
            $data['sku_id']   = $sku_id;
            $data['number']   = $number;
            $data['price']    = $price;
            $order_rs = M('order')->add($data);
            //库存减少  
            $wheres['sku_id'] = $sku_id;
            $store_rs = M('store')->where($wheres)->setDec('number', $number);
            if ($store_rs) {
                $this->insertLog('库存减少成功');
            } else {
                $this->insertLog('库存减少失败');
            }
        }
    }
    

    先访问:/test/index 将redis的list初始化

    然后可以访问:/test/order 进行模拟

  • PHP Redis – zSet(有序集合)

    PHP Redis – zSet(有序集合)

    有序集合与集合一样,string类型元素的集合,不允许重复的成员。

    有序集合,每个元素都会关联一个 double 类型的分数。Redis 通过分数为集合的成员进行从小到大的排序

    有序集合的成员是唯一的,但分数 (score) 可以重复。

    集合是通过哈希表实现的, 集合中最大的成员数为 232 – 1 (4294967295, 每个集合可存储40多亿个成员)。

    添加元素(zAdd)

    // zAdd(key,increment,value)
    $redis->zAdd('score', 550, '语文'); $redis->zAdd('score', 66, '高数'); $redis->zAdd('score', 77, '公共英语'); $redis->zAdd('score', 88, '计算机组成原理',99,'Java程序设计');

    元素分值增减(zIncrBy)

    // zIncrBy(key,increment,value);increment值可为正/负值
    $redis->zIncrBy('score', -10, '语文');
    $redis->zAdd('score', 10, '高数');  

    获取排行(zRevRange)

    // 根据排序后的数据,升序和降序的列表获取
    $redis->zRevRange('score', 0, 2);

    获取指集合中成员排名(zRank,zRevRank)

    // 返回有序集合中指定成员的排名。按分数值递减排序。分数值最大者排名为0。
    $redis->zRevRank('score','语文');
    // 返回有序集合中指定成员的排名,按分数值递增排序。分数值最小者排名为0。
    $redis->zRank('score', 历史);

    获取指定索引区间内的成员(Zrange,zReverseRange)

    // Zrange('set_key', start, end,[true]) 。 true:是否返回各个元素的分数值,默认为false
    // 成员按分数值递增排序。具有相同分数值的成员按字典序倒序排列。
    // start 和 stop 以 0 表示有序集第一个成员,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
    $redis->Zrange('score',0,-1,true);
    // zReverseRange('set_key', start, end,[true]) 成员按分数值递减排序,分数值相同的则按字典序的倒序排序
    $redis->zReverseRange('score',0,-1,true);

    获取指定分值区间的元素(zRangeByScore,zRevRangeByScore)

    // zRangeByScore(key,min,max,[withscores]|[LIMIT offset count])
    $redis->zRangeByScore('score',60,90,['withscores' => true]);
    // zRevRangeByScore(key,max,min,[withscores]|[LIMIT offset count])
    $redis->zRevRangeByScore('score',90,60,['withscores' => true]);
    注:
      ['WITHSCORES' => true] 显示整个有序集合成员的 score 值
      ['LIMIT' =>[0,2]] 自定义返回的有序集合起始位置及条数

    获取元素个数(zCard)

    $redis->zCard('score');

    获取指定分值区间内的元素个数(zCount)

    $redis->zCount('score', 60, 90);

    获取指定元素的 数据 (zScore)

    $redis->zScore('score','历史')

    计算有序集合中指定区间内成员数量(Zlexcount)

    // Zlexcount('key_name','[value1','[value2')
    $redis->Zlexcount('score','[英语','[语文');

    计算给定的有序集的交集数量(Zinterstore)

    // 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该结果集储存到指定集合
    // 默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和
    // Zinterstore('zset_Key',['keys'|'keyt'])
    $resdis->Zinterstore('score',['score1']);

    计算给定的一个或多个有序集的并集/交集(Zunionstore/zinterstore)

    //计算给定一个或多个有序集的交集,元素相加,并将其存储到目的有序集中
    $redis->zinterstore(‘new_zset_key’,[‘score’,’score1′]);
    //计算给定一个或多个有序集的并集,元素相加,并将其存储到目的有序集中
    $redis->zunionstore(‘new_zset_key’,[‘score’, ‘score1’]);

    删除元素(zRem)

    // 删除有序集中的一个或多个成员,忽略不存在的成员。返回删除的元素个数
    $redis->zRem('score', '历史','盈余');

    根据排名删除(zRemRangeByRank)

    // 自 0 开始
    $redis->zRemRangeByRank('score', 0, 2);

    根据指定分值区间删除(zRemRangeByScore)

    //删除score在[60, 90]之间的元素
    $redis->zRemRangeByScore('score', 60, 90);
  • PHP将科学计数法转换为正常的数字

    PHP将科学计数法转换为正常的数字

    遇到一个数字变成科学计数法的问题。问题来源于当前输出的一个数字太大了,然后存不下了。比如

    echo 14735037137891444444;
    echo 0.00000000000000000000000000001;

      然后输出的结果为:

    1.4735037137891E+19
    1.0E-29

      这种情况也算常见了,只是数字太大或太小导致的,然后数据库的存储字段直接是字符串,结果就出现了种种神奇的问题。

      然后就在网上找了个同样神奇的函数,确实有效,但也满坑的。然后就自己写了个,逻辑有点复杂,但没涉及到数字运算,精度应该是有保证的。

    <?php
    /**
     * 将科学计数法的数字转换为正常的数字
     * 为了将数字处理完美一些,使用部分正则是可以接受的
     * @author loveyu
     * @param string $number
     * @return string
     */
    function convert_scientific_number_to_normal($number)
    {
        if(stripos($number, 'e') === false) {
            //判断是否为科学计数法
            return $number;
        }
        if(!preg_match(
            "/^([\\d.]+)[eE]([\\d\\-\\+]+)$/",
            str_replace(array(" ", ","), "", trim($number)), $matches)
        ) {
            //提取科学计数法中有效的数据,无法处理则直接返回
            return $number;
        }
        //对数字前后的0和点进行处理,防止数据干扰,实际上正确的科学计数法没有这个问题
        $data = preg_replace(array("/^[0]+/"), "", rtrim($matches[1], "0."));
        $length = (int)$matches[2];
        if($data[0] == ".") {
            //由于最前面的0可能被替换掉了,这里是小数要将0补齐
            $data = "0{$data}";
        }
        //这里有一种特殊可能,无需处理
        if($length == 0) {
            return $data;
        }
        //记住当前小数点的位置,用于判断左右移动
        $dot_position = strpos($data, ".");
        if($dot_position === false) {
            $dot_position = strlen($data);
        }
        //正式数据处理中,是不需要点号的,最后输出时会添加上去
        $data = str_replace(".", "", $data);
    
        if($length > 0) {
            //如果科学计数长度大于0
            //获取要添加0的个数,并在数据后面补充
            $repeat_length = $length - (strlen($data) - $dot_position);
            if($repeat_length > 0) {
                $data .= str_repeat('0', $repeat_length);
            }
            //小数点向后移n位
            $dot_position += $length;
            $data = ltrim(substr($data, 0, $dot_position), "0").".".substr($data, $dot_position);
        } elseif($length < 0) {
            //当前是一个负数
            //获取要重复的0的个数
            $repeat_length = abs($length) - $dot_position;
            if($repeat_length > 0) {
                //这里的值可能是小于0的数,由于小数点过长
                $data = str_repeat('0', $repeat_length).$data;
            }
            $dot_position += $length;//此处length为负数,直接操作
            if($dot_position < 1) {
                //补充数据处理,如果当前位置小于0则表示无需处理,直接补小数点即可
                $data = ".{$data}";
            } else {
                $data = substr($data, 0, $dot_position).".".substr($data, $dot_position);
            }
        }
        if($data[0] == ".") {
            //数据补0
            $data = "0{$data}";
        }
        return trim($data, ".");
    }

    简单的测试数据
    1.12E8 ————- 112000000
    1.12E3 ————- 1120
    1.12E2 ————- 112
    1.12E0 ————- 1.12
    1.12E-1 ———— 0.112
    1.12E-2 ———— 0.0112
    1.12E-8 ———— 0.0000000112
    0.112E1 ———— 1.12
    0.112E2 ———— 11.2
    0.112E4 ———— 1120
    0.112E-2 ———– 0.00112
    0000.112E-2 ——– 0.00112
    0000.112000E-2 —– 0.00112
    .112E-2 ———— 0.00112
    .112E2 ————- 11.2

  • 执行yum时,报错error: rpmdb: BDB0113 Thread/process 13132/139729145776192 failed: BDB1507 Thread died in Berkeley DB library

    执行yum时,报错error: rpmdb: BDB0113 Thread/process 13132/139729145776192 failed: BDB1507 Thread died in Berkeley DB library

    我们再安装了腾讯云轻量云服务器的宝塔应用之后,出现无法使用yum命令的情况。注意,这里使用的是CentOS 7.8 64bit的系统,应用镜像宝塔Linux面板。原因就是rpm数据库损坏。

    问题描述

    [root@happy yum.repos.d]# yum clean all
    error: rpmdb: BDB0113 Thread/process 13132/139729145776192 failed: BDB1507 Thread died in Berkeley DB library
    error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
    error: cannot open Packages index using db5 – (-30973)
    error: cannot open Packages database in /var/lib/rpm
    CRITICAL:yum.main:

    重新构建rpm数据库

    [root@happy yum.repos.d]# cd /var/lib/rpm
    [root@happy rpm]# ls
    Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
    Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername
    [root@happy rpm]# rm -rf __db*
    [root@happy rpm]# rpm --rebuilddb
  • Debian 10 Buster 国内常用镜像源

    Debian 10 Buster 国内常用镜像源

    老季整理一下Debian 10 的国内较知名的镜像站点,供大家在生产环境中使用。

    如何更新系统安装源

    一般我们修改 /etc/apt/sources.list 文件,将 Debian 的默认源地址改成新的地址即可,比如将 http://deb.debian.org 改成 https://mirrors.163.com,可使用以下这条命令:

    sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list

    注意,如果安装源是 https 协议的,我们还需要安装软件包 apt-transport-https。 执行 apt-get install apt-transport-https,随后再执行 apt-get update 即可。

    常用安装源站点列表

    163镜像站

    deb http://mirrors.163.com/debian/ buster main non-free contrib
    deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
    deb http://mirrors.163.com/debian/ buster-backports main non-free contrib
    deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ buster main non-free contrib
    deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib
    deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib

    华为云镜像站

    deb https://mirrors.huaweicloud.com/debian/ buster main contrib non-free
    deb https://mirrors.huaweicloud.com/debian/ buster-updates main contrib non-free
    deb https://mirrors.huaweicloud.com/debian/ buster-backports main contrib non-free
    deb https://mirrors.huaweicloud.com/debian-security/ buster/updates main contrib non-free
    deb-src https://mirrors.huaweicloud.com/debian/ buster main contrib non-free
    deb-src https://mirrors.huaweicloud.com/debian/ buster-updates main contrib non-free
    deb-src https://mirrors.huaweicloud.com/debian/ buster-backports main contrib non-free 

    腾讯云镜像站

    deb http://mirrors.cloud.tencent.com/debian/ buster main non-free contrib
    deb http://mirrors.cloud.tencent.com/debian-security buster/updates main
    deb http://mirrors.cloud.tencent.com/debian/ buster-updates main non-free contrib
    deb http://mirrors.cloud.tencent.com/debian/ buster-backports main non-free contrib
    deb-src http://mirrors.cloud.tencent.com/debian-security buster/updates main
    deb-src http://mirrors.cloud.tencent.com/debian/ buster main non-free contrib
    deb-src http://mirrors.cloud.tencent.com/debian/ buster-updates main non-free contrib
    deb-src http://mirrors.cloud.tencent.com/debian/ buster-backports main non-free contrib

    中科大镜像站

    deb https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free
    deb https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free
    deb https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free
    deb https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
    deb-src https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free
    deb-src https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free
    deb-src https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free
    deb-src https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free

    阿里云镜像站

    deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
    deb http://mirrors.aliyun.com/debian-security buster/updates main
    deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
    deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
    deb-src http://mirrors.aliyun.com/debian-security buster/updates main
    deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
    deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
    deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

    清华大学镜像站

    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free

    兰州大学镜像站

    deb http://mirror.lzu.edu.cn/debian stable main contrib non-free
    deb http://mirror.lzu.edu.cn/debian stable-updates main contrib non-free
    deb http://mirror.lzu.edu.cn/debian/ buster-backports main contrib non-free
    deb http://mirror.lzu.edu.cn/debian-security/ buster/updates main contrib non-free
    deb-src http://mirror.lzu.edu.cn/debian stable main contrib non-free
    deb-src http://mirror.lzu.edu.cn/debian stable-updates main contrib non-free
    deb-src http://mirror.lzu.edu.cn/debian/ buster-backports main contrib non-free
    deb-src http://mirror.lzu.edu.cn/debian-security/ buster/updates main contrib non-free

    上海交大镜像站

    deb https://mirror.sjtu.edu.cn/debian/ buster main contrib non-free
    deb https://mirror.sjtu.edu.cn/debian/ buster-updates main contrib non-free
    deb https://mirror.sjtu.edu.cn/debian/ buster-backports main contrib non-free
    deb https://mirror.sjtu.edu.cn/debian-security/ buster/updates main contrib non-free
    deb-src https://mirror.sjtu.edu.cn/debian/ buster-updates main contrib non-free
    deb-src https://mirror.sjtu.edu.cn/debian/ buster-backports main contrib non-free
    deb-src https://mirror.sjtu.edu.cn/debian/ buster main contrib non-free
    deb-src https://mirror.sjtu.edu.cn/debian-security/ buster/updates main contrib non-free

    附上官方全球镜像站列表地址:https://www.debian.org/mirror/list

  • 腾讯云 云服务器精选爆品 轻量服务器 2核2G4M/5M 1.2折年付¥72元/年

    腾讯云 云服务器精选爆品 轻量服务器 2核2G4M/5M 1.2折年付¥72元/年

    腾讯云QCloud 618超级爆品活动 2022 6.1 ~ 6.14活动之后,老季发现腾讯云又开启了云服务器精选爆品的活动。

    腾讯云云服务器精选爆品,购买链接直达: https://www.jiloc.com/go/qcloud-act

    购买即赠·专区,产品首单专享

    最长免费续费3个月,活动规则>>  

    • 本专区内商品都不支持退款
    • 购买15天内需至领赠页面领取福利
    • 同一账号,赠送福利限领取1次

    新人·专区,产品首单专享

    秒杀·专区

    新老·同享

    爆款热卖、音视频通信、云数据库、CDN&存储、AI应用、中间件&大数据频道等

    更多活动

    更有域名专场等其他活动。有需要的小伙伴可以看看。

WeChat