备案 控制台
开发者社区 数据库 文章 正文

阿里云PostgreSQL案例精选1 - 实时精准营销、人群圈选

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
推荐场景:
学生管理系统数据库设计 搭建个人博客
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
推荐场景:
PolarDB for MySQL 多主集群体验
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 标签 PostgreSQL , 阿里云 , 实时精准营销 , 人群圈选 , 广告 背景 行业: 几乎所有行业, 如互联网、新零售、教育、游戏等. 应用场景: 根据目标群体的特征, 快速提取目标群体.例如, 在电商行业中, 商家在搞运营活动前, 根据活动的目标群体的特征, 圈选出一批目标用户进行广告推送或活动条件的命中. 在游戏行业中, 运营经常会根据游戏玩家的某些特征圈

标签

PostgreSQL , 阿里云 , 实时精准营销 , 人群圈选 , 广告


背景

行业:

几乎所有行业, 如互联网、新零售、教育、游戏等.

应用场景:

根据目标群体的特征, 快速提取目标群体.
例如,

  • 在电商行业中, 商家在搞运营活动前, 根据活动的目标群体的特征, 圈选出一批目标用户进行广告推送或活动条件的命中.
  • 在游戏行业中, 运营经常会根据游戏玩家的某些特征圈选, 针对性的发放大礼包, 激活游戏活跃度.
  • 在教育行业中, 根据学生不同的特征, 推送不同的有针对性的习题, 提升学生的弱项.
  • 在搜索、门户、视频网站等业务中, 根据用户的关注热点, 近期行为的不同, 根据群体推送内容.

场景痛点:

业务特点:
1、数据量庞大, 运算量大
2、用户标签多, 字段多, 存储占用空间多
3、字段多, 可能超过数据库的字段数限制, 一般数据库最多支持1000多个字段.
4、使用数组替代多字段存储标签, 需要数据库支持倒排索引, 不是所有数据库都支持倒排索引
5、使用数组代替多字段存储标签, 加上倒排索引, 存储空间会暴增
6、圈选条件组合多样化, 没有固定索引可以优化, 每个字段一个索引, 存储空间暴增
7、性能要求高, 实时营销, 要求秒级响应
8、数据更新时效要求高, 用户画像要求近实时的更新, 如果不能准实时更新很可能圈选到的用户不精准(例如用户昨天在浏览手机. 昨晚已下单, 但是数据未更新, 那么作为手机卖家圈选时这个用户就会被选中, 但是实际上已经不是目标群体)

业务痛点:
在常见的产品如MySQL中, 无法在有限的资源下, 满足实时圈选目标群体的需求.

技术方案:

方案1

表结构:

KEY: 用户ID  
标签1:   
标签2:   
...  
标签N:  

索引:

每个标签字段一个索引  

搜索方法:

and , or , not 组合  
where 标签a and 标签b and ...  

缺陷:

  • 用户标签多, 字段多, 存储占用空间多
  • 字段多, 可能超过数据库的字段数限制, 一般数据库最多支持1000多个字段.
  • 圈选条件组合多样化, 没有固定索引可以优化, 每个字段一个索引, 存储空间暴增
  • 新增一个新多用户群体(标签)时, 需要更新大量数据
  • 查询性能差
  • 方案1也可以是多对多的结构, 每个标签一条记录, 解决字段数限制的问题.
    • 当然了, 字段数限制还可以通过拆表来解决, 但是查询的时候就可能需要跨表JOIN了.

方案2

表结构:

KEY:用户ID  
VALUES:标签数组  

索引:

标签数组字段: GIN倒排索引  

搜索方法:

与、或、非  
where VALUES @> array[标签s] -- 与  
where VALUES && array[标签s] -- 或  
where not VALUES @> array[标签s] -- 非  

缺陷:

  • 使用数组替代多字段存储标签, 需要数据库支持倒排索引, 不是所有数据库都支持倒排索引
  • 使用数组代替多字段存储标签, 加上倒排索引, 存储空间会暴增
  • 新增一个新多用户群体(标签)时, 需要更新大量数据

方案3

表结构:

KEY:标签ID  
VALUES: 用户bitmap  

索引:

标签ID字段: Btree索引  

搜索方法:

聚合bitmap: 与、或、非  
and_agg(bitmaps) where KEY in (标签s) -- 与  
or_agg(bitmaps) where KEY in (标签s) -- 或  
except(bitmap1,bitmap2) -- 非  

缺陷:

  • bitmap最大长度为1GB, 用户数超过长度需要使用offset, 方法如下:
    • offset0_bitmap, offset1gb_bitmap, ...
  • 用户ID需要是数字(建议连续数值), 如果没有数值型UID, 需要治理, 建立映射表.

优势:

  • 表存储占用空间小
  • 索引存储占用空间小
    • 仅需一个Btree索引, 索引记录数少(有多少标签, 就有多少条记录, 通常标签数在百万以内)
  • 新增一个新多用户群体(标签)时, 不需要更新大量数据, 仅需新增一条新人群的bitmap记录
  • 查询性能极好

DEMO介绍:

通用操作

1、购买RDS PG 12
2、购买RDS MySQL 8.0
3、配置白名单
4、创建用户
5、创建数据库

方案1 DEMO

MySQL 不支持数组类型、倒排索引、位图功能, 所以仅支持方案1.

1、MySQL 8.0

2、PG 12

1、创建人群表, 每条记录代表一个人群.

create table t_tag_dict (  
tag int primary key,   -- 标签(人群)id  
info text,  -- 人群描述  
crt_time timestamp  -- 时间  
);   

2、生成10万个人群(即标签)

insert into t_tag_dict values (1, '男', now());  
insert into t_tag_dict values (2, '女', now());  
insert into t_tag_dict values (3, '大于24岁', now());  
-- ...  
insert into t_tag_dict   
select generate_series(4,100000), md5(random()::text), clock_timestamp();  

3、创建用户画像表(每个用户N条记录, 每条记录代表这个用户贴的某个标签)

create table t_user_tag (  
uid int8,   -- 用户id  
tag int,            -- 用户对应标签(人群)  
mod_time timestamp,     -- 时间  
primary key (tag,uid)  
);   

4、给2000万个用户打标, 每个用户64个随机标签, 其中男、女各一半, 一共12.8亿条记录

create or replace function gen_rand_tag(int,int) returns setof int as  
$$  
  select case when random() > 0.5 then 1::int else 2::int end as tag  
  union all  
  select ceil(random()*$1)::int as tag from generate_series(1,$2);  
$$ language sql strict volatile;  
  
insert into t_user_tag  
select uid, gen_rand_tag(100000,63) as tag, clock_timestamp()   
from generate_series(1,20000000) as uid on conflict (uid,tag) do nothing;  
  
-- 或使用如下方法加速导入  
create sequence seq;  
  
vi test.sql  
insert into t_user_tag  
select uid, gen_rand_tag(100000,63) as tag, clock_timestamp()   
from nextval('seq'::regclass) as uid   
on conflict(tag,uid) do nothing;  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 50 -j 50 -t 400000  

5、查询包含1,3标签的人群

1、人群数量  
select count(*) from   
(  
select uid from t_user_tag where tag=1   
intersect  
select uid from t_user_tag where tag=3  
) t;  
-- Time: 1494.789 ms (00:01.495)  
  
2、提取人群ID  
select uid from t_user_tag where tag=1   
intersect  
select uid from t_user_tag where tag=3;  
-- Time: 3246.184 ms (00:03.246)  

6、查询包含1或3或10或200标签的人群

1、人群数量  
select count(*) from   
(  
select uid from t_user_tag where tag=1   
union  
select uid from t_user_tag where tag=3  
union  
select uid from t_user_tag where tag=10  
union  
select uid from t_user_tag where tag=200  
) t;  
-- Time: 3577.714 ms (00:03.578)  
  
2、提取人群ID  
select uid from t_user_tag where tag=1   
union  
select uid from t_user_tag where tag=3  
union  
select uid from t_user_tag where tag=10  
union  
select uid from t_user_tag where tag=200;  
-- Time: 5682.458 ms (00:05.682)  

7、空间占用情况:

 public | t_user_tag         | table | postgres | 62 GB   |   
 public | t_user_tag_pkey    | index | postgres | t_user_tag    | 61 GB  |  

方案2 DEMO

1、PG 12

1、创建人群表, 每条记录代表一个人群.

create table t_tag_dict (  
tag int primary key,   -- 标签(人群)id  
info text,  -- 人群描述  
crt_time timestamp  -- 时间  
);   

2、生成10万个人群(即标签)

insert into t_tag_dict values (1, '男', now());  
insert into t_tag_dict values (2, '女', now());  
insert into t_tag_dict values (3, '大于24岁', now());  
-- ...  
insert into t_tag_dict   
select generate_series(4,100000), md5(random()::text), clock_timestamp();  

3、创建用户画像表(每个用户一条记录, 用数组表示这个用户归属哪些标签)

create table t_user_tags (  
uid int8 primary key,   -- 用户id  
tags int[],            -- 用户标签(人群)数组  
mod_time timestamp     -- 时间  
);   

4、创建生成随机打标数组的函数

create or replace function gen_rand_tags(int,int) returns int[] as $$  
  select array_agg(ceil(random()*$1)::int) from generate_series(1,$2);  
$$ language sql strict;  

4.1、在10万个标签内随机提取8个标签:

select gen_rand_tags(100000, 8);  
                   gen_rand_tags                     
---------------------------------------------------  
 {43494,46038,74102,25308,99129,40893,33653,29690}  
(1 row)  

5、给2000万个用户打标, 每个用户64个随机标签, 其中男、女各一半

insert into t_user_tags   
select generate_series(1,10000000),   
array_append(gen_rand_tags(100000, 63),1), now();  
  
insert into t_user_tags   
select generate_series(10000001,20000000),   
array_append(gen_rand_tags(100000, 63),2), now();  

6、创建标签(人群)字段倒排索引

create index idx_t_user_tags_1 on t_user_tags using gin (tags);  

7、查询包含1,3标签的人群

1、人群数量  
select count(uid) from t_user_tags where tags @> array[1,3];  
  
2、提取人群ID  
select uid from t_user_tags where tags @> array[1,3];  

8、查询包含1或3或10或200标签的人群

1、人群数量  
select count(uid) from t_user_tags where tags && array[1,3,10,200];  
  
2、提取人群ID  
select uid from t_user_tags where tags && array[1,3,10,200];  

方案3 DEMO

1、PG 12

RDS PG 12已支持位图功能, 常用说明:

安装插件 – create extension roaringbitmap;  
  
bitmap输出格式 – set roaringbitmap.output_format='bytea|array';  
  
bitmap取值范围 – 40亿(int4)   
  
构造bitmap –  rb_build(int4[])   
  
bitmap转换为数组或多条记录 - rb_to_array(rb) – rb_iterate(rb)   
  
bitmap内包含对象个数 – rb_cardinality(rb)   
  
逻辑运算: 与、或、异或、差  
SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');  
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');  
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');  
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');  
  
聚合运算: build rb、与、或、异或  
SELECT rb_build_agg(e) FROM generate_series(1,100) e;  
SELECT rb_or_agg(bitmap) FROM t1;  
SELECT rb_and_agg(bitmap) FROM t1;  
SELECT rb_xor_agg(bitmap) FROM t1;  
  
聚合并统计对象数(与、或、异或)  
rb_or_cardinality_agg  
rb_and_cardinality_agg  
rb_xor_cardinality_agg  
  
逻辑判断: 包含、相交、相等、不相等  
Opperator   Input   Output  Desc    Example Result  
@>  roaringbitmap,roaringbitmap bool    contains    roaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')    f  
@>  roaringbitmap,integer   bool    contains    roaringbitmap('{1,2,3,4,5}') @> 3   t  
<@  roaringbitmap,roaringbitmap bool    is contained by roaringbitmap('{1,2,3}')    f  
<@  integer,roaringbitmap   bool    is contained by 3   t  
&&  roaringbitmap,roaringbitmap bool    overlap (have elements in common)   roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')    t  
=   roaringbitmap,roaringbitmap bool    equal   roaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}') f  
<>  roaringbitmap,roaringbitmap bool    not equal   roaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')    t  

当uid 超过int4(40亿)时, 使用offset转换, 转换方法如下:

  • https://github.com/digoal/blog/blob/master/202001/20200110_03.md

其他使用方法参考:

  • https://pgxn.org/dist/pg_roaringbitmap/

1、安装插件

create extension roaringbitmap;  

2、创建标签,用户bitmap表

create table t_tag_users (  
  tagid int primary key,   -- 用户标签(人群)id   
  uid_offset int,          -- 由于userid是int8类型,roaringbitmap内部使用int4存储,需要转换一下。     
  userbits roaringbitmap,     -- 用户id聚合的 bitmap    
  mod_time timestamp       -- 时间   
);  

3、生成标签,uid bitmap

insert into t_tag_users   
select tagid, uid_offset, rb_build_agg(uid::int) as userbits from   
(  
select   
  unnest(tags) as tagid,   
  (uid / (2^31)::int8) as uid_offset,   
  mod(uid, (2^31)::int8) as uid   
from t_user_tags   
) t   
group by tagid, uid_offset;   

4、查询包含1,3标签的人群

1、人群数量  
select sum(ub) from   
(  
select uid_offset,rb_and_cardinality_agg(userbits) as ub   
from t_tag_users   
where tagid in (1,3)   
group by uid_offset  
) t;  
  
2、提取人群ID  
select uid_offset,rb_and_agg(userbits) as ub   
from t_tag_users   
where tagid in (1,3)   
group by uid_offset;  

5、查询包含1或3或10或200标签的人群

1、人群数量  
select sum(ub) from   
(  
select uid_offset,rb_or_cardinality_agg(userbits) as ub   
from t_tag_users   
where tagid in (1,3,10,200)   
group by uid_offset  
) t;  
  
2、提取人群ID  
select uid_offset,rb_or_agg(userbits) as ub   
from t_tag_users   
where tagid in (1,3,10,200)   
group by uid_offset;   

方案对比:

环境:

数据库 计算规格 存储规格
MySQL 8.0 8C 32G 1500GB ESSD
PG 12 8C 32G 1500GB ESSD

性能对比:

CASE
(12.8亿 user/tags)
(2000万, 64 tags/user)
方案1
(MySQL、PG)
多对多:常规方案
方案2
(PG)
一对多:数组、倒排索引
方案3
(PG)
一对多:位图
方案3 vs 方案1
提升%
与查询圈选用户速度 1.5秒 42毫秒 1.5毫秒 99900%
或查询圈选用户速度 3.6秒 3秒 1.7毫秒 211665%
空间占用(表) 62GB 3126MB 1390MB 4467%
空间占用(索引) 61GB 3139MB 2MB 3123100%
build索引速度 - 20分钟 0 -

RDS PG方案价值:

1、RDS PG支持了位图功能(roaringbitmap), 可以非常高效率的生成、压缩、解析位图数据, 支持最常见的与、或、非、异或等位图聚合操作, 提取位图的ID、选择性, 判断ID是否存在等操作.
2、使用RDS PG数据库, 满足了用户在亿级以上用户, 百万~千万量级标签的大数据量下实时精准营销、快速圈选用户的需求.
3、对比MySQL的方案, RDS PG方案优势非常明显, 是一个低成本, 高效率的解决方案.

  • 节约存储空间 8948%,
  • 平均性能提升 155782.5%,
  • 最高性能提升 211665%.

课程视频

视频:
https://yq.aliyun.com/live/1896

阿里云RDS PG优惠活动

https://www.aliyun.com/database/postgresqlactivity

大量RDS PG优惠活动:

  • 免费领取RDS PG
  • 9.9元试用3个月
  • 首购2折
  • 续费5折
  • 升级5折

阿里云PG技术交流群

免费领取阿里云RDS PostgreSQL实例、ECS虚拟机

 

 

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
德哥,digoal
目录
相关文章
三分钟热度的鱼
|
18天前
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
三分钟热度的鱼
892 1
x7yi7cdbllm4q
|
4天前
|
OLAP 数据处理 Apache
众安保险 CDP 平台:借助阿里云数据库 SelectDB 版内核 Apache Doris 打破数据孤岛,人群圈选提速4倍
众安保险在CDP(Customer Data Platform,客户数据平台)建设中,通过引入阿里云数据库SelectDB版内核Apache Doris,成功打破了数据孤岛,并显著提升了人群圈选的速度
x7yi7cdbllm4q
162 1
阿里云
|
9天前
|
Cloud Native 关系型数据库 分布式数据库
阿里云PolarDB论文斩获ICDE 2024工业赛道「最佳论文奖」
阿里云PolarDB论文斩获ICDE 2024工业赛道「最佳论文奖」
阿里云
31 3
众所周知
|
9天前
|
关系型数据库 分布式数据库 数据库
【阿里云云原生专栏】云原生时代的数据库选型:阿里云RDS与PolarDB对比分析
【5月更文挑战第24天】阿里云提供RDS和PolarDB两种数据库服务。RDS是高性能的在线关系型数据库,支持MySQL等引擎,适合中小规模需求;而PolarDB是分布式数据库,具备高扩展性和性能,适用于大规模数据和高并发场景。RDS与PolarDB在架构、性能、弹性伸缩、成本等方面存在差异,开发者应根据具体需求选择。示例代码展示了如何通过CLI创建RDS和PolarDB实例。
众所周知
466 0
阿里云瑶池数据库
|
16天前
|
Cloud Native 关系型数据库 分布式数据库
祝贺!阿里云PolarDB斩获数据库国际顶会ICDE 2024工业赛道最佳论文
阿里云斩获国际顶会ICDE 2024最佳论文,0.5秒实现数据库跨机实例迁移。
阿里云瑶池数据库
412 12
祝贺!阿里云PolarDB斩获数据库国际顶会ICDE 2024工业赛道最佳论文
vohelon
|
18天前
|
Cloud Native 关系型数据库 分布式数据库
PolarDB是阿里云自主研发的关系型云原生数据库
【5月更文挑战第14天】PolarDB是阿里云自主研发的关系型云原生数据库
vohelon
52 4
hdy_coming
|
18天前
|
SQL 关系型数据库 Serverless
阿里云关系型数据库RDS
阿里云关系型数据库RDS
hdy_coming
182 49
Database-Learning-helper
|
18天前
|
关系型数据库 分布式数据库 数据库
开源之夏2024学生报名启动!阿里云PolarDB社区项目期待你的参与!
开源之夏2024学生报名启动!阿里云PolarDB社区带你变得更强!
Database-Learning-helper
1377 3
开源之夏2024学生报名启动!阿里云PolarDB社区项目期待你的参与!
DBdoctor官方
|
18天前
|
Cloud Native 关系型数据库 分布式数据库
数据库性能诊断工具DBdoctor通过阿里云PolarDB产品生态集成认证
DBdoctor(V3.1.0)成功通过阿里云PolarDB分布式版(V2.3)集成认证,展现优秀兼容性和稳定性。此工具是聚好看科技的内核级数据库性能诊断产品,运用eBPF技术诊断SQL执行,提供智能巡检、根因分析和优化建议。最新版V3.1.1增加了对PolarDB-X和OceanBase的支持,以及基于cost的索引诊断功能。PolarDB-X是阿里巴巴的高性能云原生分布式数据库,兼容MySQL生态。用户可通过提供的下载地址、在线试用链接和部署指南体验DBdoctor。
DBdoctor官方
171 0
阿里云瑶池数据库
|
18天前
|
Cloud Native 关系型数据库 分布式数据库
史上首次!阿里云(PolarDB)荣膺“2023年度十大软件著作权人”
在知识产权领域再获重要成果。
阿里云瑶池数据库
78 1
史上首次!阿里云(PolarDB)荣膺“2023年度十大软件著作权人”

热门文章

最新文章

  • 1
    用数据洞察用户:TOB场景化营销
  • 2
    杜蕾斯的双11:一场曼伦营销理论体系与阿里云数据中台相结合的实践
  • 3
    [图示]营销理论:不同时代的用户如何接受一个新事物?
  • 4
    大数据时代的首席营销官
  • 5
    移动分析和营销工具服务公司Repro获得260万美元融资
  • 6
    广东天禾:借用友数字营销实现服务营销一体化
  • 7
    大数据拼精准可否触动电商个性营销神经
  • 8
    互联网运营期产品评审杂思,互联网营销
  • 9
    《SEM长尾搜索营销策略解密》一一2.6 不再被忽视的个体差异
  • 10
    2星|《品牌思维》:水平较差的营销讲师自创的理论,洞察力、概括总结能力都不够,也没有证据证明理论的有效性
  • 1
    连接和管理RDS
    37
  • 2
    购买和初始化阿里云RDS
    32
  • 3
    rds教程
    40
  • 4
    TiDB与MySQL、PostgreSQL等数据库的比较分析
    291
  • 5
    OBCP实践 - 迁移 MySQL 数据到 OceanBase 集群
    59
  • 6
    Flink CDC产品常见问题之mysql整库同步到starrock时任务挂掉如何解决
    63
  • 7
    TIDB和MySQL的区别
    298
  • 8
    Flink CDC产品常见问题之mysql整库同步到starrock时任务挂掉如何解决
    85
  • 9
    [MySQL]事务原理之redo log,undo log
    140
  • 10
    [MySQL]SQL优化之索引的使用规则
    45
  • 相关课程

    更多
  • 跟阿里云技术专家学习智能推荐系统
  • 阿里云负载均衡SLB实战演练
  • 云原生基础概念及阿里云云原生产品介绍
  • 阿里云图数据库GDB入门与应用
  • 企业上云攻略-阿里云网络产品应用系列教程
  • 阿里云物联网平台专题介绍
  • 相关电子书

    更多
  • 云原生产业大会:阿里云精彩内容集锦
  • 阿里云云原生 Serverless 技术实践营 PPT 演讲
  • 阿里云产品十月刊
  • 相关实验场景

    更多
  • 在阿里云百炼大模型中快速创建企业知识应用
  • 阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
  • 基于阿里云E-HPC平台的WRF气象预报实验
  • 基于阿里云DeepGPU实例,让AI带你畅玩杭州
  • 基于阿里云E-HPC和OpenFoam进行流体仿真实验
  • 基于阿里云DeepGPU实例,用AI画唯美国风少女
  • 推荐镜像

    更多
  • mysql
  • postgresql
  • clickhouse
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司青岛网站定制哪家好安顺网站搜索优化多少钱娄底网站关键词优化报价白银品牌网站设计清远关键词按天扣费报价潍坊SEO按天收费多少钱黄石百度关键词包年推广推荐十堰网站优化排名价格德宏网页设计公司池州seo网站推广报价霍邱网页设计多少钱忻州网站设计模板推荐张家口关键词排名包年推广抚顺网站优化软件报价阿坝网站设计推荐十堰网站seo优化价格阳江外贸网站建设公司普洱seo排名公司横岗营销网站价格绵阳网站制作设计价格中山至尊标王哪家好佛山网站seo优化公司常州seo优化哪家好枣庄企业网站建设推荐横岗网络营销鸡西seo排名多少钱毕节百搜标王推荐阜新网站优化按天收费推荐锦州企业网站建设报价邵阳模板推广哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化