12.SpringDataRedis

介绍

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中redis的集成模块就叫做SpringDataRedis。

spring的思想从来都不是重新生产,而是整合其他技术。

SpringDataRedis的特点

1.提供了对不同redis客户端的整合(jedis,lettuce)

2.提供了RedisTemplate统一api来操作redis

3.支持redis的发布订阅模型

4.支持redis的哨兵和redis集群

5.支持基于lettuce的响应式编程

6.支持基于jdk,json,字符串,spring对象的数据序列化和反序列化

7.支持基于redis的JDKCollection实现

redisTemplate的操作方法

基于SpringBoot整合SpringDataRedis

1.引入依赖

复制代码
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
复制代码
<!--连接池依赖,redis使用连接池-->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
</dependency>

2.配置文件

复制代码
spring:
  redis:
    host: 192.168.171.130
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-idle: 8 # 最大空闲连接
        max-active: 8 # 最大连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100ms # 连接等待时间

这里引入的是lettuce的连接池,因为springBootDataRedis默认使用的是lettuce连接池。但是如果向使用jedis的连接池,就需要再引入jedis的依赖,同时配置文件也要使用jedis连接池的配置。

3.使用

java 复制代码
package com.xkj.org;

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
public class SpringBootDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        //插入一条String类型的数据
        redisTemplate.opsForValue().set("name", "张安");
        //读取一条String类型的数据
        Object value = redisTemplate.opsForValue().get("name");
        System.out.println("value="+value);

    }
}

**注意:**可以看出name和value都被序列化了。默认采用了jdk的序列化。

缺点:

1.可读性差

2.内存占用大

需要改变redis的序列化方式,

推荐使用

StringRedisSerializer来序列化字符串key。

GenericJackson2JsonRedisSerializer来序列化value对象,转成json字符串。

RedisTemplate配置类

java 复制代码
package com.xkj.org.config;

import org.springframework.context.annotation.Bean;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {


    /**
     * redis连接工厂对象会由spring自动创建
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //1.创建RedisTemplate对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //2.设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //3.创建json序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //4.设置key的序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //5.设置value的序列化
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        //6.返回
        return redisTemplate;
    }
}

测试类

java 复制代码
package com.xkj.org;

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
public class SpringBootDataRedisTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
        //插入一条String类型的数据
        redisTemplate.opsForValue().set("name", "张安");
        //读取一条String类型的数据
        Object value = redisTemplate.opsForValue().get("name");
        System.out.println("value="+value);

    }
}

如果测试过程中报错:

是因为使用了jackson,没有引入对应的依赖。

复制代码
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
</dependency>

value存入java对象

java 复制代码
@Test
    void testStudent() {
        redisTemplate.opsForValue().set("student:100", new Student("小明", 22));
        Student student = (Student) redisTemplate.opsForValue().get("student:100");
        System.out.println("student="+student);
    }
相关推荐
ApacheSeaTunnel29 分钟前
用 Apache SeaTunnel 同步 DynamoDB 到 Redis,一个配置文件就够
redis·开源·seatunnel·数据同步·dynamodb
MetaLite4 小时前
SpringBoot防重复提交-加一把Redis锁就够吗
spring boot·redis·后端
Seraphina364 小时前
记一次实验:利用缓存服务器规范化技术进行网页缓存欺骗
经验分享·笔记·网络安全·缓存
草莓熊Lotso1 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
小白勇闯网安圈2 天前
String、Hash、List、Set 四大数据结构与通用命令
redis
云存储小天使2 天前
训练效率提升50%以上:GooseFS 写缓存及其在具身智能数据处理中的应用
缓存·腾讯云·对象存储·goosefs
2601_962071172 天前
八. Spring Boot2 整合连接 Redis(超详细剖析)
spring boot·redis·后端
程序员夏洛2 天前
Redis 数据过期后的删除策略是什么?
数据库·redis·缓存
鱼鳞_2 天前
热门八股-Redis
数据库·redis·缓存
程序员夏洛2 天前
Redis 的持久化机制有哪些?
java·数据库·redis