PHP 中使用 ElasticSearch 的最佳实践 (下)
引言
上一篇文章,我们使用同步的方式将数据,同步写入到 ElasticSearch 中。接下来的这篇文章,主要介绍使用 RabbitMQ 的方式,异步的将数据同步到 ElasticSearch 。
部分实践代码
创建商品
/**
* 创建商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function createProduct(Request $request)
{
$title = $request->request->get(ProductModel::TITLE);
$longTitle = $request->request->get(ProductModel::LONG_TITLE);
$description = $request->request->get(ProductModel::DESCRIPTION);
$sku = $request->request->get(ProductModel::SKU);
$price = $request->request->get(ProductModel::PRICE);
$sales = $request->request->get(ProductModel::SALES);
$nowTime = date("Y-m-d H:i:s");
// 商品数据写入 DB
$productId = DB::table(ProductModel::TABLE_NAME)->insertGetId([
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::CREATED_AT => $nowTime,
ProductModel::UPDATED_AT => $nowTime
]);
$params = [
ProductModel::PRODUCT_ID => $productId,
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::CREATED_AT => $nowTime,
ProductModel::UPDATED_AT => $nowTime
];
// 将数据投递到 RabbitMQ
$this->routingKey = self::PRODUCT_CREATE;
$this->publishMsg($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
删除商品
/**
* 删除商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function deleteProduct(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
// 删除 DB 中的商品数据
DB::table(ProductModel::TABLE_NAME)->where(ProductModel::PRODUCT_ID, $productId)->delete();
$params = [
ProductModel::PRODUCT_ID => $productId,
];
// 将数据投递到 RabbitMQ
$this->routingKey = self::PRODUCT_DELETE;
$this->publishMsg($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
更新商品
/**
* 更新商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function updateProduct(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
$title = $request->request->get(ProductModel::TITLE);
$longTitle = $request->request->get(ProductModel::LONG_TITLE);
$description = $request->request->get(ProductModel::DESCRIPTION);
$sku = $request->request->get(ProductModel::SKU);
$price = $request->request->get(ProductModel::PRICE);
$sales = $request->request->get(ProductModel::SALES);
$nowTime = date("Y-m-d H:i:s");
// 商品数据更新到 DB
DB::table(ProductModel::TABLE_NAME)
->where(ProductModel::PRODUCT_ID, $productId)
->update([
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::UPDATED_AT => $nowTime
]);
$params = [
ProductModel::PRODUCT_ID => $productId,
ProductModel::TITLE => $title,
ProductModel::LONG_TITLE => $longTitle,
ProductModel::DESCRIPTION => $description,
ProductModel::SKU => $sku,
ProductModel::PRICE => $price,
ProductModel::SALES => $sales,
ProductModel::UPDATED_AT => $nowTime
];
// 将数据投递到 RabbitMQ
$this->routingKey = self::PRODUCT_UPDATE;
$this->publishMsg($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
获取单个商品数据
/**
* 获取单个商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getProductInfo(Request $request)
{
$productId = $request->request->get(ProductModel::PRODUCT_ID);
$params = [
'id' => $productId,
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->get($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
搜索商品数据
/**
* 搜索商品数据
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getProductList(Request $request)
{
$params = [
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->search($params);
return Response()->json(['code' => 0, 'msg' => 'success']);
}
通过订阅的方式,同步数据到 ElasticSearch
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->listen(function($msg) {
$routingKey = $msg->delivery_info['routing_key'];
$body = unserialize($msg->body);
$this->mapping[$routingKey]($body);
#当no_ack=false时, 需要写下行代码,否则可能出现内存不足情况#$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
});
}
/**
* 商品数据写入 ES
* @param $body
*/
protected function createProduct($body)
{
$params = [
'body' => [
ProductModel::PRODUCT_ID => $body[ProductModel::PRODUCT_ID],
ProductModel::TITLE => $body[ProductModel::TITLE],
ProductModel::LONG_TITLE => $body[ProductModel::LONG_TITLE],
ProductModel::DESCRIPTION => $body[ProductModel::DESCRIPTION],
ProductModel::SKU => $body[ProductModel::SKU],
ProductModel::PRICE => $body[ProductModel::PRICE],
ProductModel::SALES => $body[ProductModel::SALES],
ProductModel::CREATED_AT => $body[ProductModel::CREATED_AT],
ProductModel::UPDATED_AT => $body[ProductModel::UPDATED_AT]
],
'id' => $body[ProductModel::PRODUCT_ID],
'index' => self::INDEX,
'type' => self::TYPE,
];
// 商品数据写入 ES
$this->client->create($params);
}
/**
* 更新 ES 中的商品数据
* @param $body
*/
protected function updateProduct($body)
{
$params = [
'body' => [
ProductModel::PRODUCT_ID => $body[ProductModel::PRODUCT_ID],
ProductModel::TITLE => $body[ProductModel::TITLE],
ProductModel::LONG_TITLE => $body[ProductModel::LONG_TITLE],
ProductModel::DESCRIPTION => $body[ProductModel::DESCRIPTION],
ProductModel::SKU => $body[ProductModel::SKU],
ProductModel::PRICE => $body[ProductModel::PRICE],
ProductModel::SALES => $body[ProductModel::SALES],
ProductModel::CREATED_AT => $body[ProductModel::CREATED_AT],
ProductModel::UPDATED_AT => $body[ProductModel::UPDATED_AT]
],
'id' => $body[ProductModel::PRODUCT_ID],
'index' => self::INDEX,
'type' => self::TYPE,
];
// 商品数据更新到 ES
$this->client->update($params);
}
/**
* 删除 ES 中的商品数据
* @param $body
*/
protected function deleteProduct($body)
{
// 删除 ES 中的商品数据
$params = [
'id' => $body[ProductModel::PRODUCT_ID],
'index' => self::INDEX,
'type' => self::TYPE,
];
$this->client->delete($params);
}
小结
通过异步的方式同步数据到 ElasticSearch,可以提高系统的并发处理能力。
PHP 中使用 ElasticSearch 的最佳实践 (下)的更多相关文章
- 在objc项目中使用常量的最佳实践
在objc项目中使用常量的最佳实践 之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...
- 在Flask中使用Celery的最佳实践
写在前面 本最佳实践是基于作者有限的经验,欢迎大家共同讨论,可以持续维护此最佳实践.另本文中所使用的环境为Mac&Ubuntu环境,软件版本如下: Celery (4.1.0) Flask ( ...
- Kafka在大型应用中的 20 项最佳实践
原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...
- 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023
目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...
- 说出几点 Java 中使用 Collections 的最佳实践?
这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...
- 说出几条 Java 中方法重载的最佳实践?
下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱. a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参 数. b)不要重载参数数量一致,而只是参数顺序 ...
- 同步mysql数据到ElasticSearch的最佳实践
Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全 ...
- reactjs中props和state最佳实践
http://blog.csdn.net/dangnian/article/details/50998981
- 【转】Java中关于异常处理的十个最佳实践
原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...
- Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
随着使用 Nacos 的企业越来越多,遇到的最频繁的两个问题就是:如何在我的生产环境正确的来使用 namespace 以及 endpoint.这篇文章主要就是针对这两个问题来聊聊使用 nacos 过程 ...
随机推荐
- 如何跑各种check
如何进行 Fastcheck? 首先,导入环境变量: export CODE_BASE=/data/openGauss-server export BINARYLIBS=/data/openGauss ...
- Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用 SpringCloud学习教程 SpringCloud Spring Cloud OpenFeign 是 ...
- Linux CentOs6.4 静态IP 设置
Linux CentOs6.4 静态IP 设置 分类: IT技术 2013-04-07 09:20 2330人阅读 评论(1) 收藏 举报 To do that, just log on as ...
- VulnHub-ical打靶记录
这绝对是最简单的一个题目了. 目标发现 netdiscover -r 192.168.0.10/24 根据靶场和本地系统的网段进行扫描. 信息收集 nmap -sV -Pn -sT -sC -A 19 ...
- 从Vue2转换为Vue3
方便的Vue2到Vue3生命周期映射直接来自Vue3 Composition API文档,我认为这是了解事物将如何变化以及如何使用它们的最有用的方法之一. beforeCreate -> use ...
- css 中的BFC
一.是什么 我们在页面布局的时候,经常出现以下情况: 这个元素高度怎么没了? 这两栏布局怎么没法自适应? 这两个元素的间距怎么有点奇怪的样子? ...... 归根究底是元素之间相互的影响,导致了意料之 ...
- 力扣523(java&python)-连续的子数组和(中等)
题目: 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数.如果存在,返回 true ...
- 五福背后的 Web 3D 引擎 Oasis Engine 正式开源
简介: Oasis 从开源走向新的起点,用 3D 化的交互和表达让世界变得更美好. 相信大家已经体验了今年支付宝五福的活动,无论是今年的五福首页还是打年兽游戏都是由蚂蚁互动图形引擎(代号:Oasis ...
- 【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )
简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta L ...
- [ML] Google colab GPU 免费使用, 可挂载 Google drive
colab 的文本行就相当于命令行,命令统一都在前面加 ! . 开启 GPU 加速,通过菜单栏的 "修改" 菜单,选择 "笔记本设置". 挂载 Google d ...