springboot中redis正确的使用详解

作者:Dale 时间:2021-12-24 02:39:17 

redis实现了对数据的缓存,在项目里一些字典数据,会话数据,临时性数据都会向redis来存储,而在springboot里对redis也有支持,一般来说多个线程共同使用一个redis实现是有线程安全的风险的,而每个实现一个线程又太浪费资源,无法控制线程数量是非常危险的,所以就出现了一些redis线程池组件,下面说一下两个主要的组件。

jedis 线程池主要是每个实例有自己的线程,线程可以从它建立的池子里获取
lettuce lettuce是 apache推出的线程池工具,它的redis实例是可以被多个线程共享访问的,提高了资源使用率

redis序列化配置

一般来说, redis-key采用字符串序列化; redis-value采用json序列化, json的体积小,可读性高,不需要实现serializer接口。

/**
 * 对redis的配置.
 */
@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    /**
     * redis重写RedisTemplate.
     */
    @Bean
    public RedisTemplate redisTemplate() {
        RedisTemplate redisTemplate = new RedisTemplate();
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //序列化时允许非常量字段均输出类型,即redis序列化后带有类型
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // redis key的序列化
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);

        // redis value的序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

上面代码中,om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)产生的json串是带有类型的,这样再反序列化时可以直接通过类型去推断。

[
 "com.lind.basic.entity.Token",
 {
   "credentials": "ok",
   "region": "hello",
   "bucket": null
 }
]

看一下添加和读取的代码

 @GetMapping("set")
    public String set() throws JsonProcessingException {
        Token token = Token.builder()
                .credentials("ok")
                .region("hello")
                .build();
        redisTemplate.opsForValue().set("test:user", token);//redisTemplate帮我们序列化
        redisTemplate.opsForHash().put("author", "zzl", token);
        return "OK";
    }

    @GetMapping("get")
    public Token get() throws IOException {
        return (Token) redisTemplate.opsForValue().get("test:user");
    }

注意:对于实体类Token它应该有一个无参构造方法,这是反序列化时需要的。

来源:https://blog.csdn.net/m0_66876551/article/details/124388313

标签:springboot,redis使用
0
投稿

猜你喜欢

  • java实现多文件上传至本地服务器功能

    2022-01-26 11:55:24
  • java搭建ftp/sftp进行数据传递的全过程

    2023-11-29 15:08:10
  • Java实现最小生成树算法详解

    2023-11-25 04:51:22
  • Spring的IOC控制反转详解

    2023-08-24 02:50:50
  • Java Scanner 类的使用小结

    2023-11-29 00:50:39
  • java使用Jdom实现xml文件写入操作实例

    2022-09-30 02:38:23
  • Java实现Andriod带看括弧的计算器代码

    2023-04-06 09:36:00
  • C#生成带logo的二维码

    2021-11-03 17:38:41
  • Java并发(Runnable+Thread)实现硬盘文件搜索功能

    2023-05-06 04:59:22
  • JAVA操作MongoDB数据库实例教程

    2023-11-18 13:22:27
  • Mybatis拦截器的实现介绍

    2023-07-04 04:23:31
  • springmvc 中dao层和service层的区别说明

    2022-07-26 00:55:41
  • java身份证验证代码实现

    2023-12-09 16:10:50
  • 详解C# 托管资源和非托管资源

    2021-10-04 20:57:34
  • Java Lambda表达式超详细介绍

    2021-09-25 03:16:43
  • jdk8的datetime时间函数使用示例

    2021-07-03 16:42:37
  • java~springboot~ibatis数组in查询的实现方法

    2023-03-31 21:31:13
  • Mybatis plus 配置多数据源的实现示例

    2023-10-04 15:57:33
  • Java加载资源文件时的路径问题的解决办法

    2023-05-09 23:22:40
  • java实现幸运抽奖功能

    2023-11-27 07:24:16
  • asp之家 软件编程 m.aspxhome.com