注:本文只做教学目的,而在实际的应用场景中,大型的电商网站的访问量较大,将浏览数据存储于redis中并不可行,望读者知悉。
关于使用redis保存最近浏览的商品数据,之前没想到的是,cookie和redis存在本质上的区别。如果使用如本文中所述的方法存储该数据,所有用户共享的是一份数据,为了解决这个问题,必须在设置key时带上用户的id值或是其他可以区分用户的数据,不过又存在另一个问题,那便是用户未登录的时候怎么处理,本文并未做深入讨论,读者权当温习了一遍redis的list的操作吧。。。




在我们网上购物时,经常能看到那些电商网站通常都有一个叫做“最近浏览过的商品”这样的功能模块,如果你曾经接触过ecshop,应该很容易就想到这样的功能可以用cookie进行实现。
实现的思路是:用户点击商品详情链接时,在该页面植入一段代码,将该商品在数据库中对应的id号存储到cookie中,此时需要做的逻辑判断有:
1、cookie中是否已经存在该商品id,存在则删除,将该商品编号添加到cookie末尾
2、cookie中存储的商品id是否已经有5个了,如果是则删除最早添加的一个,将该商品编号添加到cookie末尾
具体的实现代码:
商品列表页:
a
b
c
d
e
f
您最近浏览过的商品:
商品详情页:公用函数类库:?
//获取最近浏览过的商品 function getResentViews(){ $strToBeReturned = ''; $resentViews = isset($_COOKIE['resentViews']) ? explode(',', $_COOKIE['resentViews']) : array(); foreach($resentViews as $resentView){ $strToBeReturned.= $resentView."
"; } return $strToBeReturned; }
测试页面截图:?
?好,接下来我们来看看使用redis如何实现同样的功能:
使用redis实现该功能与使用cookie实现类似,不同之处在于我们使用了redis的list数据类型来存储数据,主要逻辑如下:
1、判断列表中是否存在该商品,存在则删除(lrem),并将该商品追加到列表末尾(rpush);
2、判断列表中的商品是否已经大于或者等于5个(llen),满足该条件时则将列表头部的商品删除(lpop),将该商品追加到列表末尾(rpush)
主要是functions.php文件的修改,具体实现代码如下:
"; } 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." "; } return $strToBeReturned; }iredis.php?
connect('127.0.0.1', '6379'); } }然后分别将list.php和detail.php中的getResentViews和setResentViews改成getResentViewsFromRedis和setResentViewsIntoRedis即可。
