首页 > 数据库 >编程日记 更改redis存储默认序列化器

编程日记 更改redis存储默认序列化器

时间:2024-09-17 23:34:53浏览次数:11  
标签:缓存 编程 redis valueOperations org import 序列化 redisTemplate

编程日记 更改redis存储默认序列化器

package com.haole.usercenter.service;

import com.haole.usercenter.model.domain.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

/**
 * Redis 测试
 *
 */
@SpringBootTest
public class RedisTest {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void test() {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        // 增
        valueOperations.set("yupiString", "dog");
        valueOperations.set("yupiInt", 1);
        valueOperations.set("yupiDouble", 2.0);
        User user = new User();
        user.setId(1L);
        user.setUsername("yupi");
        valueOperations.set("yupiUser", user);
        // 查
        Object yupi = valueOperations.get("yupiString");
        Assertions.assertTrue("dog".equals((String) yupi));
        yupi = valueOperations.get("yupiInt");
        Assertions.assertTrue(1 == (Integer) yupi);
        yupi = valueOperations.get("yupiDouble");
        Assertions.assertTrue(2.0 == (Double) yupi);
        System.out.println(valueOperations.get("yupiUser"));
        valueOperations.set("yupiString", "dog");
        redisTemplate.delete("yupiString");
    }
}

image-20240917233913247

由于redis的增数据操作中使用java默认的序列化器jdk序列化器,会导致在QuickRedis界面显示的数据是乱码

解决方案:重新定义redis对象,指定序列化器为redisTemplate.setKeySerializer(RedisSerializer.string());

package com.haole.usercenter.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * RedisTemplate 配置
 *
 */
@Configuration
public class RedisTemplateConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(RedisSerializer.string());
        return redisTemplate;
    }
}

image-20240917233922411

由于传递的是对象,还是有乱码,不过序列化问题解决了

​ 以下代码为使用redis缓存加快recommend主页推荐的速度(如果有缓存直接查缓存,没有的话就写入缓存)注意redis缓存要设置过期时间valueOperations.set(redisKey, userPage, 30000, TimeUnit.MILLISECONDS);表示缓存过期时间设置为30秒

@GetMapping("/recommend")
    public BaseResponse<Page<User>> recommendUsers(long pageSize, long pageNum, HttpServletRequest request) {
        User loginUser = userService.getLoginUser(request);
        String redisKey = String.format("yupao:user:recommend:%s", loginUser.getId());
        ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
        // 如果有缓存,直接读缓存
        Page<User> userPage = (Page<User>) valueOperations.get(redisKey);
        if (userPage != null) {
            return ResultUtils.success(userPage);
        }
        // 无缓存,查数据库
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        userPage = userService.page(new Page<>(pageNum, pageSize), queryWrapper);
        // 写缓存
        try {
            valueOperations.set(redisKey, userPage, 30000, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            log.error("redis set key error", e);
        }
        return ResultUtils.success(userPage);
    }

标签:缓存,编程,redis,valueOperations,org,import,序列化,redisTemplate
From: https://www.cnblogs.com/vastjoy/p/18417750

相关文章

  • Python 进阶 03 网络编程
    网络编程概述网络编程,又称套接字编程(Socket编程),是实现不同计算机上运行的程序间进行数据交互的关键技术。它允许程序通过网络发送和接收数据,无论这些程序是运行在同一台机器上还是分布在不同地理位置的计算机上。网络编程是现代软件开发中不可或缺的一部分,广泛应用于Web开发、......
  • 用户离线消息的Redis和RabbitMQ解决方案
    一、Redis在Redis中实现用户离线期间的消息接收,可以通过组合使用Redis的发布/订阅(Pub/Sub)功能和List数据结构来实现。具体来说,当用户离线时,可以将发送给该用户的消息存储在List中,待用户上线后再从List中读取消息。下面是一个详细的实现方案:1.设计数据结构为了实现......
  • 四 redis之list
    redis提供的list类型扩展了平时说的列表,不仅可以用来当队列用,还可以当阻塞队列,栈使用.注意:以下命令中涉及删除元素的,当list中最后一个元素被删除了,list也被删除队列队列是一种先进先出的线性数据结构.数据只能从队头出去,从队尾加入.像平时的排队就是队列.每个元素可......
  • 【编程基础】丑数
    题目描述素因子都在集合{2357}的数称为uglynumber求第n大的丑数输入读入N。N<=100000输出输出结果如题所述。样例输入 复制12样例输出 复制15提示50%的数据n<=100100%的数据 n<=100000AC代码:#include<bits/stdc++.h>usingnamespacestd;intIsUgly(i......
  • java线程池编程示例
    程序功能这段代码展示了如何使用Java线程池来并发执行多个任务。通过创建一个固定大小为3的线程池,程序提交了5个任务,并让线程池中的线程并发处理这些任务。每个任务模拟了一个耗时操作,最后程序等待所有任务完成后关闭线程池。代码importjava.util.concurrent.Ex......
  • 3.Java高级编程实用类介绍(一)
    三、Java高级编程实用类介绍(一)文章目录三、Java高级编程实用类介绍(一)一、枚举类型二、包装类三、Math一、枚举类型使用enum进行定义publicenum枚举名字{值1,值2....}二、包装类每个基本类型在java.lang包中都有一个相应的包装类 /* *new包......
  • 4.Java高级编程实用类介绍(二)
    四、Java高级编程实用类介绍(二)文章目录四、Java高级编程实用类介绍(二)一、Random类二、字符串常用方法一、Random类//获得随机数Randomrand=newRand();System.out.println(rand.nextInt(100));//获得20-35的随机数Sytem.out.println(rand.nextInt......
  • 网络编程速递小项目
    一.项目需求功能描述:仿照顺丰速运功能,实现一个自己的速递项目。自行定义项目名,最终可以提现到简历中服务器:处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。用户客户端:实现账号的注册、登录、注销、修改用户密码功能,当登录成......
  • STM32F407单片机编程入门(三)ADC详解及实战含源码
    文章目录一.概要二.STM32F407VET6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式五.CubeMX配置一个ADC采集例程六.CubeMX......
  • “序列化”与 “反序列化”
    学习Rustweb的过程中,前后端处理数据的过程中,要用到serde这个库,科普了一下这是Rust序列化、反序列化的方案,新的疑惑来了,什么是序列化、反序列化?概念序列化和反序列化,是计算机中用于数据存储和传输的重要概念。序列化(Serialization)是将数据结构或对象转换成一种可存储、......