Redis:SpringBoot整合Redis

2023-11-20 08:43:40 浏览数 (1)

前言

Redis 的名字来源于 Remote Dictionary Server(远程字典服务器)。它是由 Salvatore Sanfilippo 在 2009 年开发的,最初是为了解决 LLOOGG 项目中的性能问题而创建的。后来,Redis 成为一个独立的开源项目,并迅速成为一种流行的内存数据库和缓存系统。

Redis 是一个开源的内存数据库和缓存系统。它被设计用于快速访问、存储和检索数据,特别是键值对(key-value pairs)。Redis 支持多种数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

作为内存数据库,Redis 的数据存储在系统内存中,这使得它能够提供高性能的数据访问和响应速度。此外,Redis 也可以持久化数据到磁盘,以防止数据丢失。

除了作为数据库,Redis 还常被用作缓存系统,通过在内存中缓存经常访问的数据,提高应用程序的性能。

SpringBoot整合Redis

pom引入

代码语言:javascript复制
        <!-- 引入 redis 依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

yaml配置

代码语言:javascript复制
spring:
  redis:
    database: 1
    host: 127.0.0.1
    port: 6379
    password: 123456

测试类

代码语言:javascript复制
package com.example.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Redis 控制器
 */
@RestController
@RequestMapping("/api/redis")
public class RedisController {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 设置 Redis 键值对
     *
     * @param key   键
     * @param value 值
     * @return 操作结果
     */
    @GetMapping("/set")
    public Object set(String key, String value) {
        // opsForValue() 用于操作 String 类型的数据
        redisTemplate.opsForValue().set(key, value);
        return "OK";
    }

    /**
     * 获取 Redis 值
     *
     * @param key 键
     * @return 对应的值
     */
    @GetMapping("/get")
    public Object get(String key) {
        // opsForValue() 用于操作 String 类型的数据
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除 Redis 键值对
     *
     * @param key 键
     * @return 操作结果
     */
    @GetMapping("/delete")
    public Object delete(String key) {
        // 删除 key 是通用操作
        redisTemplate.delete(key);
        return "OK";
    }
}

开始测试

代码语言:javascript复制
http://localhost:8654/api/redis/set?key=1&value=张三
http://localhost:8654/api/redis/get?key=1
http://localhost:8654/api/redis/delete?key=1

工具类封装

代码语言:java复制
package com.example.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

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

@Component
public class RedisUtil {

    @Autowired
    private StringRedisTemplate redisTemplate;

    // Key 操作

    /**
     * 获取 key 的剩余过期时间
     *
     * @param key key
     * @return 剩余过期时间,单位秒
     */
    public long ttl(String key) {
        return redisTemplate.getExpire(key);
    }

    /**
     * 设置 key 的过期时间
     *
     * @param key     key
     * @param timeout 过期时间,单位秒
     */
    public void expire(String key, long timeout) {
        redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * key 的自增操作
     *
     * @param key   key
     * @param delta 自增步长
     * @return 自增后的值
     */
    public long incr(String key, long delta) {
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 查找所有符合给定模式的 key
     *
     * @param pattern 模式
     * @return 符合模式的 key 集合
     */
    public Set<String> keys(String pattern) {
        return redisTemplate.keys(pattern);
    }

    /**
     * 删除指定的 key
     *
     * @param key key
     */
    public void del(String key) {
        redisTemplate.delete(key);
    }

    // String 操作

    /**
     * 设置一个 key-value
     *
     * @param key   key
     * @param value value
     */
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置 key-value 和超时时间
     *
     * @param key     key
     * @param value   value
     * @param timeout 超时时间,单位秒
     */
    public void set(String key, String value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    /**
     * 获取 key 对应的 value
     *
     * @param key key
     * @return key 对应的 value
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 批量查询 key 对应的 values
     *
     * @param keys key 列表
     * @return key 对应的 values 列表
     */
    public List<String> mget(List<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }

    /**
     * 使用管道批量查询 key 对应的 values
     *
     * @param keys key 列表
     * @return key 对应的 values 列表
     */
    public List<Object> batchGet(List<String> keys) {
        return redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            StringRedisConnection src = (StringRedisConnection) connection;
            keys.forEach(src::get);
            return null;
        });
    }

    // Hash 操作

    /**
     * 将哈希表 key 中的域 field 的值设为 value
     *
     * @param key   key
     * @param field field
     * @param value value
     */
    public void hset(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 返回哈希表 key 中给定域 field 的值
     *
     * @param key   key
     * @param field field
     * @return 哈希表中指定域的值
     */
    public String hget(String key, String field) {
        return (String) redisTemplate.opsForHash().get(key, field);
    }

    /**
     * 删除哈希表 key 中的指定域
     *
     * @param key    key
     * @param fields fields
     */
    public void hdel(String key, Object... fields) {
        redisTemplate.opsForHash().delete(key, fields);
    }

    /**
     * 返回哈希表 key 中所有的域和值
     *
     * @param key key
     * @return 哈希表中所有的域和值
     */
    public Map<Object, Object> hgetall(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // List 操作

    /**
     * 将一个值插入到列表 key 的表头
     *
     * @param key   key
     * @param value value
     * @return 执行 LPUSH 命令后,列表的长度。
     */
    public long lpush(String key, String value) {
        return redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 移除并返回列表 key 的头元素
     *
     * @param key key
     * @return 列表 key 的头元素。
     */
    public String lpop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 将一个值插入到列表 key 的表尾
     *
     * @param key   key
     * @param value value
     * @return 执行 LPUSH 命令后,列表的长度。
     */
    public long rpush(String key, String value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }
}

工具测试类

代码语言:javascript复制
package com.example.demo.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Redis 控制器
 */
@RestController
@RequestMapping("/api/rrredis")
public class Redis2Controller {

    @Autowired
    private RedisUtil redisOperator;

    /**
     * 设置 Redis 键值对
     *
     * @param key   键
     * @param value 值
     * @return 操作结果
     */
    @GetMapping("/set")
    public String set(String key, String value) {
        redisOperator.set(key, value);
        return "OK";
    }

    /**
     * 获取 Redis 值
     *
     * @param key 键
     * @return 对应的值
     */
    @GetMapping("/get")
    public Object get(String key) {
        return redisOperator.get(key);
    }

    /**
     * 删除 Redis 键值对
     *
     * @param key 键
     * @return 操作结果
     */
    @GetMapping("/delete")
    public String delete(String key) {
        redisOperator.del(key);
        return "OK";
    }
}

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞