目录

概述

配置Windows版本的redis

创建工程

??

配置redis信息

??

Redis操作(RedisTemplate)

RedisTemplate里的方法

??

?添加数据到redis

从redis获取数据

?测试

?查看客户端有乱码

Redis操作(StringRedisTemplate)

对比 StringRedisTemplate 和 RedisTemplate

设置RedisTemplate序列化就不会乱码了


概述

Redis : 一个NoSQL数据库, 常用作 缓存使用 (cache)。

Redis的数据类型: string , hash ,set ,zset , list。

Redis是一个中间件: 是一个独立的服务器。

java中著名的客户端: Jedis , lettuce , Redisson。

Spring,SpringBoot中有 一个RedisTemplate(StringRedisTemplate) ,处理和redis交互。

配置Windows版本的redis

**说明:**如果在实际开发中使用redis的话要在Linux服务器上使用,我之前的文章也介绍过如何在Linux操作系统下安装redis。这里是为了偷懒(Linux虚拟机删掉了)就搞了一个windows版本的redis。

创建工程

RedisTemplate 使用的 lettuce 客户端库

org.springframework.boot spring-boot-starter-data-redis data-redis使用的 lettuce 客户端库

在程序中使用RedisTemplate类的方法 操作redis数据, 实际就是调用的lettuce 客户端的中的方法

配置redis信息

Redis操作(RedisTemplate)

RedisTemplate里的方法

添加数据到redis

创建一个Controller来进行操作

package com.redistest.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author summer
 * @date 2022-05-05  9:31
 */
@RestController
public class RedisController {

    /**
     * 注入redistemplate,名字最好跟我保持一致,因为框架
     * 会创建一个跟这个名字一样的对象,这样根据名字来找比较好
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 添加数据到redis,这里添加的是String
     * */
    @PostMapping("/addData")
    public String addData() {
        //添加String类型的数据先获取ValueOperations对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("name","lisi哈");
        return "add Success";
    }
}

从redis获取数据

在Controller中添加方法

测试

使用postman工具

查看客户端有乱码

Redis操作(StringRedisTemplate)

我们使用StringRedisTemplate看是否会有乱码呢?

客户端查看不乱码

对比 StringRedisTemplate 和 RedisTemplate

StringRedisTemplate : 把k,v 都是作为String处理, 使用的是String的序列化 , 可读性好

RedisTemplate : 把k,v 经过了序列化存到redis。 k,v 是序列化的内容, 不能直接识别.

默认使用的jdk序列化, 可以修改为前提的序列化

设置RedisTemplate序列化就不会乱码了

package com.redistest.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
//key序列化方式
        template.setKeySerializer(redisSerializer);
//value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐