redis缓存在微服务中的使用

本文介绍了如何在Spring Boot项目中使用Redis,包括RedisService工具类的实现、key-value数据的存储与过期时间设置,以及如何通过Fastjson处理不同类型的值。重点展示了如何利用Redis做缓存,提高应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.redis工具类编写

package cn.x.x.config;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
//它是一个组件,由spring帮助创建
@Component
public class RedisService {
    @Autowired //在spring-data-redis的jar中,提供一个封装好的redis的操作模板,这个模板中封装了关于redis操作的工具方法
    private StringRedisTemplate stringRedisTemplate;
    /**
     * 向Redis中存储 key-value键值对数据,value的类型为object
     *
     * @param key
     * @param value
     */
    public void setStringKeyAndValue(String key, Object value) {
        stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value));
    }

    /**
     * 保存key-value键值对到 redis,存储的value是字符串类型
     *
     * @param key
     * @param value
     */
    public void setStringKeyAndValue(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 存储的数据,多了一个 有效时间
     *
     * @param key
     * @param value
     * @param minute
     */
    public void setStringKeyAndValue(String key, Object value, long minute) {
        stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value), minute, TimeUnit.MINUTES);
    }
    public void setStringKeyAndValue(String key, String value, long minute) {
        stringRedisTemplate.opsForValue().set(key, value, minute, TimeUnit.MINUTES);
    }

    /**
     * 功能说明 取出对象并转换为对象类型
     *
     * @param key
     * @param clazz
     * @return T
     * @author caiwen
     * @date 2020/8/22
     */
    public <T> T getKeyObjectValue(String key, Class<T> clazz) {//传入的这个数据类型,可能是2种类型:1string; 2object,如果是object,要进行泛型转换
        T t = null;
        String s = stringRedisTemplate.opsForValue().get(key);
        if (StringUtils.isBlank(s)) {
            return null;
        }
        //下面这个判断,是判断传入的Class类型是什么
        if (StringUtils.equalsIgnoreCase(clazz.getName(), "java.lang.string")) {
            t = (T) s;
        } else if (StringUtils.isNotBlank(s)) {
            t = JSONObject.parseObject(s, clazz);
        }
        return t;
    }

    public void deleteRedisByKey(String key) {
        stringRedisTemplate.delete(key);
    }
}

注意:此处JSON的依赖是

import com.alibaba.fastjson.JSONObject;
 		<!-- 引入fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>

2.项目中使用
①导入依赖

		<!-- 缓存redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 引入fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>

②代码实现

package cn.x.x.service.impl;

import cn.x.th.config.RedisContants;
import cn.x.th.config.RedisService;
import cn.itsource.th.domain.CourseType;
import cn.itsource.th.mapper.CourseTypeMapper;
import cn.itsource.th.service.ICourseTypeService;
import cn.itsource.th.util.AjaxResult;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author huan
 * @since 2021-01-14
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private RedisService redisService;

    @Override
    public AjaxResult treeData() {
        List<CourseType> courseTypes=null;
        //思路:判断courseTypes在Redis里是否为空,如果为空则在数据库查询,在存到Redis里,
        // 如果不为空,则直接在Redis查询出来,转换成对象集合返回
        //1.查询Redis里的数据,以string类型返回
        String keyObjectValue = redisService.getKeyObjectValue(RedisContants.REDIS_KEY_COURSE_TYPE, String.class);
        if(StringUtils.isBlank(keyObjectValue)){//如果为空,则代表Redis里没有
            //从数据库中查询出来
            courseTypes = baseMapper.selectForTreeData();
            //将数据存到Redis里
            redisService.setStringKeyAndValue(RedisContants.REDIS_KEY_COURSE_TYPE,courseTypes);
        }else {//如果不为空,则代表Redis里有数据,则直接查询出来,但由于Redis里存的是json格式,所以需要转换
            courseTypes = JSON.parseArray(keyObjectValue, CourseType.class);
        }
        return AjaxResult.me().setResultObj(courseTypes);
    }
}

3.用到的常量

package cn.x.x.config;

//定义系统中所有使用到 redis缓存的 key的名称
public interface RedisContants {
    String REDIS_KEY_COURSE_TYPE = "redis_key_course_type";
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值