【实验记录】——Redis存储用户信息

Redis配置类
实现序列化

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

    @Bean
    public DefaultRedisScript<Boolean> script() {
        DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
        redisScript.setLocation(new ClassPathResource("lock.lua"));
        redisScript.setResultType(Boolean.class);
        return redisScript;
    }
}

将用户信息存入session

redisTemplate.opsForValue().set("user:" + ticket, user);

UserServiceImpl
根据Cookie获取用户

@Override
    public User getUserByCookie(String userTicket, HttpServletRequest request, HttpServletResponse response) {
        if (!StringUtils.hasText(userTicket)) {
            return null;
        }
        User user = (User) redisTemplate.opsForValue().get("user:" + userTicket);
        if (user != null) {
            CookieUtil.setCookie(request, response, "userTicket", userTicket);
        }
        return user;
    }

GoodsController

@RequestMapping("/toList")
    public String toList(HttpServletRequest request, HttpServletResponse response, Model model, @CookieValue("userTicket") String ticket) {
    	if (StringUtils.isEmpty(ticket)) {
    		return "login";
    	}
    	User user = userService.getUserByCookie(ticket, request, response);
    	if (null == user) {
    		return "login";
    	}
        model.addAttribute("user", user);
        return "goodsList";
    }
### Redis 实验报告示例 #### 一、实验背景与目的 为了评估Redis作为内存数据库在高并发场景下的性能表现,本次实验旨在验证其处理大量读写请求的能力以及数据持久化的可靠性[^1]。 #### 二、环境搭建 - **硬件配置**:采用两台服务器节点,每台配备8核CPU, 32GB RAM。 - **软件版本**:操作系统CentOS 7.9;Redis 版本6.0.9。 - **网络设置**:通过千兆网卡连接至同一局域网内,确保低延迟通信。 #### 三、测试方案设计 ##### (一)压力测试工具的选择 选用`redis-benchmark`命令行工具来模拟客户端向服务端发起大量的GET/SET操作,以此检验系统的最大吞吐量和响应时间。该工具支持多线程并行执行,能够有效模拟真实业务中的并发访问情况[^2]。 ##### (二)具体参数设定 | 参数名称 | 描述 | | --- | --- | | `-c` | 客户端数量,默认为50个 | | `-n` | 请求总数,默认发送10万次请求 | | `-t` | 测试类型,可指定get,set等 | ```bash $ redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000 -t set,get ``` 上述命令表示启动100个客户端进程,总共发出十万条set/get指令给位于本地主机上的Redis实例。 #### 四、结果分析 经过多次重复试验,在保持其他条件不变的情况下调整不同的客户端数目(c),记录下平均每次请求所需的时间(ms)如下表所示: | 并发数(Clients) | Set (ms) | Get (ms) | | -------------- | -------- | -------- | | 5 | 0.4 | 0.3 | | 50 | 0.6 | 0.5 | | 100 | 0.8 | 0.7 | | 500 | 1.5 | 1.4 | | 1000 | 2.8 | 2.7 | 随着并发用户的增加,单次请求耗时呈现缓慢上升趋势,但在合理范围内波动不大,证明了Redis具备良好的横向扩展能力[^3]。 #### 五、结论 综上所述,通过对不同负载条件下Redis性能指标的研究发现,即使面对极高频率的数据交互需求,依然可以稳定运行且效率较高。这表明Redis非常适合应用于缓存层构建或是实时数据分析等领域之中。 --- ### 案例研究:某电商平台使用Redis优化购物车功能 #### 场景描述 一家大型电商网站面临的主要挑战之一是如何提高用户体验的同时降低服务器成本。传统关系型数据库难以满足快速增删改查商品列表的需求,尤其是在促销活动期间可能会造成严重的瓶颈效应。为此引入了NoSQL解决方案——Redis作为分布式缓存机制的一部分,专门用来存储临时性的会话信息和个人化推荐等内容[^4]。 #### 解决方法 - 将用户浏览历史、收藏夹项目以及其他个性化偏好保存到Redis中; - 利用其内置的过期策略自动清理长时间未更新的数据项; - 结合Lua脚本实现复杂查询逻辑的一致性和原子性保障; - 配置主从复制架构增强可用性和容错率。 #### 效果对比 实施前后主要性能指标变化明显: | 序号 | 关键点 | 改造前 | 改造后 | | ---- | ------------- | ----------- | ------------ | | 1 | 页面加载速度 | 平均需等待3秒以上 | 几乎瞬间完成 | | 2 | 数据库I/O次数 | 单位时间内数千次 | 大幅减少约9成左右| | 3 | CPU利用率 | 维持高位运转状态 | 显著下降趋于平稳| 由此可见,借助于Redis强大的特性不仅解决了原有系统存在的诸多痛点问题,还进一步提升了整体的服务质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值