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

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

关于使用redis保存最近浏览的商品数据,之前没想到的是,cookie和redis存在本质上的区别。如果使用如本文中所述的方法存储该数据,所有用户共享的是一份数据,为了解决这个问题,必须在设置key时带上用户的id值或是其他可以区分用户的数据,不过又存在另一个问题,那便是用户未登录的时候怎么处理,本文并未做深入讨论,读者权当温习了一遍redis的list的操作吧。。。敲打敲打敲打敲打敲打

在我们网上购物时,经常能看到那些电商网站通常都有一个叫做“最近浏览过的商品”这样的功能模块,如果你曾经接触过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 />
<?php
require_once "functions.php";

echo getResentViews();

商品详情页:

<?php
require_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

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



  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值