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);
    }
相关推荐
希忘auto2 小时前
详解Redis在Centos上的安装
redis·centos
逻各斯7 小时前
redis中的Lua脚本,redis的事务机制
java·redis·lua
阿桢呀10 小时前
Redis实战篇《黑马点评》5
数据库·redis·缓存
01_10 小时前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
Kerwin要坚持日更11 小时前
一文讲解Redis中的主从复制
数据库·redis·缓存
Suk-god11 小时前
【Redis】基础知识入门
数据库·redis·缓存
zfj32112 小时前
手动搭建Redis1主2从+ 3 Sentinel 高可用集群
redis·sentinel·高可用
m0_7482309413 小时前
Redis 通用命令
前端·redis·bootstrap
Struggle Sheep15 小时前
linux安装redis
linux·运维·redis
guihong00418 小时前
Redis 深度解析:高性能缓存与分布式数据存储的核心利器
redis·分布式·缓存