spring boot 2.7 整合redis实现数据存取 对象存取
阅读本文,通过redis优雅的存取数据/对象

1.引入依赖

//注意:spring boot默认集成了两个starter供选择
//另一个 -spring-boot-starter-data-redis-reactive- 为链式编程依赖包,该编程方式还在崛起阶段,这里不介绍。
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.添加配置

#添加你的redis服务器配置,注意你的redis是否有密码
spring:
  redis:
    database: 0
    port: 6379
    password: 123123
    host: 120.23.156.165

3.注入操作对象

//启动spring boot后,框架会自动扫描配置项并创建多种类型的redis操作对象
@Resource
private RedisTemplate<String,Object> redisTemplate;		//对象存取使用它
@Resource
private StringRedisTemplate stringRedisTemplate;		//简单类型使用它

4.存取对象或数据

//演示简单类型存取
String key = "Hello";
String value = "Redis";
stringRedisTemplate.opsForValue().set(key,value);
stringRedisTemplate.opsForValue().get(key);
...

//演示复杂对象存取(属性age=12 name=张三)
Student stu1 = new Student(12,"张三");					//准备对象
redisTemplate.opsForValue().set("stu1",stu1);			//存入对象
Student stu = redisTemplate.opsForValue().get("stu1");	//取出对象

5.问题解答

如果过程中你出现了一些问题,希望解答可以帮到你
  • redisTemplate注入报空指针异常?

1.尝试使用@Resource(先按名称,找不到则按类型)注入而不是@Autowired(类型注入)
 因为@Autowired的类型注入可能找不到我们规定泛型的类型,这种注入方式不规范,开发中不建议使用

2.使用Test运行时读取配置文件可能会有问题 请使用@TestPropertySource解决

  • redisTemplate注入报其它异常?

1.假如你使用了Resource注入方式,请确保按名称注入的对象是你想注入的对象,以下写法由于类型不匹配会报错(按名称找到的对象为RedisTemplate类型,类型赋值给StringRedisTemplate类型不被允许,报错)
@Resource
private StringRedisTemplate redisTemplate;

  • 网上教程都封装了工具类,我需要吗?

不需要,引入的依赖除了集成连接外,提供了官方工具类(即上面使用到的两个) 它们很好用

  • 通过redisTemplate为何取不到自己设置的值?

取值和设置值都使用redisTemplate对象就没问题了,取值为空因为工具底层进行了封装,你使用其它方法存进去的key与value不会被转码,但使用redisTemplate默认存取都是按照iso8859-1对键值对进行序列化,所以取不出正常值。存取工具对等就不会出问题(很多朋友设置配置文件解决此问题,没必要,会用工具很重要)

查看底层源码发现,redisTemplate从2.1开始默认序列化方式是U8,上方介绍部分是对的
Obtain a simple String to byte[] (and back) serializer using UTF-8 as the default java.nio.charset.Charset. 返回值:never null.自:2.1 源码如下:

static RedisSerializer<String> string() {
     return StringRedisSerializer.UTF_8;
    }

结论:通过统一工具存取不会出现问题,通过其它工具存,redisTemplate取,可能拿不到,因为工具与工具之间的编码格式不统一,最优解是使用最新sdk,统一电脑全局编码为U8

  • 为何别人有大量配置?

如果你的redis装在本机了,那么跳过 2.添加配置 步骤,你还是可以优雅的使用redis,为什么?

对于spring boot项目,我们最不需要的就是去写大量配置文件,因为各种依赖包默认都提供了它们认为最优解的配置,我们只需要修改一些不得不改的配置(例如这段数据源配置jdbc:mysql://localhost:1121/authe_0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8,因为提供工具的官方也猜不出来你到底要连接哪个数据库,但是redis官方猜到了你要连的数据库是db0,还猜到了你的redis端口是6379)


至于别人为何出现大量无意义配置,我也不知道…


                                                               

欢迎留言共同探讨

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐