目录
[四. springBoot 集成使用 redis](#四. springBoot 集成使用 redis)
[(1). 概述](#(1). 概述)
[(2). 搭建](#(2). 搭建)
[1. 添加 redis 依赖](#1. 添加 redis 依赖)
[2. 配置连接 redis](#2. 配置连接 redis)
[3. 注入 RedisTemplate](#3. 注入 RedisTemplate)
[4. 测试](#4. 测试)
[5. 后端测试redis](#5. 后端测试redis)
四. springBoot 集成使用 redis
(1). 概述
Jedis 是 Redis 官方推出的一款面向 Java 的客户端,提供了很多接口供 Java 语言调用。可以在 Redis 官网下载.
Spring-data-redis 是 spring 大家族的一部分 ,提供了在 srping 应用中通过简单的配置访问 redis 服务,对 reids 底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate 提供了 redis 各种操作.
spring-data-redis 针对 Redis 提供了如下功能:
1.连接池自动管理,提供了一个高度封装的"RedisTemplate"类.
2.针对 jedis 客户端中大量 api 进行了归类封装,将同一类型操作封装为operation 接口.
ValueOperations:简单 K-V 操作
SetOperations:set 类型数据操作
ZSetOperations:zset 类型数据操作
HashOperations:针对 map 类型的数据操作
ListOperations:针对 list 类型的数据操作
3.将事务操作封装,有容器控制。
4.针对数据的"序列化/反序列化",提供了多种可选择策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO 对象的存取场景,使用 JDK 本身序列化机制.
StringRedisSerializer:Key 或者 value 为字符串的场景,根据指定的charset 对数据的字节序列编码成 string,是"new String(bytes, charset)"和 "string.getBytes(charset)"的直接封装。是最轻量级和高效的策略。
JacksonJsonRedisSerializer:jackson-json 工具提供了 javabean 与 json之间的转换能力,可以将 pojo 实例序列化成 json 格式存储在 redis 中,也可以将 json 格式的数据转换成 pojo 实例。
(2). 搭建
1. 添加 redis 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置连接 redis
spring:
redis:
host: 192.168.31.100
port: 6379
password: 111
database: 0
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 5000ms # 连接超时时间(毫秒)
3. 注入 RedisTemplate
@Autowired
RedisTemplate redisTemplate;
4. 测试
redisTemplate.opsForValue().set("name", "aa");
redisTemplate.opsForValue().set("users", users,10*1000, TimeUnit.MILLISECONDS);
redisTemplate.hasKey("name");
redisTemplate.opsForValue().get("name");
redisTemplate.delete("users");序列化键值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
需要被 Redis 缓存的类,必须实现序列化接口
5. 后端测试redis
将上述命令转为后端的方法
java
package com.ffyc.news.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.news.model.Menu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping(path = "/redistest")
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping(path = "testhash")
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("newsid1","dz",10);//点赞
hashOperations.put("newsid1","fw",20);//访问
hashOperations.put("newsid1","sc",5);//收藏
System.out.println(hashOperations.get("newsid","sc"));
}
@GetMapping(path = "/teststring")
public void testString(){
//序列化,也可以添加配置类进行序列化 省去每次都添加序列化代码
//redisTemplate.setKeySerializer(new StringRedisSerializer());//key键进行序列化
//redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));//value值进行序列化
System.out.println(redisTemplate.delete("age"));//删除key键
System.out.println(redisTemplate.hasKey("a"));//判断键key是否存在
//获取String类型操作方法, ValueOperations封装操作String类型的方法
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("k","kk");
System.out.println(valueOperations.get("k"));
valueOperations.set("count",0);
valueOperations.increment("count");
valueOperations.increment("count");
valueOperations.increment("count");//自增
valueOperations.decrement("count");//自减
System.out.println(valueOperations.get("count"));
Menu menu = new Menu();
menu.setId(1);
menu.setName("新闻管理");
valueOperations.set("menu",menu,10, TimeUnit.MINUTES);//(键,对象,失效时间,时间单位)
}
}
注意: 添加redis序列化 避免redis中的数据格式与Java传输的数据格式不一致,操作失败
java
package com.ffyc.news.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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
//redis序列化键值
@Configuration
public class RedisConfig {
/**
* 序列化键,值
* @param connectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//序列化策略
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
StringRedisSerializer redisSerializer = new StringRedisSerializer();
//key序列化为普通的
redisTemplate.setKeySerializer(redisSerializer);//key 单一的字符串
redisTemplate.setHashKeySerializer(redisSerializer);
//将String,Hash结构值都序列化为json字符串
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value {}
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
如果开机redis没有启动,需要自己打开. 地址如下
D:\development\redis
