小言_互联网的博客

Spring Boot 配置Redis数据库

377人阅读  评论(0)

  上一章我在docker中配置redis数据库,接下来就开始在spring boot框架中区去继承redis,并使用redis存储数据的演示

  导入jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.0.RELEASE</version>
</dependency>

  在.properties文件中配置reids,其中没有被注释的是常用的(手动翻译,有错请提出,小编会改正的)

# redis配置
# 是否开启redis缓存  true开启   false关闭
spring.redis.open=true
# Redis数据库索引(默认为0)
spring.redis.database=0
# 连接url
# spring.redis.url=
# redis服务器地址
spring.redis.host=127.0.0.1
# redis服务器密码
spring.redis.password=password
# redis服务器端口
spring.redis.port=6379
# 是否启用SSL连接
spring.redis.ssl=false
# 连接超时时长(毫秒)
spring.redis.timeout=6000ms
# 客户端名称
# spring.redis.client-name=
# redis服务器的名字
# spring.redis.sentinel.master=
# 主机端口列表
# spring.redis.sentinel.nodes=
# 要启动的主机端口列表
# spring.redis.cluster.nodes=
# 执行命令时要遵循的最大重定向数
# spring.redis.cluster.max-redirects=10
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=5
# 连接池最大连接数(使用负值表示没限制)
spring.redis.jedis.pool.max-active=10
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 两个空闲连接的线程时间
# spring.redis.jedis.pool.time-between-eviction-runs=
# 关闭超时时间
# spring.redis.lettuce.shutdown-timeout=100

  完成上面的配置后,现在开始简单的测试,通过去查询mysql数据库,然后将数据存在redis中,首先创建实体类并实现序列化接口

@Data
@ApiModel(value = "用户表")
@TableName(value = "user")//表格注解,指定数据库表格
public class User implements Serializable {//实现序列化接口,保证能存入redis
    @ApiModelProperty(value = "主键id")
    @TableId(value = "id", type = IdType.AUTO)//主键注解,指定主键
    private Integer id;
    @ApiModelProperty(value = "姓名")
    @TableField(value = "name")//字段注解,指定字段
    private String name;
    @ApiModelProperty(value = "年龄")
    @TableField(value = "age")
    private Integer age;
    @ApiModelProperty(value = "邮箱")
    @TableField(value = "email")
    private String email;
}

  使用默认的redis配置实现redis功能测试

import com.dyh.peachsys.service.IUserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class PeachsysApplicationTests {
    /**
     * redis模板对象
     * 封装了基本的方法
     */
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void contextLoads() {
        //存到redis中
        redisTemplate.opsForValue().set("user", "testUsername");
        //获取redis中的数据
        System.out.println(redisTemplate.opsForValue().get("user"));;
    }
}

  自定义redis配置类,因为默认的redis配置会导致中文乱码的问题,所以通过自定义配置来解决这个问题

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration //让Spring来加载该类配置
@EnableCaching //开启缓存
public class RedisConfig {
    //编写自己的配置
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        //JSON序列化实例
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper obj = new ObjectMapper();//转义对象
        obj.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        obj.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(obj);

        //String 序列化实例
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        /**
         * 配置序列化方式
         * 根据需要设置序列化方式
         */
        // key 的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash key的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value的序列化方式
        template.setValueSerializer(stringRedisSerializer);
        // hash value的序列化方式
        template.setHashValueSerializer(stringRedisSerializer);

        //配置连接工程
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

  通过自定义的配置进行测试,代码依旧使用上面的代码,区别如下图

  通过上面的代码及示例,我对redis进行自定义配置以及简单的功能测试演示。但是,上面的代码是通过原生的方式去操作的redis,比较麻烦,所以这里需要再写一个工具类去封装redis的方法,由于写的太多,大家可以再我的git源码上看,文末会给出地址,这里提供两个下面测试用的工具方法

	/**
	 * 存方法redis
	 */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, toJson(value));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 缓存获取
     */
    public String get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key).toString();
    }

    /**
     * Object转成JSON数据
     */
    private String toJson(Object object) {
        if (object instanceof Integer || object instanceof Long || object instanceof Float ||
                object instanceof Double || object instanceof Boolean || object instanceof String) {
            return String.valueOf(object);
        }
        return JSONObject.toJSONString(object);
    }

    /**
     * JSON数据,转成Object
     */
    public <T> List<T> toObject(String json, Class<T> clazz) {
        List<T> list = JSONArray.parseArray(json, clazz);
        return list;
    }

  现在来测试哈我写的工具类

@Test
    public void redisTest() {
        /**
         * 演示将从数据库回去的user存到redis中
         */
        //获取数据
        List<User> user = userService.list();
        // 通过工具保存
        // 本来是打算用list来存的
        // 但是弄了很久都没弄好
        // 所以这里建议使用json字符串来存储
        // 然后转换很方便
        boolean isTrue = redisUtil.set("user", user);

        System.out.println("是否保存成功:" + isTrue);
        //通过工具获取
        String str = redisUtil.get("user");
        List<User> users = redisUtil.toObject(str, User.class);
        for (User u : users) {
            System.out.println(u.getId());
            System.out.println(u.getName());
            System.out.println(u.getEmail());
            System.out.println(u.getAge());
        }
    }

  关于redis的使用就到这里,如果有问题欢迎提出探讨

git地址:https://github.com/peach-tec/peachsys


转载:https://blog.csdn.net/weixin_45481406/article/details/106199117
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场