ItGo.me - 专注IT技术分享

首页 > Redis > redis实战之使用redis保存最近浏览的商品数据

redis实战之使用redis保存最近浏览的商品数据

时间:2016-08-28来源:网友分享 点击:

注:本文只做教学目的,而在实际的应用场景中,大型的电商网站的访问量较大,将浏览数据存储于redis中并不可行,望读者知悉。

在我们网上购物时,经常能看到那些电商网站通常都有一个叫做“最近浏览过的商品”这样的功能模块,如果你曾经接触过ecshop,应该很容易就想到这样的功能可以用cookie进行实现。

实现的思路是:用户点击商品详情链接时,在该页面植入一段代码,将该商品在数据库中对应的id号存储到cookie中,此时需要做的逻辑判断有:

1、cookie中是否已经存在该商品id,存在则删除,将该商品编号添加到cookie末尾

2、cookie中存储的商品id是否已经有5个了,如果是则删除最早添加的一个,将该商品编号添加到cookie末尾

具体的实现代码:

商品列表页:

<a href="detail.php?p=a">a</a><br /><a href="detail.php?p=b">b</a><br /><a href="detail.php?p=c">c</a><br /><a href="detail.php?p=d">d</a><br /><a href="detail.php?p=e">e</a><br /><a href="detail.php?p=f">f</a><br />您最近浏览过的商品:<br /><?phprequire_once "functions.php";echo getResentViews();

商品详情页:
<?phprequire_once "functions.php";echo $_GET['p'];setResentViews($_GET['p']);
公用函数类库:
<?php//设定最近浏览过的商品function setResentViews($product){$resentViews = isset($_COOKIE['resentViews']) ? explode(',', $_COOKIE['resentViews']) : array();//如果已经存在,则删除之前的记录$temp = array_flip($resentViews);unset($temp[$product]);$resentViews = array_flip($temp);if(count($resentViews) == 5){//超过了需要展示的最大数量,删除最早添加的记录array_shift($resentViews);}array_push($resentViews, $product);setcookie ( "resentViews" ,  implode(',', $resentViews) ,  time ()+ 3600 );}
//获取最近浏览过的商品function getResentViews(){$strToBeReturned = '';$resentViews = isset($_COOKIE['resentViews']) ? explode(',', $_COOKIE['resentViews']) : array();foreach($resentViews as $resentView){$strToBeReturned.= $resentView."<br />";}return $strToBeReturned;}

测试页面截图:


好,接下来我们来看看使用redis如何实现同样的功能:

使用redis实现该功能与使用cookie实现类似,不同之处在于我们使用了redis的list数据类型来存储数据,主要逻辑如下:

1、判断列表中是否存在该商品,存在则删除(lrem),并将该商品追加到列表末尾(rpush);

2、判断列表中的商品是否已经大于或者等于5个(llen),满足该条件时则将列表头部的商品删除(lpop),将该商品追加到列表末尾(rpush)

主要是functions.php文件的修改,具体实现代码如下:

<?php//设定最近浏览过的商品function setResentViews($product){$resentViews = isset($_COOKIE['resentViews']) ? explode(',', $_COOKIE['resentViews']) : array();//如果已经存在,则删除之前的记录$temp = array_flip($resentViews);unset($temp[$product]);$resentViews = array_flip($temp);if(count($resentViews) == 5){//超过了需要展示的最大数量,删除最早添加的记录array_shift($resentViews);}array_push($resentViews, $product);setcookie ( "resentViews" ,  implode(',', $resentViews) ,  time ()+ 3600 );}function getResentViews(){$strToBeReturned = '';$resentViews = isset($_COOKIE['resentViews']) ? explode(',', $_COOKIE['resentViews']) : array();foreach($resentViews as $resentView){$strToBeReturned.= $resentView."<br />";}return $strToBeReturned;}function setResentViewsIntoRedis($product){require_once 'iredis.php';$redis = new iredis();$key = "resentViewedItems";//如果已经存在,则删除之前的记录$redis->lrem($key, $product, 0);//超过了需要展示的最大数量,删除最早添加的记录if($redis->llen($key) >= 5){$redis->lpop($key);}$redis->rpush($key, $product);}function getResentViewsFromRedis(){require_once 'iredis.php';$redis = new iredis();$key = "resentViewedItems";$resentViews = $redis->lrange($key, 0,-1);$strToBeReturned = '';foreach($resentViews as $resentView){$strToBeReturned.= $resentView."<br />";}return $strToBeReturned;}
iredis.php

<?phpclass iredis extends Redis{public function __construct(){parent::__construct();$this->connect('127.0.0.1', '6379');}}
然后分别将list.php和detail.php中的getResentViews和setResentViews改成getResentViewsFromRedis和setResentViewsIntoRedis即可。


版权声明:本文为博主原创文章,未经博主允许不得转载。

redis实战之使用redis保存最近浏览的商品数据

redis实战之使用redis保存最近浏览的商品数据  讨论


Redis的WEB界面管理工具 phpRedisAdmin

有过传统LAMP经验的同学肯定都对phpmyadmin非常熟悉,phpmyadmin是一个PHP的MySQL WEB管理工具,非常实用也非常好用。而本文要介绍的是一个叫phpRedisAdmin的工具,从名字上你就能看到,它是一个PHP的...

Redis管理工具:Redis Commander

Redis Commander是一个采用 编写的 Redis管理工具。 用法: $ redis-commander --helpOptions:--redis-port The port to find redis on. [string]--redis-host The host to find redis on. [string]--redis-socket The unix-socket to find redis on. [s...

Python的Redis库 ooredis

ooredis是一个Redis的Python库,基于redis-py,它主要有以下三个目标: - 以Key对象为单位操作Redis的数据结构 - 提供一组Pythonic的API - 提供方便的类型转换机制 需求 ==== Python2.7 Redis2.2 redis-py2.4.9 安装...

注:本文只做教学目的,而在实际的应用场景中,大型的电商网站的访问量较大,将浏览数据存储于redis中并不可行,望读者知悉。 在我们网上购物时,经常能看到那些电商网站通常都有一个
------分隔线----------------------------