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

一、如何使用 Redis 来缓存来实现最近浏览的商品列表?

首先我们要确定一个两个点,最近浏览的商品肯定是一个一个的操作。

那么就可以确定以下几个问题:

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

    这里可以使用缓存(Redis等),缓存可以设置失效时间(最大设置为一个月)。

    如果使用关系型数据库,还需要定时清楚,就很不符合实际需求。

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

    如果使用Redis来实现的话,Redis 中有 LTRM 来修建,以保证存储的浏览条数。

  3. 需要在哪里添加保存浏览商品的方法。

    用户最近浏览的商品,肯定是要在用户打开商品详情页的时候才算浏览。

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

    每次用户的浏览商品的ID,可以以用户的ID作为Key,以 List 作为 value,存储在Redis中,

    而 List 是有序的,并且,在使用 LRANGE 的时候还能保证先进后出,后进先出的原则,以

    达到排列在最前面的商品始终是当前最近浏览的商品。

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

    这里可以使用 Redis 中的 LREM 来移除例表中与参数 value(该商品ID) 想等的元素。

    同时再使用 Lpush 重新再List 中插入最新浏览的商品。

  6. 读取缓存的时候,怎么保证分页?

    Redis 中的 LRANGE 可以指定获取指定长度的元素。

  7. 怎么区别 PC 和 移动端?

    可以让前端根据 PC 和 移动端传不同的code,后台区别code,在 key(用户ID)后面跟上

    特定的字符串来区别。

二、下面是简单的实现思路
  1. 存储用户浏览的商品信息:

    用户在打开商品详情页的时候,以用户ID作为key,商品的Id作为值,以List的形式存到Redis中。

    在加入缓存之前,为了确保浏览商品的唯一性,每次添加之前,使用 LREM 将缓存 List 中的商品id去掉,以保证最新的浏览记录始终在最前面。

    在 Lpush 到 Redis 的list中之后,可以根据需求 保留List中多少条浏览记录

    最后添加缓存失效时间。

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

    根据key(用户ID)及分页数,来获取商品缓存。

三、下面是截取的一段核心代码:
  1. 根据用户ID和商品Id存入到缓存中:

        /**
         * 存一个浏览商品信息
         *
         * @param historyPo
         */
        @PostMapping("/set")
        public void set(@Validated @RequestBody HistoryPo historyPo) {
            String key = getKey(historyPo.getCode(), historyPo.getUserId());
            /* 为了保证浏览商品的 唯一性,每次添加前,将list中该商品ID去掉,再加入,以保证其浏览的最新的商品在最前面 */
            redisService.lrem(key, 1L, historyPo);
            /* 将value push 到该key下的list中 */
            redisService.lpush(key, historyPo);
            /* 浏览记录存5条,五条以后切掉*/
            redisService.lTrim(key, 0L, 4L);
            /* 缓存时间为一个月 */
            redisService.expire(key, DEFAULT_EXPIRE);
        }
    
  2. 根据用户的ID,分页获取最近浏览的商品:
     /**
         * 获取当前用户的浏览历史
         *
         * @param code
         * @param userId
         * @return
         */
    @GetMapping("/all/{code}/{userId}")
    public List<HistoryPo> query(@PathVariable("code") Integer code, @PathVariable("userId") Long userId) {
        String key = getKey(code, userId);
        //这里可支持分页 start and end
        return redisService.lrange(key, 0L, 9999L);
    
        /* 以下代码解决json反序列化之后集合不能操作问题(例如使用Stream)
            String key = getKey(code, userId);
            List<HistoryPo> lrange = redisService.lrange(key, 0L, 9999L);
            JavaType javaType = getCollectionType(LinkedList.class, HistoryPo.class);
            List<HistoryPo> lst = null;
            try {
                lst = mapper.readValue(lrange.toString(), javaType);
            } catch (IOException e) {
                e.printStackTrace();
            }
            */
    }

    项目完整地址:https://github.com/wengzi/others

原文地址:https://www.cnblogs.com/leizzige/p/12354527.html

时间: 2024-10-12 08:43:13

使用 Redis 缓存来实现用户最近浏览的商品列表的相关文章

LAMP+Redis缓存数据库整合

LAMP在企业生产环境中,除了将MYSQL单独部署在其他服务器.由于MYSQL数据库压力会很大,还会对MYSQL实现主从复制及读写分离,同时会对PHP网站进行调优,通常PHP的优化手段包括:PHP代码本身优化.PHP配置文件优化.为PHP添加缓存模块,将PHP网站数据存入缓存等. 为了减轻MYSQL数据库的压力,这时就用到了Redis缓存数据库服务, LAMP+Redis工作机制:用户通过浏览器访问LAMP网站,并以用户名和密码登录到网站,默认Redis缓存中没有该用户名和密码对应列表,PHP程

Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # 用户的session信息,历史浏览记录存储在redis数据库9中 "LOCATION": "redis://127.0.0.1:6379/9", "OPTIONS

redis存储用户历史浏览记录

1:什么时候需要添加浏览记录 访问商品详情页的时候 2:什么时候取出浏览记录 访问用户个人中心的时候 用户查看商品的历史浏览记录存成什么格式: history_用户id:[商品id,商品id] 添加用户浏览记录: # 添加用户的历史记录history_用户id:[商品id,商品id,商品id]conn = get_redis_connection('default')history_key = 'history_%d' % user.id# 用redis的lrem方法将最早的那一条浏览记录移除掉

如何使用redis作为缓存,增强用户访问数据的用户体验

/**完成步骤 1.创建关系型数据库mysql的Provice库,同时启动nosql系列的redis数据库 2.创建项目,导入相关的jar包 3.创建jedis/utils/domain/dao/service/web项目框架包 4.书写相关代码*///页面<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title<

redis(缓存系统)

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装和基本使用 Memcached安装: ? 1 2 3 4 5 6 7 8 wget http://me

39、生鲜电商平台-redis缓存在商品中的设计与架构

说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数. 商品维度计数(喜欢数,评论数,鉴定数,浏览数,etc)  采用Redis 的类型: Hash. 如果你对redis数据类型不太熟悉,可以参考 http://redis.io/topics/data-types-int

缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你.具体来说Cookie机制采用的是在客户端保持状态的方案(保存客户浏览器请求服务器页面

Spring优雅整合Redis缓存

“小明,多系统的session共享,怎么处理?”“Redis缓存啊!” “小明,我想实现一个简单的消息队列?”“Redis缓存啊!” “小明,分布式锁这玩意有什么方案?”“Redis缓存啊!” “小明,公司系统响应如蜗牛,咋整?”“Redis缓存啊!” 本着研究的精神,我们来分析下小明的第四个问题. 准备: Idea2019.03/Gradle6.0.1/Maven3.6.3/JDK11.0.4/Lombok0.28/SpringBoot2.2.4RELEASE/mybatisPlus3.3.0

使用redis缓存加索引处理数据库百万级并发

使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据,这里不再细说.我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错. 贴一下代码吧 1 2 3 4 5 6 7 8 9 10 1