java:Springboot集成redis

2023-12-13 14:48:11

导读

做一个入门的Springboot集成redis案例,当在 redis 查到键名 redis_name 有数据的话,就返回缓存的数据,如果没有数据,就从数据库里查询出 redis_name 对应的数据返回。

1、引入

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

application.properties 可配也可以用默认的

spring.data.redis.host=localhost
spring.data.redis.port=6379

2、创建utils

package com.zhangyu.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    // 默认过期时间,单位秒
    private static final long DEFAULT_EXPIRATION = 3600;

    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value, DEFAULT_EXPIRATION, TimeUnit.SECONDS);
    }

    public void set(String key, String value, long expirationInSeconds) {
        redisTemplate.opsForValue().set(key, value, expirationInSeconds, TimeUnit.SECONDS);
    }

    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }

    public void delete(String key) {
        redisTemplate.delete(key);
    }
}

3、编写service层

package com.zhangyu.service;

import com.zhangyu.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyCacheService {

    @Autowired
    private RedisUtil redisUtil;

    public String getCachedValue(String key) {
        // 先从缓存中获取数据
        Object cachedValue = redisUtil.get(key);
        Boolean hasKey = redisUtil.exists(key);

        // 如果缓存中不存在,则模拟从数据库或其他数据源中获取数据,并存入缓存
        if (!hasKey) {
            System.out.println("正在从数据库取数据并存储进redis");
            // 模拟从数据源获取数据
            String dataFromDataSource = "mysql data";
            // 存入缓存
            redisUtil.set(key, dataFromDataSource);
            return dataFromDataSource;
        } else {
            System.out.println("这是获取到redis中的数据: " + cachedValue);
            return cachedValue.toString();
        }
    }
}

4、编写controller层触发service层业务

package com.zhangyu.controller;

import com.zhangyu.service.MyCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CacheController {
    @Autowired
    private MyCacheService myCacheService;

    @RequestMapping("/cache")
    public String getCache () {
        return myCacheService.getCachedValue("redis_name");
    }

}

StringRedisTemplate和RedisTemplate的区别

上面 utils 中我们使用 RedisTemplate 存储字符串会包含一些二进制的内容,其实就是看起来难受,对存取没有影响,如果介意可以使用StringRedisTemplate

  • StringRedisTemplate继承RedisTemplate。
  • 两者的数据是不共通的
  • 序列化策略不同

文章来源:https://blog.csdn.net/weixin_43972437/article/details/134859883
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。