springboot-redis配置

一、添加依赖

gradle方式:
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.7.18'

二、配置redis的序列化

redis默认使用JDKSerializer序列化,需要类都implements Serializer才能使用,修改量比较大,因此推荐使用第三方的序列化。
redis本身实现的序列化器如下:
在这里插入图片描述

GenericJackson2JsonRedisSerializer:在序列化时会携带信息,@class字段中会存对应的类信息,但是像JPA的Tuple类型的返回会是个代理类,此时反序列化就会失败。

配置如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfiguration {
    /**
     * redis序列化配置.
     *
     * @param redisConnectionFactory RedisConnectionFactory
     * @return RedisTemplate<String, Object>
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用 Jackson 提供的通用 Serializer
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        // String 类型的 key/value 序列化
       redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
        redisTemplate.setValueSerializer(serializer);
        // Hash 类型的 key/value 序列化
        redisTemplate.setHashKeySerializer(serializer);
        redisTemplate.setHashValueSerializer(serializer);
        return redisTemplate;
    }
}

三、封装redisTemplate

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * redis封装.
 *
 * @param <K> 键
 * @param <V> 值
 */
@Component
public class RedisTemplateWrap<K, V> {
    @Resource
    private RedisTemplate<K, V> redisTemplate;

    /**
     * set数据.
     *
     * @param key    键
     * @param object 值
     */
    public void set(K key, V object) {
        redisTemplate.opsForValue().set(key, object);
    }

    /**
     * set数据.
     *
     * @param key    键
     * @param addKey 手动追加键
     * @param object 值
     */
    public void set(K key, String[] addKey, V object) {
        redisTemplate.opsForValue().set(addKey(key, addKey, object), object);
    }

    /**
     * set数组对象数据-固定key.
     *
     * @param key    键
     * @param object 值
     */
    public <T extends V> void setCollection(K key, Collection<T> object) {
        object.forEach(v -> redisTemplate.opsForList().rightPush(key, v));
    }

    /**
     * set数组单个对象数据.
     *
     * @param key    键
     * @param object 值
     */
    public <T extends V> void setCollection(K key, T object) {
        redisTemplate.opsForList().rightPush(key, object);
    }

    /**
     * 设置数组对象数据-自定义key.
     *
     * @param key    键
     * @param addKey 通过追加Key获取T中的字段值拼接键
     * @param object 值
     */
    public <T extends V> void setCollection(K key, String[] addKey, Collection<T> object) {
        object.forEach(v -> redisTemplate.opsForList().rightPush(addKey(key, addKey, v), v));
    }

    /**
     * 设置HASH数据.
     *
     * @param key   键
     * @param value 值
     */
    public void setHash(K key, Map<?, ?> value) {
        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
            value.forEach((keys, values) -> redisTemplate.opsForHash().putIfAbsent(key, keys, values));
        }
        redisTemplate.opsForHash().putAll(key, value);
    }

    /**
     * 获取HASH数据.
     *
     * @param key     键
     * @param hashKey 值
     */
    public Object getHash(K key, Object hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    /**
     * 获取数据.
     *
     * @param key 键
     * @param t   类型
     * @return T
     */
    public <T> T get(K key, Class<T> t) {
        return (T) redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取数据.
     *
     * @param key 键
     * @return V
     */
    public V get(K key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取所有List数据.
     *
     * @param key 键
     * @return List<V>
     */
    public <T> List<T> getList(K key, Class<T> value) {
        return (List<T>) redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 拼接Key
     *
     * @param key 键
     * @param v   对象
     * @return K
     */
    private K addKey(K key, String[] addKey, Object v) {
        K ks = key;
        if (key instanceof String) {
            Class<?> classV = v.getClass();
            StringBuilder stringBuilder = new StringBuilder();
            Arrays.asList(addKey).forEach(ak -> {
                Field field = ReflectionUtils.findField(classV, ak);
                if (field != null) {
                    ReflectionUtils.makeAccessible(field);
                    Object valueByKey = ReflectionUtils.getField(field, v);
                    stringBuilder.append(valueByKey);
                }
            });
            ks = (K) (key + stringBuilder.toString());
        }
        return ks;
    }

}

### 使用 Spring BootRedis 进行注解开发 #### 1. 创建 Spring Boot 项目 为了开始使用 Spring BootRedis 的注解开发,首先需要创建一个新的 Spring Boot 项目。可以利用 Spring Initializr 来快速搭建基础环境[^1]。 #### 2. 添加依赖 接着,在 `pom.xml` 文件中加入必要的依赖项以便能够访问 Redis 数据库。具体来说就是引入 `spring-boot-starter-data-redis` 启动器: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 这一步骤确保了应用程序具备连接到 Redis 并执行基本命令的能力[^2]。 #### 3. 配置 Redis 随后,在配置文件 (`application.properties`) 中指定 Redis 实例的位置和其他参数,例如主机地址、端口号以及认证信息等: ```properties spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` 这些设置使得应用能够在运行时找到并正确地与目标 Redis 节点通信[^3]。 #### 4. 编写业务逻辑代码 对于基于注解的方式而言,主要关注于定义实体类及其关联的操作方法。下面是一个简单的例子展示如何通过 @RedisHash 注解声明一个映射至 Redis Hash 结构的 Java 类型,并为其提供 CRUD 方法支持: ```java import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; @RedisHash("users") // 表明该对象存储在名为 "users" 的哈希表里 public class User { @Id private Long id; // 主键字段,默认会作为 key 存储 private String name; // 用户名属性 public User() {} public User(Long id, String name) { this.id = id; this.name = name; } // Getter and Setter methods... } ``` 此外还需要编写相应的 Repository 接口继承自 CrudRepository 或 JpaRepository ,从而获得一系列预设的数据持久化接口函数: ```java import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Long> {} ``` 这样就可以方便地对上述定义的对象实施增删改查等一系列数据库操作而无需手动编码 SQL 查询语句。 #### 5. 控制层集成 最后一步是在控制层(Controller)中注入之前建立的服务组件并通过 RESTful API 形式对外暴露数据交互入口。这里给出一段简易示例说明怎样接收来自客户端提交的信息并将之保存进 Redis : ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserRepository userRepository; @PostMapping("") public ResponseEntity<String> createUser(@RequestBody User user){ try{ userRepository.save(user); return new ResponseEntity<>("User created successfully", HttpStatus.CREATED); }catch (Exception e){ return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR); } } // Other endpoints like GET, PUT, DELETE can be added similarly. } ``` 以上即完成了整个流程——从初始化工程到最后部署 Web 服务的过程介绍。值得注意的是实际应用场景下可能还会涉及到更多细节调整和技术选型考量,比如安全性加固措施或是性能优化策略等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值