springboot集成redis

本文介绍如何在Spring Boot项目中集成Redis,并提供了一系列Redis操作的示例代码,包括设置值、获取值、过期时间设定等。

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

一:引入springboot集成redis的依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--这两个包是引入ToStringBuilder,感觉没吊用-->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
</dependency>

二:接口代码

package com.neo.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
public class RedisService {
    private Logger logger = LoggerFactory.getLogger(RedisService.class);
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * set value
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            logger.error("set error: key {}, value {}",key,value,e);
        }
        return result;
    }

    /**
     * set value with expireTime
     * @param key
     * @param value
     * @param expireTime
     * @return
     */
    public boolean set(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            result = true;
        } catch (Exception e) {
            logger.error("set error: key {}, value {},expireTime {}",key,value,expireTime,e);
        }
        return result;
    }

    /**
     * @param key
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * @param key
     * @return
     */
    public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }

    /**
     * remove single key
     * @param key
     */
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * batch delete
     * @param keys
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * batch delete with pattern
     * @param pattern
     */
    public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0)
            redisTemplate.delete(keys);
    }

    /**
     * hash set
     * @param key
     * @param hashKey
     * @param value
     */
    public void hashSet(String key, Object hashKey, Object value){
        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
        hash.put(key,hashKey,value);
    }

    /**
     * hash get
     * @param key
     * @param hashKey
     * @return
     */
    public Object hashGet(String key, Object hashKey){
        HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
        return hash.get(key,hashKey);
    }

    /**
     *  list push
     * @param k
     * @param v
     */
    public void push(String k,Object v){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        list.rightPush(k,v);
    }

    /**
     *  list range
     * @param k
     * @param l
     * @param l1
     * @return
     */
    public List<Object> range(String k, long l, long l1){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        return list.range(k,l,l1);
    }

    /**
     *  set add
     * @param key
     * @param value
     */
    public void setAdd(String key,Object value){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        set.add(key,value);
    }

    /**
     * set get
     * @param key
     * @return
     */
    public Set<Object> setMembers(String key){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        return set.members(key);
    }

    /**
     * ordered set add
     * @param key
     * @param value
     * @param scoure
     */
    public void zAdd(String key,Object value,double scoure){
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.add(key,value,scoure);
    }

    /**
     * rangeByScore
     * @param key
     * @param scoure
     * @param scoure1
     * @return
     */
    public Set<Object> rangeByScore(String key,double scoure,double scoure1){
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        return zset.rangeByScore(key, scoure, scoure1);
    }
}

三:配置redis的key生成策略(一般都是类名方法名参数名),配置缓存管理器。配置redisTemplate.这里就省略后面的

package com.neo.config;

import java.lang.reflect.Method;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;


@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
   
   @Bean
   public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

}

我的测试:

package com.neo.redis;

import com.neo.model.User;
import com.neo.service.RedisService;
import org.apache.commons.lang3.SystemUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis缓存测试: 描述信息
 *
 * @author liyy
 * @date 2018-07-09 10:54
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisTestService {

    @Autowired
    private RedisService redisService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 测试缓存字符串
     */
    @Test
    public void test1(){
        redisService.set("name","liyy");
        Assert.assertEquals("liyy",redisService.get("name"));
    }



    /**
     * 测试缓存对象
     */
    @Test
    public void test2(){
        User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020");
        redisService.set("user",u);
        User user = (User)redisService.get("user");
        System.out.println(user.getNickname());
    }


    /**
     * 覆盖
     */
    @Test
    public void test3(){
        redisTemplate.opsForValue().set("name","i love you");
        redisTemplate.opsForValue().set("name","hello");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }

    /**
     *
     */
    @Test
    public void test4(){
        User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020");
        ValueOperations<String,User> valueOperations = redisTemplate.opsForValue();
        valueOperations.set("user",u);
        User user = valueOperations.get("user");
        System.out.println(user.getNickname());
    }



    /**
     *测试时效性
     */
    @Test
    public void test5(){
        User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020");
        ValueOperations<String,User> valueOperations = redisTemplate.opsForValue();
        valueOperations.set("user1",u,10, TimeUnit.SECONDS);
        User user = valueOperations.get("user1");
        System.out.println(user.getNickname());
    }


    /**
     *判断key是否存在
     */
    @Test
    public void test6(){
        User u = new User("ityouknow@126.com", "smile", "youknow", "know","2020");
        ValueOperations<String,User> valueOperations = redisTemplate.opsForValue();
        valueOperations.set("user1",u,10, TimeUnit.SECONDS);
        Long time1=0L,time2=0L;
        try {
            time1 = System.currentTimeMillis();
            System.out.println("线程沉睡开始....");
            Thread.sleep(10000);//10s
            System.out.println("线程沉睡结束....");
            time2 = System.currentTimeMillis();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程沉睡时间:"+(time2-time1)/1000+"秒");
        if(redisTemplate.hasKey("user1")){
            User user = valueOperations.get("user1");
            System.out.println(user.getNickname());
        }else{
            System.out.println("缓存的key已经被超时删除");
        }

    }

    /**
     * 测试缓存hash
     */
    @Test
    public void test7(){
        HashOperations<String,Object,Object> valueOperations = redisTemplate.opsForHash();
        valueOperations.put("hash","you","you");
        String str = (String)valueOperations.get("hash","you");
        System.out.println(str);
    }

    /**
     * 测试缓存集合
     */
    @Test
    public void test8(){
        String key = "list";
        redisTemplate.delete(key);
        ListOperations<String,String> listOperations = redisTemplate.opsForList();
        listOperations.leftPush(key,"i");
        listOperations.leftPush(key,"love");
        listOperations.leftPush(key,"you");
        String str = listOperations.leftPop(key);
        //System.out.println(str);
        List<String> list  = listOperations.range(key,0,3);
        for(String str1 : list){
            System.out.println(str1) ;
        }
    }


    /**
     * 测试缓存集合
     */
    @Test
    public void test9(){
        String key = "list";
        redisTemplate.delete(key);
        ZSetOperations<String, String> zset = redisTemplate.opsForZSet();
        //System.out.println(str);
        zset.add(key,"i",1);
        zset.add(key,"love",3);
        zset.add(key,"you",5);
        zset.add(key,"konw",8);
        Set<String> list  = zset.range(key,0,3);
        for(String str1 : list){
            System.out.println(str1) ;
        }
    }





}

在 Spring Boot 项目中集成 Redis 数据库,主要涉及以下几个步骤:引入依赖、配置 Redis 连接信息、使用 `RedisTemplate` 或 `StringRedisTemplate` 来操作 Redis 数据库。 ### 引入 Redis 依赖 在 `pom.xml` 文件中添加以下依赖以集成 Redis: ```xml <!-- Redis 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> ``` 这些依赖项将帮助封装与 Redis 交互的底层操作,并提供连接池功能以优化与 Redis 的连接管理,提高性能[^1]。 ### 配置 Redis 连接 在 `application.properties` 或 `application.yml` 文件中配置 Redis 的连接信息。以下是 `application.properties` 的示例配置: ```properties # Redis 配置 spring.redis.host=localhost spring.redis.port=6379 spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=2 spring.redis.lettuce.pool.max-wait=2000ms ``` 如果使用 `application.yml`,则配置如下: ```yaml spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 2 max-wait: 2000ms ``` 这些配置项用于指定 Redis 服务器的地址、端口以及连接池的相关参数。 ### 使用 RedisTemplate 操作 Redis 在 Spring Boot 应用程序中,可以通过注入 `RedisTemplate` 来操作 Redis 数据库。下面是一个简单的示例,展示如何使用 `RedisTemplate` 设置和获取数据: ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class RedisService { private final RedisTemplate<String, Object> redisTemplate; public RedisService(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } } ``` 在这个示例中,`RedisTemplate` 被用来执行基本的键值对操作。`opsForValue()` 方法返回一个 `ValueOperations` 对象,可以用来设置和获取字符串类型的值。 ### 分布式会话场景(Redis-Session) 对于需要支持分布式会话的应用程序,可以利用 Spring Session 提供的功能,通过 Redis 来存储会话信息。这通常涉及到额外的配置和依赖项,但可以极大地简化跨多个服务实例的会话管理。 通过以上步骤,可以在 Spring Boot 项目中成功集成 Redis 数据库,并利用其提供的高性能数据访问能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值