7.跟我学SpringBoot-整合redis

字数 240阅读 231

做SpringBoot开发,没有redis怎么可能行呢,因此需要用最简单的方法来整合redis,SpringBoot也提供了极简的方法。

如果你还没有接触过redis,请先阅读这篇文章:3.1Redis介绍及使用

1.maven依赖

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

2.application.yml配置

#config Redis
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    password:

很简单只需要配置redis服务器的ip、端口、密码(如果有的话)即可。

3.使用

@RestController
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/set")
    public void set() {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        ops.set("test_redis", "hello redis", 1, TimeUnit.MINUTES);//1分钟过期
    }

    @RequestMapping("/get")
    public String get() {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        return ops.get("test_redis");
    }
}

这里直接注入StringRedisTemplate利用这个来调用redis的各个方法。

4.RedisUtil工具类

实际开发中,仅有StringRedisTemplate还是远远不够的,因为redis的value不单单是字符串还有各种对象。

这里引用了一个Redis工具类,便于后续的开发。

@Component
public class RedisUtil {
    /**
     * 注入的stringRedisTemplate
     */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    /**
     * redisTemplate
     */
    @Autowired
    private RedisTemplate<?, ?> redisTemplate;

    /**
     * 设置key和对象的value
     *
     * @param key key
     * @param value value
     */
    public void set(final String key, Object value) {
        final byte[] vbytes = SerializeUtil.serialize(value);
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.set(redisTemplate.getStringSerializer().serialize(key), vbytes);
                return null;
            }
        });
    }

    /**
     * 设置key和value,并加上时间(秒)
     *
     * @param key key
     * @param value value
     * @param l 时间
     */
    public void set(final String key, Object value, final long l) {
        final byte[] vbytes = SerializeUtil.serialize(value);
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.setEx(redisTemplate.getStringSerializer().serialize(key), l, vbytes);
                return null;
            }
        });
    }

    /**
     * 根据key来取值
     *
     * @param key key
     * @param elementType 数据类型
     * @param <T> 泛型
     * @return 获取的对象
     */
    public <T> T get(final String key, Class<T> elementType) {
        return redisTemplate.execute(new RedisCallback<T>() {
            @Override
            public T doInRedis(RedisConnection connection) throws DataAccessException {
                byte[] keybytes = redisTemplate.getStringSerializer().serialize(key);
                if (connection.exists(keybytes)) {
                    byte[] valuebytes = connection.get(keybytes);
                    T value = (T) SerializeUtil.deserialize(valuebytes);
                    return value;
                }
                return null;
            }
        });
    }

    /**
     * 根据key删除该值
     *
     * @param key key
     */
    public void del(final String key) {
        final byte[] keyBytes = redisTemplate.getStringSerializer().serialize(key);
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.del(keyBytes);
                return null;
            }
        });
    }
}

实际使用过程中直接注入RedisUtil即可使用。
测试及使用过程可以参考8.跟我学SpringBoot-单元测试

源码下载

本例子详细源码