springboot系列05:redis使用

Redis 介绍

redis 是目前使用最为广泛的内存数据存储,支持丰富的数据结构,如hashes, lists, sets 等,同时支持数据持久化。除此之外,Redis 还提供一些类数据库的特性,比如事务,HA,主从库。

 

Redis 在springboot中的使用

  • 引入依赖包

        <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> 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

 

  • 添加配置文件

# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

 

  • 添加cache配置类

package com.example.redis.config;

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 java.lang.reflect.Method;

@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.example.redis.test;

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.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestRedis {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisSet() throws Exception {
        stringRedisTemplate.opsForValue().set("aaa", "111");
        Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));
    } 

}

 

  • 启动redis,运行TestRedis.testRedisSet 测试类报错信息:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

  at org.springframework.util.Assert.state(Assert.java:73)
  at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOrFindConfigurationClasses(SpringBootTestContextBootstrapper.java:233)

 

  • 解决方法:测试根目录编写测试启动类

package com.example.redis.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class RedisApplicationTest {

    public static void main(String[] args) {
        SpringApplication.run(RedisApplicationTest.class,args);
    }
}

 成功结果:

 

 

redis操作对象User

package com.example.domain;

import lombok.Data;

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

@Data
public class User implements Serializable {
        private static final long serialVersionUID = 1L;

        private Long id;
        private String userName;
        private String password;
        private String email;
        private String nickname;
        private Date regTime;

 

测试对象是否存在
@Test
    public void testUserExist() throws Exception {
        User user=new User(1L,"zhangl", "123456", "1796969389@qq.com", "zhangl",new Date());
        redisTemplate.opsForValue().set("User::"+ user.getId(), user);
        Assert.assertEquals(true, redisTemplate.hasKey("User::"+ user.getId()));
    }

 

测试获取对象属性
   @Test
    public void testUserName() throws Exception {
        User user=new User(1L,"zhangl", "123456", "1796969389@qq.com", "zhangl",new Date());
        redisTemplate.opsForValue().set("User::"+ user.getId(), user);
        Assert.assertEquals("zhangl", ((User)redisTemplate.opsForValue().get("User::"+ user.getId())).getUserName());
    }

 

  • 测试删除对象
   @Test
    public void testUserDelete() throws Exception {
        User user=new User(1L,"zhangl", "123456", "1796969389@qq.com", "zhangl",new Date());
        redisTemplate.opsForValue().set("User::"+ user.getId(), user);
        redisTemplate.delete("User::"+ user.getId());
        Assert.assertEquals(false, redisTemplate.hasKey("User::"+ user.getId()));
    }

 

  • 测试过期时间
    @Test
    public void testUserSetTime() throws Exception {
        User user=new User(1L,"zhangl", "123456", "1796969389@qq.com", "zhangl",new Date());
        redisTemplate.opsForValue().set("User::"+ user.getId(), user,1, TimeUnit.SECONDS);
        Assert.assertEquals(true, redisTemplate.hasKey("User::"+ user.getId()));
        //等待1s
        Thread.sleep(1000L);
        Assert.assertEquals(false, redisTemplate.hasKey("User::"+ user.getId())); 
    }

 

posted @ 2022-01-13 19:02  IT6889  阅读(44)  评论(0编辑  收藏  举报