首页 > 其他 > 详细

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

时间:2015-09-21 02:01:43      阅读:382      评论:0      收藏:0      [点我收藏+]

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

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

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

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

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

具体的实现代码:

商品列表页:

?

  1. <a?href="detail.php?p=a">a</a><br?/>??
  2. <a?href="detail.php?p=b">b</a><br?/>??
  3. <a?href="detail.php?p=c">c</a><br?/>??
  4. <a?href="detail.php?p=d">d</a><br?/>??
  5. <a?href="detail.php?p=e">e</a><br?/>??
  6. <a?href="detail.php?p=f">f</a><br?/>??
  7. ??
  8. 您最近浏览过的商品:<br?/>??
  9. <?php??
  10. require_once?"functions.php";??
  11. ??
  12. echo?getResentViews();??
<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();


商品详情页:

?

?

  1. <?php??
  2. require_once?"functions.php";??
  3. ??
  4. echo?$_GET[‘p‘];??
  5. ??
  6. setResentViews($_GET[‘p‘]);??
<?php
require_once "functions.php";

echo $_GET[‘p‘];

setResentViews($_GET[‘p‘]);

公用函数类库

?

?

  1. <?php??
  2. //设定最近浏览过的商品??
  3. function?setResentViews($product){??
  4. ????$resentViews?=?isset($_COOKIE[‘resentViews‘])???explode(‘,‘,?$_COOKIE[‘resentViews‘])?:?array();??
  5. ????//如果已经存在,则删除之前的记录??
  6. ????$temp?=?array_flip($resentViews);??
  7. ????unset($temp[$product]);??
  8. ????$resentViews?=?array_flip($temp);??
  9. ????if(count($resentViews)?==?5){???//??超过了需要展示的最大数量,删除最早添加的记录??
  10. ????????array_shift($resentViews);??
  11. ????}??
  12. ????array_push($resentViews,?$product);??
  13. ????setcookie?(?"resentViews"?,??implode(‘,‘,?$resentViews)?,??time?()+?3600?);???
  14. }??
<?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 ); 
}

  1. //获取最近浏览过的商品??
  2. function?getResentViews(){??
  3. ????$strToBeReturned?=?‘‘;??
  4. ????$resentViews?=?isset($_COOKIE[‘resentViews‘])???explode(‘,‘,?$_COOKIE[‘resentViews‘])?:?array();??
  5. ????foreach($resentViews?as?$resentView){??
  6. ????????$strToBeReturned.=?$resentView."<br?/>";??
  7. ????}??
  8. ????return?$strToBeReturned;??
  9. }??
//获取最近浏览过的商品
function getResentViews(){
	$strToBeReturned = ‘‘;
	$resentViews = isset($_COOKIE[‘resentViews‘]) ? explode(‘,‘, $_COOKIE[‘resentViews‘]) : array();
	foreach($resentViews as $resentView){
		$strToBeReturned.= $resentView."<br />";
	}
	return $strToBeReturned;
}


测试页面截图:

?

bubuko.com,布布扣

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

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

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

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

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

  1. <?php??
  2. //设定最近浏览过的商品??
  3. function?setResentViews($product){??
  4. ????$resentViews?=?isset($_COOKIE[‘resentViews‘])???explode(‘,‘,?$_COOKIE[‘resentViews‘])?:?array();??
  5. ????//如果已经存在,则删除之前的记录??
  6. ????$temp?=?array_flip($resentViews);??
  7. ????unset($temp[$product]);??
  8. ????$resentViews?=?array_flip($temp);??
  9. ????if(count($resentViews)?==?5){???//??超过了需要展示的最大数量,删除最早添加的记录??
  10. ????????array_shift($resentViews);??
  11. ????}??
  12. ????array_push($resentViews,?$product);??
  13. ????setcookie?(?"resentViews"?,??implode(‘,‘,?$resentViews)?,??time?()+?3600?);???
  14. }??
  15. ??
  16. function?getResentViews(){??
  17. ????$strToBeReturned?=?‘‘;??
  18. ????$resentViews?=?isset($_COOKIE[‘resentViews‘])???explode(‘,‘,?$_COOKIE[‘resentViews‘])?:?array();??
  19. ????foreach($resentViews?as?$resentView){??
  20. ????????$strToBeReturned.=?$resentView."<br?/>";??
  21. ????}??
  22. ????return?$strToBeReturned;??
  23. }??
  24. ??
  25. function?setResentViewsIntoRedis($product){??
  26. ????require_once?‘iredis.php‘;????
  27. ????$redis?=?new?iredis();??
  28. ????$key?=?"resentViewedItems";??
  29. ??????
  30. ??
  31. ????//如果已经存在,则删除之前的记录??
  32. ????$redis->lrem($key,?$product,?0);??
  33. ??
  34. ????//超过了需要展示的最大数量,删除最早添加的记录??
  35. ????if($redis->llen($key)?>=?5){??
  36. ????????$redis->lpop($key);??
  37. ????}??
  38. ????$redis->rpush($key,?$product);??
  39. }??
  40. ??
  41. function?getResentViewsFromRedis(){??
  42. ????require_once?‘iredis.php‘;??
  43. ????$redis?=?new?iredis();??
  44. ????$key?=?"resentViewedItems";??
  45. ??
  46. ????$resentViews?=?$redis->lrange($key,?0,-1);??
  47. ??
  48. ????$strToBeReturned?=?‘‘;??
  49. ????foreach($resentViews?as?$resentView){??
  50. ????????$strToBeReturned.=?$resentView."<br?/>";??
  51. ????}??
  52. ????return?$strToBeReturned;??
  53. }??
<?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

?

  1. <?php??
  2. class?iredis?extends?Redis??
  3. {??
  4. ????public?function?__construct(){??
  5. ????????parent::__construct();??
  6. ????????$this->connect(‘127.0.0.1‘,?‘6379‘);??
  7. ????}??
  8. }??
<?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即可。

bubuko.com,布布扣
获取【下载地址】? ?QQ: 313596790? ?【免费支持更新】
A 代码生成器(开发利器);? ? B 阿里巴巴数据库连接池druid;
??数据库连接池??阿里巴巴的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势
C 安全权限框架shiro ;??D ehcache 自定义二级缓存;
E 微信接口开发(后续会加入Activiti5 工作流 )免费升级
-------------------------------------------------------------------------------------------------------------------------
1. 模块化、服务化,流程化,耦合度低、扩展性好,灵活度高,工具类封装完整,干净利索,调用简单方便
2. 提供Rest服务,支持APP手机应用(android和ios)接口、php、.net、易语言、VB等第三方接口调用
3. 全新高大尚HTML5+css3.0+bootstrap响应式开发界面UI,( 手机 PC 平板 截图在下面)、前沿.??spring restful 风格
4. 框架搭建完善成熟,在此基础上做过很多项目,系统具有并发处理、分布式、稳定性。
5. 系统功能完善,此为框架平台,文档、注释齐全,提供技术支持,专门供二次开发
6. 在此基础上可二次开发(OA、ERP、CRM ,医疗管理、金融、网站后台、APP后台、电子商务、商城(赠送UI)等等

7.我们这边是公司,主要业务是定制开发,??此系统为我们平时给客户做项目用的,经过很多项目实战考验
??-------------------------------------------------------------------------------------------------------------------------系统模块
1. 组织管理:角色管理,分角色组和成员,有组权限和成员权限。
2. 系统用户:对各个基本的组会员增删改查,单发、群发邮件短信,导入导出excel表格,批量删除
3. 会员管理:对前台用户管理,分配会员级别,到期时间,状态,联系信息等资料
4. 菜单管理:增删改查菜单 ztree(自定义菜单)业务菜单和系统菜单分离
5. 数据字典:无限级别,支持多级别无限分类。内设编号,排序等
6. 系统设置:修改系统名称,邮件服务器配置,短信账号设置,图片水印配置,微信配置
7. 代码生成:打开代码生成器模块? ???
8. 图库管理:对批量上传的图片统一管理
9. 性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等
10. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间
11. 发送邮件:单发,群发邮件? ?
12. 置二维码:生成 or??解析二维码? ???
13.地图工具:经纬度操作
14.即时通讯:打开即时聊天

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

原文:http://da29291673.iteye.com/blog/2244904

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!