springboot中redis正确的使用详解
作者:Dale 发布时间:2021-12-24 02:39:17
标签:springboot,redis使用
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
0
投稿
猜你喜欢
- 1.编写核心类MainApp:package com.yiidian.gson;import com.google.gson.Gson;im
- Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设
- 目录一、数组、集合和 LINQ1、数组二、字符串内插三、模式匹配四、委托和 Lambda 表达式五、async/await六、属性一、数组、
- idea 鼠标悬浮显示详情2020 版 idea 之前file -> settings设置如下 2020 版 idea 之后
- 现实开发中,我们难免遇到跨域问题,以前笔者只知道jsonp这种解决方式,后面听说spring只要加入@CrossOrigin即可解决跨域问题
- 如下就可以获取button中的文本内容using System.Collections.Generic;using UnityEngine;
- 之前我在SpringBoot老鸟系列中专门花了大量的篇幅详细介绍如何集成Swagger,以及如何对Swagger进行扩展让其支持接口参数分组
- 包括了写入和读取功能. 写入的时候, 如果文件不存在会自动创建. 如果对应的键已经存在, 则自动覆盖它的值. 读取的时候, 如果对应的文件不
- 一个简单的HelloSpringMVC程序先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml v
- 工作闲暇之余去逛了逛CodeProject,刚好现有项目主要用到就是winform,浏览了下照片,找到上周带着蛋挞打疫苗回家的照片,于是新生
- 异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。1
- 抽象方法与虚方法的区别先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽
- 1 线程池的优势总体来说,线程池有如下的优势:(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。
- 1. 判断允许上传文件的 文件后缀/图片后缀/相片后缀 和 其它工具类import org.springframework.stereoty
- 1.Java内存模型JAVA定义了一套在多线程读写共享数据时时,对数据的可见性、有序性和原子性的规则和保障。屏蔽掉不同操作系统间的微小差异。
- 本人没有接触android开发,由于想学习一下,所以自学,接下来是我学习路线,希望我走过的路能给你提供帮助。 下载首先我们需要下载 Andr
- 假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,
- 本文实例讲述了C#字符串加密解密方法。分享给大家供大家参考。具体如下:#region 加密解密static string encryptKe
- SpringBoot 如何进行参数校验在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做校验,例如登录的时候需要校验
- 问答小剧场 以下会产生信息丢失的类型转换是( ) A.float a=10;