SpringBoot中集成Redis

这篇具有很好参考价值的文章主要介绍了SpringBoot中集成Redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

在原有SpringBoot项目中,集成Redis,并实现Dao层,Service层,Controller层。

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

使用Spring Boot的Redis依赖。

application-dev.yaml

spring:
  redis:
    host: ${REDIS_HOST:localhost}
    port: ${REDIS_PORT:6379}
    database: 0
    password: ${REDIS_PASSWORD}

RedisConfig.java



import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author zyl
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用jackson的序列化方式
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

这里配置使用redis的链接池,以及key,hash key和数据存储使用的序列化方式。

Domain层

City.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author zyl
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class City implements Serializable {
    private Long id;

    private String name;

    private String state;

    private String country;
}

注意:这里要实现Serializable接口,只有这样,我们这里使用的Redis依赖库才能够正常使用。

Dao层

CityDao.java

/**
 * @author zyl
 */
public interface CityDao {
    void save(City city);
    City findById(Long id);

    void delete(Long id);
}

上面是Dao的定义层,下面来看看Dao的实现层:

CityDaoImpl.java

import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @author zyl
 */
@Repository
public class CityDaoImpl implements CityDao {
    private static final String HASH_REFERENCE = "City";

    @Resource
    private RedisTemplate<String, City> redisTemplate;

    @Override
    public void save(City city) {
        Long id = city.getId();
        String key = HASH_REFERENCE + "_" + id;
        BoundHashOperations<String, Long, City> boundHashOperations = redisTemplate.boundHashOps(key);
        boundHashOperations.putIfAbsent(id, city);
        boundHashOperations.expire(60, TimeUnit.SECONDS);
    }

    @Override
    public City findById(Long id) {
        String key = HASH_REFERENCE + "_" +id;
        BoundHashOperations<String, Long, City> boundHashOperations = redisTemplate.boundHashOps(key);
        return boundHashOperations.get(id);
    }

    @Override
    public void delete(Long id) {
        String key = HASH_REFERENCE + "_" +id;
        BoundHashOperations<String, Long, City> boundHashOperations = redisTemplate.boundHashOps(key);
        boundHashOperations.delete(id);
    }
}

注意这里重点是通过BoundHashOperations类来实现Redis相关对象的操作。BoundHashOperations类是操作Redis的重点类。如果使用通过HashOperations类让redis里面的数据过期处理,有点麻烦,故这里使用BoundHashOperations类处理。

VO层

ApiRes.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

/**
 * 通用响应类
 * @author zyl
 */
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class ApiRes<T> {
    private int status = HttpStatus.OK.value();
    private String message;
    private T data;

    public static final String SUCCESS_MSG = "操作成功";
    public static final String ERROR_MSG = "操作成功";

    /**
     * 返回成功数据
     * @author zyl
     * @return 成功消息
     */
    public static <T> ApiRes<T> success(T data)
    {
        return ApiRes.success(SUCCESS_MSG, data);
    }

    /**
     * 返回成功消息
     * @author zyl
     * @param msg 返回内容
     * @return 成功消息
     */
    public static <T> ApiRes<T> success(String msg)
    {
        return ApiRes.success(msg, null);
    }

    /**
     * 返回成功消息
     * @author zyl
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static <T> ApiRes<T> success(String msg, T data)
    {
        return new ApiRes<>(HttpStatus.OK.value(), msg, data);
    }

    /**
     * 返回错误消息
     * @author zyl
     */
    public static <T> ApiRes<T> error()
    {
        return ApiRes.error(ERROR_MSG);
    }

    /**
     * 返回错误消息
     * @author zyl
     * @param msg 返回内容
     * @return 警告消息
     */
    public static <T> ApiRes<T> error(String msg)
    {
        return ApiRes.error(msg, null);
    }

    /**
     * 返回错误消息
     * @author zyl
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static <T> ApiRes<T> error(String msg, T data)
    {
        return new ApiRes<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg, data);
    }

    /**
     * 返回错误消息
     * @author zyl
     * @param msg 返回内容
     * @param code 响应编码
     * @return 警告消息
     */
    public static <T> ApiRes<T> error(int code, String msg)
    {
        return new ApiRes<>(code, msg, null);
    }
}

这里定义实现了统一响应VO,下面继续实现定义City的响应VO:

CityRes.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author zyl
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class CityRes {
    private Long id;

    private String name;

    private String state;

    private String country;
}

City响应VO定义实现。

Service层

CityService.java

/**
 * 测试city模板
 * @author zyl
 */
public interface CityService {

    ApiRes<CityRes> findByState(String state);

    ApiRes<CityRes> findById(Long id);

    void delete(Long id);
}

CityServiceImpl.java

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author zyl
 */
@Service
public class CityServiceImpl implements CityService {

    @Resource
    private CityMapper cityMapper;

    @Resource
    private CityDao cityDao;
    @Override
    public ApiRes<CityRes> findByState(String state) {
        City city = cityMapper.findByState(state);
        if (city == null) {
            throw new HandleException("没有找到城市数据");
        }
        CityRes cityRes = CityRes.builder().build();
        BeanUtils.copyProperties(city, cityRes);
        return ApiRes.success(cityRes);
    }

    @Override
    public ApiRes<CityRes> findById(Long id) {
        // 先查缓存
        City city = cityDao.findById(id);
        if (city == null) {
            // 查数据库
            city = cityMapper.findById(id);
            if (city != null) {
                // 更新缓存
                cityDao.save(city);
            }
        }

        if (city == null) {
            throw new HandleException("没有找到城市数据");
        }
        CityRes cityRes = CityRes.builder().build();
        BeanUtils.copyProperties(city, cityRes);
        return ApiRes.success(cityRes);
    }

    @Override
    public void delete(Long id) {
        cityMapper.delete(id);
        cityDao.delete(id);
    }
}

这里的HandleException类,是自定义异常处理类,这里就不再给出详细实现了。CityMapper类是mybatis的相关定义实现,这不是这里需要关注的,故也不再给出详细实现了。

Controller层

HelloController.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

/**
 * 测试模板
 * @author zyl
 */
@RefreshScope
@RestController
@RequestMapping("/hello")
public class HelloController {

    @Resource
    private CityService cityService;

    @GetMapping("/city/findById")
    public ResponseEntity<ApiRes<CityRes>> cityFindById(@RequestParam Long id) {
        return ResponseEntity.ok(cityService.findById(id));
    }

    @GetMapping("/city/delete")
    public ResponseEntity<ApiRes<String>> cityDelete(@RequestParam Long id) {
        cityService.delete(id);
        ApiRes<String> apiRes = ApiRes.success("删除成功");
        return ResponseEntity.ok(apiRes);
    }
}

SQL

drop table if exists city;
create table city (id int primary key auto_increment, name varchar(200), state varchar(200), country varchar(200));
insert into city (name, state, country) values ('San Francisco', 'CA', 'US');
insert into city (name, state, country) values ('San Francisco2', 'CA2', 'US2');

测试

这里只看看Redis里面存的数据效果图:

SpringBoot中集成Redis
看看postman中的响应:
SpringBoot中集成Redis

总结

这里主要使用BoundHashOperations类来处理redis中的对象。为什么不使用HashOperations类?因为不能直接使用HashOperations类对对象进行过期时间设置,而BoundHashOperations类可以这弄。这里值得注意的是,我们只能对Redis里面的整个散列进行过期,不能对散列里面的具体key过期。这一点Redis规范要注意一下。具体如下图:
SpringBoot中集成Redis
我们能对1过期,但是不能对2进行过期处理。HashOperations类就是把多个对象存在一个1里面,我们这里为了实现单个对象过期处理,就只能使用BoundHashOperations类,在一个1里面存一个对象,这样实现对一个对象的redis过期。
总的来说,BoundHashOperations类可以自己过期Redis数据,HashOperations类没有直接过期数据方法。文章来源地址https://www.toymoban.com/news/detail-491814.html

参考:

  • Redis hashes
  • Spring boot redis javadoc
  • Spring Boot Redis CRUD Example

到了这里,关于SpringBoot中集成Redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot3集成Redis

    目录 一、简介 二、工程搭建 1、工程结构 2、依赖管理 3、Redis配置 三、Redis用法 1、环境搭建 2、数据类型 3、加锁机制 四、Mybatis缓存 1、基础配置 2、自定义实现 五、参考源码 标签:Redis.Mybatis.Lock; 缓存在项目开发中,基本上是必选组件之一,Redis作为一个 key-value 存储系

    2024年02月13日
    浏览(27)
  • 【极光系列】springboot集成redis

    tips:主要用于快速搭建环境以及部署项目入门 1.下载资源包 2.配置环境变量 3.启动redis服务 4.设置密码 配置路径在解压目录下:E:redisredis.windows.conf,在配置文件中找到 # requirepass foobared,然后在下面增加一行requirepass 后面即是你需要定义的密码,我定义的是aurora:requirepa

    2024年01月16日
    浏览(25)
  • SpringBoot集成Redis的环境部署以及操作Redis

    添加redis依赖 在老项目添加,可以在pom.xml文件直接添加,通过edit starters插件在plugins可以下载 搜索redis,选择第一个点击add如何点击ok,即可。如果创建新项目,可以直接在创建时搜索redis依赖添加 配置连接信息,host为连接的地址,port为端口号默认为6379,database选择的数据库

    2024年02月15日
    浏览(25)
  • SpringBoot集成Redis及问题解决

    此篇文章为SpringBoot集成Redis的简单介绍,依赖、序列化操作、工具类都可以在后面的实操中直接搬运使用或者在此基础上进行改进使用 1、集成Redis 1.1、新建SpringBoot项目 新建项目这边就不一一介绍了,大家如果还有不会的可以自行搜索 这边主要贴一下这个demo的依赖以及app

    2023年04月11日
    浏览(26)
  • springboot如何集成redis哨兵集群?

    redis主从集群和redis sentinel集群都配置完毕了, 现在我们需要了解spring boot 如何连接上该集群 才能用上这两个集群带来的便利 为什么需要关注这个问题? 怎么配置? 记住. 本章是针对redis已经配置了主从集群和哨兵集群的, 而非cluster集群模式 没有 Redis Sentinel 架构之前,如果主节

    2024年02月09日
    浏览(41)
  • SpringBoot集成Redis使用Lettuce

            Redis是最常用的KV数据库,Spring 通过模板方式(RedisTemplate)提供了对Redis的数据查询和操作功能。本文主要介绍基于RedisTemplate + lettuce方式对Redis进行查询和操作的案例。 一、Redis基础数据类型         首先对redis来说,所有的key(键)都是字符串。我们在谈基

    2024年02月05日
    浏览(43)
  • 【Redis】Redis 的学习教程(五)之 SpringBoot 集成 Redis

    在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几个使用 Redis 经常用到的功能: 分布式缓

    2024年02月12日
    浏览(27)
  • 【Redis】Redis 的学习教程(七)之 SpringBoot 集成 Redis

    在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几个使用 Redis 经常用到的功能: 分布式缓

    2024年02月10日
    浏览(25)
  • Redis(发布订阅、事务、redis整合springboot、集成 Spring Cache)

    目录 一.redis的发布订阅 1、什么 是发布和订阅 2、Redis的发布和订阅 3、发布订阅的代码实现 二.Redis事务 1.事务简介 1、在事务执行之前 如果监听的key的值有变化就不能执行 2、在事务执行之前 如果监听的key的值没有变化就能执行 3、Exec之前就出现错误 4、Exec之后出现的错误

    2024年01月24日
    浏览(40)
  • (十九)springboot实战——springboot集成redis实现消息的订阅与发布

    本节内容主要介绍springboot项目通过集成redis,如何利用redis的订阅发布机制,完成系统消息的发布与订阅功能。Redis中的发布与订阅是一种消息通信模式,允许发送者(发布者)将消息发送给多个接收者(订阅者)。在 Redis中,发布与订阅通过PUBLISH和SUBSCRIBE命令实现。 频道(

    2024年02月21日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包