Caffeine本地缓存&圈子功能开发

1.环境搭建

1.pom.xml引入依赖
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.8.2</version>
        </dependency>
2.使用EasyCode生成crud
1.配置

CleanShot 2024-07-15 at 11.53.33@2x

2.service 引入正确的PageResult

CleanShot 2024-07-15 at 11.56.15@2x

3.ShareCircleController.java 全局替换ResponseEntity 为自己的响应类

CleanShot 2024-07-15 at 11.58.58@2x

2.圈子功能开发

1.新增圈子
1.Req和Vo
1.SaveShareCircleReq.java
package com.sunxiansheng.circle.api.req;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * <p>
 * 圈子信息
 * </p>
 *
 * @author ChickenWing
 * @since 2024/05/16
 */
@Getter
@Setter
public class SaveShareCircleReq implements Serializable {

    /**
     * 圈子名称
     */
    private String circleName;

    /**
     * 圈子图标
     */
    private String icon;

    /**
     * -1为一级,分类ID
     */
    private Long parentId = -1L;

}

2.ShareCircleVO.java
package com.sunxiansheng.circle.api.vo;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class ShareCircleVO implements Serializable {

    /**
     * 圈子ID
     */
    private Long id;

    /**
     * 圈子名称
     */
    private String circleName;

    /**
     * 圈子图标
     */
    private String icon;

    /**
     * 子对象
     */
    private List<ShareCircleVO> children;

}
2.ShareCircleController.java
package com.sunxiansheng.circle.server.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.sunxiansheng.circle.api.common.Result;
import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.circle.server.service.ShareCircleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * 圈子信息(ShareCircle)表控制层
 *
 * @author sun
 * @since 2024-07-15 11:53:36
 */
@RestController
@RequestMapping("/share/circle")
@Slf4j
public class ShareCircleController {
    /**
     * 服务对象
     */
    @Resource
    private ShareCircleService shareCircleService;

    /**
     * 新增圈子
     */
    @PostMapping(value = "/save")
    public Result<Boolean> save(@RequestBody SaveShareCircleReq req) {
        try {
            if (log.isInfoEnabled()) {
                log.info("新增圈子入参{}", JSON.toJSONString(req));
            }
            Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
            Preconditions.checkArgument(Objects.nonNull(req.getCircleName()), "圈子名称不能为空!");
            Preconditions.checkArgument(Objects.nonNull(req.getIcon()), "圈子图标不能为空!");
            if (req.getParentId() != -1) {
                ShareCircle circle = shareCircleService.getById(req.getParentId());
                Preconditions.checkArgument(Objects.nonNull(circle), "父级不存在!");
            }
            Boolean result = shareCircleService.saveCircle(req);
            if (log.isInfoEnabled()) {
                log.info("新增圈子{}", JSON.toJSONString(result));
            }
            return Result.ok(result);
        } catch (IllegalArgumentException e) {
            log.error("参数异常!错误原因{}", e.getMessage(), e);
            return Result.fail(e.getMessage());
        } catch (Exception e) {
            log.error("新增圈子异常!错误原因{}", e.getMessage(), e);
            return Result.fail("新增圈子异常!");
        }
    }

}

3.service
1.ShareCircleService.java
package com.sunxiansheng.circle.server.service;

import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.practice.api.common.PageResult;

import java.util.List;

/**
 * 圈子信息(ShareCircle)表服务接口
 *
 * @author sun
 * @since 2024-07-15 11:53:36
 */
public interface ShareCircleService {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    ShareCircle queryById(Long id);

    /**
     * 分页查询
     *
     * @param shareCircle 筛选条件
     * @param pageNo 当前页
     * @param pageSize 页面大小
     * @return 查询结果
     */
    PageResult<ShareCircle> queryByPage(ShareCircle shareCircle, Integer pageNo, Integer pageSize);

    /**
     * 根据条件查询记录
     *
     * @param shareCircle 筛选条件
     * @return 查询结果
     */
    List<ShareCircle> queryAllByLimit(ShareCircle shareCircle);

    /**
     * 新增数据
     *
     * @param shareCircle 实例对象
     * @return 实例对象
     */
    ShareCircle insert(ShareCircle shareCircle);

    /**
     * 修改数据
     *
     * @param shareCircle 实例对象
     * @return 实例对象
     */
    ShareCircle update(ShareCircle shareCircle);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 根据id查询父分类是否存在
     * @param parentId
     * @return
     */
    ShareCircle getById(Long parentId);

    /**
     * 保存一条记录
     * @param req
     * @return
     */
    Boolean saveCircle(SaveShareCircleReq req);
}

2.ShareCircleServiceImpl.java
package com.sunxiansheng.circle.server.service.impl;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.sunxiansheng.circle.api.req.SaveShareCircleReq;
import com.sunxiansheng.circle.api.vo.ShareCircleVO;
import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import com.sunxiansheng.circle.server.mapper.ShareCircleMapper;
import com.sunxiansheng.circle.server.service.ShareCircleService;
import com.sunxiansheng.circle.server.util.LoginUtil;
import com.sunxiansheng.practice.api.common.PageResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.Date;
import java.util.List;

/**
 * 圈子信息(ShareCircle)表服务实现类
 *
 * @author sun
 * @since 2024-07-15 11:53:36
 */
@Service("shareCircleService")
public class ShareCircleServiceImpl implements ShareCircleService {

    @Resource
    private ShareCircleMapper shareCircleMapper;

    /**
     * 初始化咖啡因:
     * initialCapacity(1):
     * 设置缓存的初始容量为 1。缓存将会初始化一个容量为 1 的内部数据结构,但这并不限制缓存的大小。这个参数主要用于性能优化,减少在缓存数据较少时的内存占用。
     * maximumSize(1):
     * 设置缓存的最大容量为 1。当缓存中的条目数量超过这个值时,将会触发逐出策略(LRU,最近最少使用),以保证缓存中的条目数量不超过这个值。
     * 在这个例子中,缓存最多只会存储 1 个条目。
     * expireAfterWrite(Duration.ofSeconds(30)):
     * 设置缓存条目的过期时间为 30 秒。具体来说,当一个条目被写入缓存后,经过 30 秒它将被认为是过期的,并且在后续的访问中会被移除或刷新。
     * Duration.ofSeconds(30) 创建一个表示 30 秒的 Duration 对象。
     */
    private static final Cache<Integer, List<ShareCircleVO>> CACHE = Caffeine.newBuilder()
            .initialCapacity(1)
            .maximumSize(1)
            .expireAfterWrite(Duration.ofSeconds(30))
            .build();


    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public ShareCircle queryById(Long id) {
        return this.shareCircleMapper.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param shareCircle 筛选条件
     * @param pageNo 当前页
     * @param pageSize 页面大小
     * @return 分页结果
     */
    @Override
    public PageResult<ShareCircle> queryByPage(ShareCircle shareCircle, Integer pageNo, Integer pageSize) {
        // 具体分页逻辑由调用者实现
        return null;
    }

    /**
     * 根据条件查询记录
     *
     * @param shareCircle 筛选条件
     * @return 查询结果
     */
    @Override
    public List<ShareCircle> queryAllByLimit(ShareCircle shareCircle) {
        return this.shareCircleMapper.queryAllByLimit(shareCircle);
    }

    /**
     * 新增数据
     *
     * @param shareCircle 实例对象
     * @return 实例对象
     */
    @Override
    public ShareCircle insert(ShareCircle shareCircle) {
        this.shareCircleMapper.insert(shareCircle);
        return shareCircle;
    }

    /**
     * 修改数据
     *
     * @param shareCircle 实例对象
     * @return 实例对象
     */
    @Override
    public ShareCircle update(ShareCircle shareCircle) {
        this.shareCircleMapper.update(shareCircle);
        return this.queryById(shareCircle.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.shareCircleMapper.deleteById(id) > 0;
    }

    @Override
    public ShareCircle getById(Long parentId) {
        ShareCircle shareCircle = shareCircleMapper.queryById(parentId);
        return shareCircle;
    }

    @Override
    public Boolean saveCircle(SaveShareCircleReq req) {
        // 获取信息
        String circleName = req.getCircleName();
        String icon = req.getIcon();
        Long parentId = req.getParentId();
        // 构建插入信息
        ShareCircle shareCircle = new ShareCircle();
        shareCircle.setCircleName(circleName);
        shareCircle.setIcon(icon);
        shareCircle.setParentId(parentId);
        shareCircle.setIsDeleted(0);
        shareCircle.setCreatedBy(LoginUtil.getLoginId());
        shareCircle.setCreatedTime(new Date());
        // 清空缓存
        CACHE.invalidateAll();
        int insert = shareCircleMapper.insert(shareCircle);
        return insert > 0;
    }

}

4.mapper
1.ShareCircleMapper.java
package com.sunxiansheng.circle.server.mapper;

import com.sunxiansheng.circle.server.entity.po.ShareCircle;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 圈子信息(ShareCircle)表数据库访问层
 *
 * @author sun
 * @since 2024-07-15 11:53:36
 */
public interface ShareCircleMapper {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    ShareCircle queryById(Long id);

    /**
     * 分页查询
     *
     * @param shareCircle
     * @param offset 偏移量:计算公式 (pageNo - 1) * pageSize
     * @param pageSize 页面大小
     * @return
     */
    List<ShareCircle> queryPage(@Param("po") ShareCircle shareCircle, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);

    /**
     * 根据条件查询记录
     *
     * @param shareCircle
     * @return
     */
    List<ShareCircle> queryAllByLimit(@Param("po") ShareCircle shareCircle);

    /**
     * 统计总行数
     *
     * @param shareCircle 查询条件
     * @return 总行数
     */
    long count(ShareCircle shareCircle);

    /**
     * 新增数据
     *
     * @param shareCircle 实例对象(会封装新增的id)
     * @return 影响行数
     */
    int insert(ShareCircle shareCircle);

    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param entities List<ShareCircle> 实例对象列表(会封装新增的id)
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<ShareCircle> entities);

    /**
     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
     *
     * @param entities List<ShareCircle> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<ShareCircle> entities);

    /**
     * 修改数据
     *
     * @param shareCircle 实例对象
     * @return 影响行数
     */
    int update(ShareCircle shareCircle);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Long id);

}

2.ShareCircleMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunxiansheng.circle.server.mapper.ShareCircleMapper">
    <resultMap type="com.sunxiansheng.circle.server.entity.po.ShareCircle" id="ShareCircleMap">
        <result property="id" column="id"/>
        <result property="parentId" column="parent_id"/>
        <result property="circleName" column="circle_name"/>
        <result property="icon" column="icon"/>
        <result property="createdBy" column="created_by"/>
        <result property="createdTime" column="created_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="isDeleted" column="is_deleted"/>
    </resultMap>

    <!--查询单个-->
    <select id="queryById" resultMap="ShareCircleMap">
        select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
        from share_circle
        where id = #{id}
        and is_deleted = 0
    </select>

    <!--分页查询指定行数据-->
    <select id="queryPage" resultMap="ShareCircleMap">
        select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
        from share_circle
        <where>
            <if test="po.id != null">
                and id = #{po.id}
            </if>
            <if test="po.parentId != null">
                and parent_id = #{po.parentId}
            </if>
            <if test="po.circleName != null and po.circleName != ''">
                and circle_name = #{po.circleName}
            </if>
            <if test="po.icon != null and po.icon != ''">
                and icon = #{po.icon}
            </if>
            <if test="po.createdBy != null and po.createdBy != ''">
                and created_by = #{po.createdBy}
            </if>
            <if test="po.createdTime != null">
                and created_time = #{po.createdTime}
            </if>
            <if test="po.updateBy != null and po.updateBy != ''">
                and update_by = #{po.updateBy}
            </if>
            <if test="po.updateTime != null">
                and update_time = #{po.updateTime}
            </if>
            <if test="po.isDeleted != null">
                and is_deleted = #{po.isDeleted}
            </if>
        </where>
        limit #{offset}, #{pageSize}
    </select>

    <!--根据条件查询记录-->
    <select id="queryAllByLimit" resultMap="ShareCircleMap">
        select id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time, is_deleted
        from share_circle
        <where>
            <if test="po.id != null">
                and id = #{po.id}
            </if>
            <if test="po.parentId != null">
                and parent_id = #{po.parentId}
            </if>
            <if test="po.circleName != null and po.circleName != ''">
                and circle_name = #{po.circleName}
            </if>
            <if test="po.icon != null and po.icon != ''">
                and icon = #{po.icon}
            </if>
            <if test="po.createdBy != null and po.createdBy != ''">
                and created_by = #{po.createdBy}
            </if>
            <if test="po.createdTime != null">
                and created_time = #{po.createdTime}
            </if>
            <if test="po.updateBy != null and po.updateBy != ''">
                and update_by = #{po.updateBy}
            </if>
            <if test="po.updateTime != null">
                and update_time = #{po.updateTime}
            </if>
            <if test="po.isDeleted != null">
                and is_deleted = #{po.isDeleted}
            </if>
        </where>
    </select>

    <!--统计总行数-->
    <select id="count" resultType="java.lang.Long">
        select count(1)
        from share_circle
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="parentId != null">
                and parent_id = #{parentId}
            </if>
            <if test="circleName != null and circleName != ''">
                and circle_name = #{circleName}
            </if>
            <if test="icon != null and icon != ''">
                and icon = #{icon}
            </if>
            <if test="createdBy != null and createdBy != ''">
                and created_by = #{createdBy}
            </if>
            <if test="createdTime != null">
                and created_time = #{createdTime}
            </if>
            <if test="updateBy != null and updateBy != ''">
                and update_by = #{updateBy}
            </if>
            <if test="updateTime != null">
                and update_time = #{updateTime}
            </if>
            <if test="isDeleted != null">
                and is_deleted = #{isDeleted}
            </if>
        </where>
    </select>

    <!--新增所有列-->
    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
        insert into share_circle(parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
        is_deleted)
        values (#{parentId}, #{circleName}, #{icon}, #{createdBy}, #{createdTime}, #{updateBy}, #{updateTime},
        #{isDeleted})
    </insert>

    <insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into share_circle(parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
        is_deleted)
        values
        <foreach collection="entities" item="entity" separator=",">
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <choose>
                    <when test="entity.parentId != null">
                        #{entity.parentId},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.circleName != null">
                        #{entity.circleName},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.icon != null">
                        #{entity.icon},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.createdBy != null">
                        #{entity.createdBy},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.createdTime != null">
                        #{entity.createdTime},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.updateBy != null">
                        #{entity.updateBy},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.updateTime != null">
                        #{entity.updateTime},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
                <choose>
                    <when test="entity.isDeleted != null">
                        #{entity.isDeleted},
                    </when>
                    <otherwise>
                        NULL,
                    </otherwise>
                </choose>
            </trim>
        </foreach>
    </insert>

    <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
        insert into share_circle(id, parent_id, circle_name, icon, created_by, created_time, update_by, update_time,
        is_deleted)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.id}, #{entity.parentId}, #{entity.circleName}, #{entity.icon}, #{entity.createdBy},
            #{entity.createdTime}, #{entity.updateBy}, #{entity.updateTime}, #{entity.isDeleted})
        </foreach>
        on duplicate key update
        parent_id = values(parent_id),
        circle_name = values(circle_name),
        icon = values(icon),
        created_by = values(created_by),
        created_time = values(created_time),
        update_by = values(update_by),
        update_time = values(update_time),
        is_deleted = values(is_deleted)
    </insert>

    <!--通过主键修改数据-->
    <update id="update">
        update share_circle
        <set>
            <if test="parentId != null">
                parent_id = #{parentId},
            </if>
            <if test="circleName != null and circleName != ''">
                circle_name = #{circleName},
            </if>
            <if test="icon != null and icon != ''">
                icon = #{icon},
            </if>
            <if test="createdBy != null and createdBy != ''">
                created_by = #{createdBy},
            </if>
            <if test="createdTime != null">
                created_time = #{createdTime},
            </if>
            <if test="updateBy != null and updateBy != ''">
                update_by = #{updateBy},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime},
            </if>
            <if test="isDeleted != null">
                is_deleted = #{isDeleted},
            </if>
        </set>
        where id = #{id}
    </update>

    <!--通过主键删除-->
    <delete id="deleteById">
        delete from share_circle where id = #{id}
    </delete>
</mapper>

5.entity
1.ShareCircle.java
package com.sunxiansheng.circle.server.entity.po;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * 圈子信息(ShareCircle)实体类
 *
 * @author sun
 * @since 2024-07-15 11:53:36
 */
@Data
@Accessors(chain = true) // 支持链式调用
public class ShareCircle implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 圈子ID
     */
    private Long id;

    /**
     * 父级ID,-1为大类
     */
    private Long parentId;

    /**
     * 圈子名称
     */
    private String circleName;

    /**
     * 圈子图片
     */
    private String icon;

    /**
     * 创建人
     */
    private String createdBy;

    /**
     * 创建时间
     */
    private Date createdTime;

    /**
     * 更新人
     */
    private String updateBy;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 是否被删除 0为删除 1已删除
     */
    private Integer isDeleted;

}

6.测试
1.新增一个父级圈子

CleanShot 2024-07-15 at 12.29.26@2x

CleanShot 2024-07-15 at 12.31.10@2x

2.再新增两个子级圈子

CleanShot 2024-07-15 at 12.31.42@2x

CleanShot 2024-07-15 at 12.32.14@2x

CleanShot 2024-07-15 at 12.32.38@2x

2.更新圈子
1.UpdateShareCircleReq.java
package com.sunxiansheng.circle.api.req;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * <p>
 * 圈子信息
 * </p>
 *
 * @author ChickenWing
 * @since 2024/05/16
 */
@Getter
@Setter
public class UpdateShareCircleReq implements Serializable {

    private Long id;

    /**
     * 圈子名称
     */
    private String circleName;

    /**
     * 圈子图标
     */
    private String icon;

    /**
     * -1为一级,分类ID
     */
    private Long parentId;

}

2.ShareCircleController.java
    /**
     * 修改圈子
     */
    @PostMapping(value = "/update")
    public Result<Boolean> update(@RequestBody UpdateShareCircleReq req) {
        try {
            if (log.isInfoEnabled()) {
                log.info("修改圈子入参{}", JSON.toJSONString(req));
            }
            Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
            Preconditions.checkArgument(Objects.nonNull(req.getCircleName()), "圈子名称不能为空!");
            if (Objects.nonNull(req.getParentId()) && req.getParentId() != -1) {
                ShareCircle circle = shareCircleService.getById(req.getParentId());
                Preconditions.checkArgument(Objects.nonNull(circle), "父级不存在!");
            }
            Boolean result = shareCircleService.updateCircle(req);
            if (log.isInfoEnabled()) {
                log.info("修改圈子{}", JSON.toJSONString(result));
            }
            return Result.ok(result);
        } catch (IllegalArgumentException e) {
            log.error("参数异常!错误原因{}", e.getMessage(), e);
            return Result.fail(e.getMessage());
        } catch (Exception e) {
            log.error("修改圈子异常!错误原因{}", e.getMessage(), e);
            return Result.fail("修改圈子异常!");
        }
    }
3.service
1.ShareCircleService.java
    /**
     * 修改圈子
     * @param req
     * @return
     */
    Boolean updateCircle(UpdateShareCircleReq req);
2.ShareCircleServiceImpl.java
    @Override
    public Boolean updateCircle(UpdateShareCircleReq req) {
        // 获取数据
        Long id = req.getId();
        String circleName = req.getCircleName();
        String icon = req.getIcon();
        Long parentId = req.getParentId();
        // 构建po
        ShareCircle shareCircle = new ShareCircle();
        shareCircle.setId(id);
        shareCircle.setParentId(parentId);
        shareCircle.setCircleName(circleName);
        shareCircle.setIcon(icon);
        shareCircle.setUpdateTime(new Date());
        shareCircle.setUpdateBy(LoginUtil.getLoginId());
        // 更新
        int update = shareCircleMapper.update(shareCircle);
        return update > 0;
    }
4.mapper
1.ShareCircleMapper.xml

CleanShot 2024-07-15 at 12.49.51@2x

5.测试

CleanShot 2024-07-15 at 12.50.08@2x

CleanShot 2024-07-15 at 12.50.30@2x

3.删除圈子
1.RemoveShareCircleReq.java
package com.sunxiansheng.circle.api.req;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * <p>
 * 圈子信息
 * </p>
 *
 * @author ChickenWing
 * @since 2024/05/16
 */
@Getter
@Setter
public class RemoveShareCircleReq implements Serializable {

    private Long id;

}

2.ShareCircleController.java
    /**
     * 删除圈子
     */
    @PostMapping(value = "/remove")
    public Result<Boolean> remove(@RequestBody RemoveShareCircleReq req) {
        try {
            if (log.isInfoEnabled()) {
                log.info("删除圈子入参{}", JSON.toJSONString(req));
            }
            Preconditions.checkArgument(Objects.nonNull(req), "参数不能为空!");
            Preconditions.checkArgument(Objects.nonNull(req.getId()), "圈子ID!");
            Boolean result = shareCircleService.removeCircle(req);
            if (log.isInfoEnabled()) {
                log.info("删除圈子{}", JSON.toJSONString(result));
            }
            return Result.ok(result);
        } catch (IllegalArgumentException e) {
            log.error("参数异常!错误原因{}", e.getMessage(), e);
            return Result.fail(e.getMessage());
        } catch (Exception e) {
            log.error("删除圈子异常!错误原因{}", e.getMessage(), e);
            return Result.fail("删除圈子异常!");
        }
    }
3.service
1.ShareCircleService.java
    /**
     * 删除圈子
     * @param req
     * @return
     */
    Boolean removeCircle(RemoveShareCircleReq req);
2.ShareCircleServiceImpl.java
    @Override
    public Boolean removeCircle(RemoveShareCircleReq req) {
        Long id = req.getId();
        ShareCircle shareCircle = new ShareCircle();
        shareCircle.setId(id)
                .setIsDeleted(1);
        int update = shareCircleMapper.update(shareCircle);
        // 清空缓存
        CACHE.invalidateAll();
        return update > 0;
    }
4.测试

CleanShot 2024-07-15 at 13.04.23@2x

CleanShot 2024-07-15 at 13.04.39@2x

Caffeine本地缓存适用于以下场景: 1. 提升应用性能:Caffeine本地缓存可以将频繁访问的数据缓存在内存中,以减少对底层数据源的访问次数,从而提高应用的性能和响应速度。 2. 降低系统负载:通过使用Caffeine本地缓存,可以避免频繁地从数据库或其他外部数据源中读取数据,减少了对外部系统的访问,从而降低了系统的负载。 3. 数据共享与共享状态管理:Caffeine本地缓存可以用于在应用内部共享数据,减少重复计算和查询的开销。同时,它也可以用于管理应用中的共享状态,确保多个线程或进程之间的数据一致性。 4. 缓存数据的有效期管理:Caffeine本地缓存提供了对缓存数据有效期的管理,可以根据需求设置缓存过期时间,以确保缓存数据的及时更新和一致性。 5. 缓解外部服务的压力:对于一些需要频繁调用外部服务的场景,可以使用Caffeine本地缓存缓存外部服务的响应结果,减少对外部服务的调用次数,降低对外部服务的压力。 总之,Caffeine本地缓存适用于需要提升应用性能、降低系统负载、数据共享与共享状态管理、缓存数据有效期管理和缓解外部服务压力的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Caffeine一级缓存介绍和应用](https://blog.csdn.net/u011507134/article/details/127107322)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S-X-S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值