如何使用redis缓存来实现用户最近浏览的商品列表

  如何使用redis缓存来实现用户最近浏览的商品列表

首先,我们要弄明白两个要点:最近浏览的商品肯定是一个存和取的两个操作.好了目前摆在我们面前的有以下几个问题:

          1,最近浏览的记录肯定是需要失效时间的

                确定使用缓存,缓存可以设置失效时间(最大设置为一个月,但是这已经足够了),如果使用mysql等数据库,还需要定时任务清除,很明显是不切合实际的,

          2,最近浏览的记录肯定是有个数限制的,不可能记录所有的浏览记录

                目前使用的主流缓存有 memached和redis两种(原谅无知的我并不清楚其他的),redis有LTRM来修剪,保证存储的浏览的条数;

          3,我们需要在哪里添加保存浏览商品的方法

                用户最近浏览的商品,肯定是再用户最近打开商品详情页的时候才算浏览,这点毋庸置疑;

          4,怎么保证每次添加的浏览的商品列表按着浏览的先后顺序排序?

                每次用户的浏览商品的ID,可以以用户的ID作为key,以List作为value,储存在redis中,而List是有序的,而且,在使用LRANGE的时候能保证先进后出,后进先出的原则,已达到排列在最前面的商品始终是里当前最近浏览的那个商品;

          5,怎么保证用户在连续浏览同一个商品的时候,不会重复保存商品?

              可以使用redis中LREM来移除列表中与参数 value(该商品ID) 相等的元素。同时在使用Lpush重新再List插入最新的浏览商品;

          6,读取缓存的时候,又该如何保证分页?

             redis中的LRANGE可以指定获取指定长度的元素,能够满足需要;

下面是简单的实现思路:

      1,储存用户浏览的商品:

           用户在打开详情页的时候,以用户ID作key,商品的ID做值,以List存入redi缓存中;

           在加入添加缓存之前,为了保证浏览商品的 唯一性,每次添加前,使用lrem将缓存的list中该商品ID去掉,在加入,以保证其浏览的最新的商品在最前面;

           在lpush到redis的List中之后,根据产品需求还需要将该list的前60个数据之外的缓存修剪掉;

           最后添加缓存失效时间30天;

     2.获取用户最近浏览的商品列表:

         根据用户的ID及当前的页数和每页的个数,来获取商品缓存;

下面是最后实现的代码:

    1,根据用户ID和商品Id存入到缓存中:
[java]  view plain  copy
  1. public void addMemberResentGoods(Long memberId, Long templateId) {  
  2.       String key = RedisKeyUtil.generteKeyWithPlaceholder(RedisKeys.MEMBER_RECENT_GOODS, memberId);  
  3.       //为了保证浏览商品的 唯一性,每次添加前,将list 中该 商品ID去掉,在加入,以保证其浏览的最新的商品在最前面  
  4.       redisService.lrem(key, 1, templateId.toString());  
  5.       //将value push 到该key下的list中  
  6.       redisService.lpush(key,templateId.toString());  
  7.       //使用ltrim将60个数据之后的数据剪切掉  
  8.       redisService.lTrim(key,0,59);  
  9.       //设置缓存时间为一个月  
  10.       redisService.expire(key,60*60*24*30);  
  11.   }  
    2,根据用户的ID,分页获取最近浏览的商品:
[java]  view plain  copy
  1. public Map<String,Object> queryMemberResentGoods(Long memberId, int page, int pageSize) {  
  2.       String key = RedisKeyUtil.generteKeyWithPlaceholder(RedisKeys.MEMBER_RECENT_GOODS, memberId);  
  3.       //获取用户的浏览的商品的总页数;  
  4.       long pageCount = redisService.llen(key);  
  5.       //根据用户的ID分頁获取该用户最近浏览的50个商品信息  
  6.       List<String> result = redisService.lrange(key,(page-1)*pageSize,page*pageSize-1);  
  7.       //拼装返回  
  8.       Map<String,Object> map = new HashMap<>();  
  9.       map.put("result",result);  
  10.       map.put("pageCount",(pageCount%pageSize == 0 ? pageCount/pageSize : pageCount/pageSize+1));  
  11.       return map;  
  12.   }  
  13. 宁波眼部整形http://www.iyestar.com/ybzx/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值