<?php
namespace App\Http\Controllers;
use Mockery\Exception;
use \Redis;
class GoodsController extends Controller
{
protected $cate; // 分类
protected $redis; // redis实例
protected $goodsCategoryPrefix = 'goods_category_';
protected $goodsListInfoKey = 'goods_list_info';
protected $goodsCategoryExpireTime = 10; // 分钟
public function __construct()
{
$redis = new Redis;
$redis->connect('127.0.0.1');
$redis->select(6);
$this->redis = $redis;
$this->init();
$this->setGoodsList();
}
/**
* 初始化
*/
public function init()
{
$this->cate = $cate = intval(request('cate', 1));
}
/**
* 商品数据写入redis (维护数据)
*/
public function setGoodsList()
{
$cate = $this->cate;
$goods = [];
$goods[] = ['id' => 1, 'name' => 'asd1', 'price' => 10, 'sales' => 5, 'weight' => 10];
$goods[] = ['id' => 2, 'name' => 'asd2', 'price' => 20, 'sales' => 6, 'weight' => 9];
$goods[] = ['id' => 3, 'name' => 'asd3', 'price' => 30, 'sales' => 7, 'weight' => 5];
$goods[] = ['id' => 4, 'name' => 'asd4', 'price' => 40, 'sales' => 8, 'weight' => 7];
$goods[] = ['id' => 5, 'name' => 'asd5', 'price' => 50, 'sales' => 1, 'weight' => 1];
$goods[] = ['id' => 6, 'name' => 'asd6', 'price' => 50, 'sales' => 5, 'weight' => 5];
$goods[] = ['id' => 7, 'name' => 'asd7', 'price' => 70, 'sales' => 2, 'weight' => 2];
$currentTime = time();
// 初始化导入商品
if (!empty($cate) && $this->redis->hLen($this->goodsListInfoKey) < 1) {
//dd($this->redis->zRange($goodsCateKey ,0 ,-1,true));
//if( $this->redis->ttl($goodsCateKey) < 0){
$goodsHsahData = [];
foreach ($goods as $val) {
$goodsCateKey = $this->goodsCategoryPrefix . 'price_' . $cate;
$this->redis->zAdd($goodsCateKey, $val['price'], $val['id']);
$goodsCateKey = $this->goodsCategoryPrefix . 'sales_' . $cate;
$this->redis->zAdd($goodsCateKey, $val['sales'], $val['id']);
$goodsCateKey = $this->goodsCategoryPrefix . 'weight_' . $cate;
$this->redis->zAdd($goodsCateKey, $val['weight'], $val['id']);
$goodsHsahData[$val['id']] = serialize($val); // 将所有商品信息写入哈希表
}
$this->redis->hMSet($this->goodsListInfoKey, $goodsHsahData);
//$this->redis->expireAt($goodsCateKey, $currentTime + $this->goodsCategoryExpireTime * 60);
//}
}
}
/**
* 排序
* @return array
*/
public function sort()
{
$sortField = request('field', 'weight'); // 排序字段
$sortType = request('order', 'asc'); // 升降序 [ 'asc' , 'desc']
$scoreMin = request('min'); // 分数区间最小值 默认 -inf
$scoreMax = request('max'); // 分数区间最大值 默认 +inf
$page = intval(request('page', 1)); // 分页参数
$cate = $this->cate; // 商品分类
if (!in_array($sortField, ['price', 'sales', 'weight']) ||
!in_array($sortType, ['asc', 'desc'])
) {
throw new Exception('排序参数错误~~~~~~');
}
// 分页偏移
list($start, $end) = $this->setPage($page, 3);
// 分数区间
list($fieldScoreMin, $fieldScoreMax, $isNeedScore) = $this->setScore($scoreMin, $scoreMax);
// 需要排序的有序集合
$sortCateKey = $this->goodsCategoryPrefix . $sortField . '_' . $cate;
if ($sortType == 'asc' && !$isNeedScore) {
// 无区间排序(升序)
$goodsIds = $this->redis->zRange($sortCateKey, $start, $end);
} else if ($sortType == 'desc' && !$isNeedScore) {
// 无区间排序(降序序)
$goodsIds = $this->redis->zRevRange($sortCateKey, $start, $end);
} else if ($sortType == 'asc' && $isNeedScore) {
// 分区排序(升序)
$goodsIds = $this->redis->zRangeByScore($sortCateKey, $fieldScoreMin, $fieldScoreMax,
['limit' => [$start ,$end]]);
} else {
// 分区排序(降序)
$goodsIds = $this->redis->zRevRangeByScore($sortCateKey, $fieldScoreMax, $fieldScoreMin,
['limit' => [$start ,$end],'withscores' => false]);
}
// 从商品列表里面找出对应的商品
$lists = $this->redis->hMGet($this->goodsListInfoKey, $goodsIds);
if(false === $lists){
dd('没找到商品数据');
return [ 'status' => 0 , 'msg' => '没找到商品数据' ];
}
foreach ($lists as &$list) {
$list = json_encode(unserialize($list));
}
dd($lists);
}
/**
* 设置分页
* @param int $page
* @param int $offset
* @return array
*/
public function setPage(int $page = 1, $offset = 10)
{
if ($page < 1) $page = 1;
$start = ($page - 1) * $offset;
$end = $page * $offset;
return [$start, $end];
}
/**
* 设置区间
* @param string $min
* @param string $max
* @return array
*/
public function setScore($min = '-inf', $max = '+inf')
{
$numericMin = $min + 0; // 支持小数
$numericMax = $max + 0;
$isNeedScore = true;
if ((is_null($min) && is_null($max))) {
$isNeedScore = false;
} else if (!is_null($min) && !is_null($max)) {
} else {
$min = is_null($min) ? '-inf' : $numericMin;
$max = is_null($max) ? '+inf' : $numericMax;
}
return [$min, $max, $isNeedScore];
}
}
相关推荐
手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南
本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。
laravel从入门到精通之redis配置和使用
1:首先我们先使用 Composer 安装依赖: $ composer require "predis/predis:~1.0" 2:确保运行环境下已安装redis 具体安装可查看:https://blog.youkuaiyun.com/qq_29099209/article/details/79787067 3:操作说明 3.1:实例化Redis use Illuminate\Suppo...
c764-基于Vue的实时温湿度监控系统
🌟 毕业设计指导交流 🌟 同学们好!作为一名计算机专业的技术爱好者,我在毕业设计领域积累了一些经验,希望能和大家分享交流。从选题到答辩,欢迎一起探讨技术问题。💡 技术方向: 熟悉Java全栈(SSM/Spring Boot)、Python数据分析、微信小程序/安卓开发等技术栈,可以互相学习项目开发经验。📂 学习资源: 整理了一些开源项目案例(含代码和文档),需要参考的同学可以留言讨论,也欢迎分享你的项目经验。🛠 交流内容:✨ 欢迎在评论区留言讨论,一起进步!记得遵守社区规范,保持学术
ecshop产品列表页按订单表销量排序
打开flow.php在 //更新销量到goods表 $goods_number_count=$_POST['goods_id'];//接收goods_id值 foreach($goods_number_count as $It) { $sql_num = 'SELECT sum(goods_number) as number FROM ' . $GLOBALS['ec
【拯救C盘】一文搞懂Windows修改Anaconda默认的虚拟环境存放路径及其原理
Anaconda创建的虚拟环境可能会默认保存在C盘,但C盘的存储空间很宝贵,由于每个虚拟环境的大小可能达到n个GB,稍不注意就会遇到C盘红色警告。因此有必要做点什么来拯救被虚拟环境占用的大部分空间!!!
KUKA机器人 - 从开机到自动运行
注1:本文仅代表本人对机器人使用的一些建议,在使用机器人前,还请详细阅读库卡机器人官方资料,道路千万条,安全第一条!!! 注2:技术有限,欢迎各位大大在阅读过程中发现各类问题,并且批评指正!!! 目录 一、准备工作 1. 机器人上电完成 2. 电脑安装Workvisual 二、学习手动移动机器人 三、项目配置 1. 设置机器人IP地址 2.电脑和机器人通过网线连接 3.查找并打开项目 4. 通讯配置 5. 项目上传 6. 检验IO配置 四、编程 1.新建程序 2. 程序...
laravel 多个orderBy排序
在laravel中需要用到多字段排序时,写在前面的优先级高,写在后面的优先级低,每个排序order都写上倒叙还是升序
Verilog HDL 100道面试题及参考答案
在 Verilog HDL 中,参数(parameter)和宏定义(define)都可用于定义常量,但它们存在诸多不同之处。参数(parameter)是模块内部的常量定义,具有局部性。它在模块内部起作用,不同模块可以有同名的参数,且值可以不同。参数通常用于定义模块的一些配置信息,例如数据位宽、延迟时间等。参数的定义和使用是在模块的作用域内进行的,通过参数传递可以方便地对模块进行配置。endmodule在上述代码中,WIDTH是一个参数,用于定义加法器的位宽。通过改变WIDTH。
redis实现排行榜销量排名功能
redis实现排行榜销量排名功能: https://github.com/kingrocy/springboot/tree/master/springboot-redis
3、灵巧手的设计与构造
本文详细探讨了灵巧手的设计与构造,包括多指结构、关节和连杆设计、传感器集成以及分层控制架构等内容。同时,通过工业装配、医疗手术辅助和日常生活辅助等实际应用案例,展示了灵巧手的灵活性和适应性,并分析了当前设计面临的挑战及未来发展方向。
C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))
1 、题目 计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5)) 2、部分函数说明 C 库函数 double pow(double x, double y) 返回 x 的 y 次幂。 3、源代码实现 #include <stdio.h> #include <...
Laravel自定义排序
如果数据库的status字段有0,1,2,3几种状态,如果想让status为1,2的状态排在最前面 那么可以这样: $obj = $obj->orderByRaw(DB::raw('FIELD(status, 1,2) desc')); 得到的sql是 select * from 表 where 条件 order by FIELD('status',[1,2])...
信号处理算法:离散余弦变换(DCT)_(1).离散余弦变换(DCT)概述
离散余弦变换的数学定义如下:对于一个长度为NNN的离散信号xnx(n)xn,其DCT变换后的系数XkX(k)XkXk∑n0N−1xncosπNn12kk012N−1Xkn0∑N−1xncosNπn21kk012N−1其中,kkk是频率指数,nnn是时间或空间索引。离散余弦变换(DCT)是一种强大的信号处理技术,广泛应用于图像压缩、音频处理、数据压缩等领域。
php笔记之-laravel-Redis hash
hset/hget 存取hash表的数据 $redis->hset('hash1', 'key1', 'v1'); //将key为'key1' value为'v1'的元素存入hash1表 $redis->hset('hash1', 'key2', 'v2'); $redis->hget('hash1', 'key1'); //取出表'hash1'中的ke...
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
laravel中汉字按照首字母排序
//测试【在laravel中的写法:汉字按照首字母排序,数字和字母开头放在最前边】 public function test(){ $school= Customer::orderBy(DB::raw('convert(`name` using gbk)')) ->get() ->Toarray(); ...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
Laravel Eloquent模型分组查询并返回每个分组的数量 groupBy()
Laravel 5.5 Linux mint 18 PHPStorm 最近刚玩Laravel,手册源码还没来得及看完就跃跃欲试做了个小项目,其中有个需求是分组查询数据库中的一个字段并返回每个分组中的数量,还是去翻手册(手册确实够简单): groupBy 和 having 方法可用来对查询结果进行分组。having 方法的用法和 where 方法类似: $users = DB::table
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
销量排序和评价排序
销量排序 销量排序如何排呢?你可能说啦:你的域中肯定要有一个销量的域字段比如item_num,我们现在这个域中没有销量这个字段。现在需要在域中添加这个一个字段: <field name="item_num" type="date" indexed="true" stored="true" /> 现在有了这个域还不行,你得有具体的数字(数据),那么这个数字又如何来做呢?这个数字...
Laravel +Redis 操作命令,步骤
入门级操作 普通 set / get 操作; set操作,如果键名存在,则会覆盖原有的值; $redis = app('redis.connection'); $redis->set('library', 'predis'); // 存储 key 为 library, 值为 predis 的记录; $redis->get('library'); // 获取 key 为 library ...
625



被折叠的 条评论
为什么被折叠?



