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())); 
    }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号