项目集成Redis

安装redis服务端和客户端

redis服务启动

 

客户端连接

项目集成Redis

1、添加依赖

<!-- spring boot redis缓存引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lecttuce 缓存连接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2、添加redis配置类

package com.stu.service.base.config;

/******************************
 * 用途说明:
 * 作者姓名: Administrator
 * 创建时间: 2022-06-29 23:15
 ******************************/

import org.springframework.cache.CacheManager;
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.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.io.Serializable;
import java.time.Duration;

/**
 * Redis配置
 */
@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        // 配置数据连接池
        redisTemplate.setConnectionFactory(connectionFactory);

        // 序列化自定义
        // key 的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value 的序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) {

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                //过期时间600秒
                .entryTtl(Duration.ofSeconds(600))
                // 配置序列化
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

}

3、在接口中添加redis缓存

3.1 Spring Boot缓存注解

(1)缓存@Cacheable

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

查看源码,属性值如下:

属性/方法名解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key

(2)缓存@CachePut

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

查看源码,属性值如下:

属性/方法名解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key

(3)缓存@CacheEvict

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上

查看源码,属性值如下:

属性/方法名解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
allEntries 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
beforeInvocation 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

3.2 接口改造

(1)在配置文件添加redis配置

spring节点下

  redis: # redis 配置
    host: 127.0.0.1
    port: 6379
    database: 0
    password:  #默认为空
    lettuce:
      pool:
        max-active: 20  #最大连接数,负值表示没有限制,默认8
        max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1
        max-idle: 8     #最大空闲连接,默认8
        min-idle: 0     #最小空闲连接,默认0

(2)修改AdServiceImpl.java,添加redis缓存注解

package com.stu.service.cms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.stu.service.base.result.R;
import com.stu.service.cms.entity.Ad;
import com.stu.service.cms.entity.vo.AdVo;
import com.stu.service.cms.feign.OssRemoveFileService;
import com.stu.service.cms.mapper.AdMapper;
import com.stu.service.cms.service.AdService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 广告推荐 服务实现类
 * </p>
 *
 * @author stu
 * @since 2022-06-15
 */
@Service
public class AdServiceImpl extends ServiceImpl<AdMapper, Ad> implements AdService {

    @Autowired
    private OssRemoveFileService ossRemoveFileService;

    /***********************************
     * 用途说明:广告位分页
     * @param page
     * @param limit
     * 返回值说明:
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.stu.service.cms.entity.vo.AdVo>
     ***********************************/
    @Override
    public IPage<AdVo> pageList(Long page, Long limit) {

        QueryWrapper<AdVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("t1.sort");
        Page<AdVo> pageResult = new Page<>(page, limit);
        List<AdVo> result = baseMapper.pageList(pageResult, queryWrapper);
        pageResult.setRecords(result);

        return pageResult;
    }

    /***********************************
     * 用途说明:删除云端图片
     * @param id,当前图片地址对应的记录的主键
     * 返回值说明:
     * @return boolean
     ***********************************/
    @Override
    public boolean removeAdImgeById(String id) {
        Ad ad = baseMapper.selectById(id);
        if (null == ad) {
            return false;
        }
        if (StringUtils.isNotEmpty(ad.getImageUrl())) {
            R r = ossRemoveFileService.removeFile(ad.getImageUrl());
            if (r.getSuccess()) {
                int result = baseMapper.deleteById(id);
                return result > 0;
            }
        }
        return false;
    }

    /***********************************
     * 用途说明:根据推荐位id取得广告推荐
     * @param adTypeId
     * 返回值说明:
     * @return java.util.List<com.stu.service.cms.entity.Ad>
     ***********************************/
    /*1、查询redis缓存中是否存在需要的数据key
    2、如果不存在,从执行方法将返回值返回并存到redis
    3、如果存在,从redis里读取数据*/
    @Cacheable(value="index",key="'listAdTypes'")
    @Override
    public List<Ad> listAdTypes(String adTypeId) {
        QueryWrapper<Ad> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("type_id",adTypeId);

        return baseMapper.selectList(queryWrapper);
    }
}

作者:
出处:https://www.cnblogs.com/konglxblog//
版权:本文版权归作者和博客园共有
转载:欢迎转载,文章中请给出原文连接,此文章仅为个人知识学习分享,否则必究法律责任

 

posted @ 2022-10-16 21:49  程序员小明1024  阅读(143)  评论(0编辑  收藏  举报