Spring整合redis
Spring Data 好处很方便操作对象类型。 把Redis不同值得类型放到一个opsForXXX方法中。
opsForValue : String值
opsForList : 列表List
opsForHash: 哈希表Hash
opsForZSet: 有序集合Sorted Set
opsForSet : 集合
导入依赖
<!--redis启动器 其他不做描述-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.6.4</version>
</dependency>
跟之前的架构一样,
这里只展示关键代码~
定义一个redis配置类
package com.gavin.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;
@Configuration
public class RedisConfigDemo {
/**
* @param factory
* @return RedisTemplate
* <p>
* RedisTemplate --简化 Redis 数据访问代码的助手类
* </p>
* RedisTemplate<K,V> 类型参数:
* K- 模板工作的 Redis 键类型(通常是字符串)
* V- 模板适用的 Redis 值类型
* 在给定对象和底层二进制数据之间执行自动序列化/反序列化 Redis 存储。
* 默认情况下,它对其对象使用JdkSerializationRedisSerializer 序列化。
* 对于字符串密集型操作,请考虑用 StringRedisTemplate.
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
/**
* 设置连接工厂~Redis连接的线程安全工厂。
*/
template.setConnectionFactory(factory);
/**设置key~字符串序列化方式
* StringRedisSerializer
* 简单的 String到 byte[] (和返回)序列化程序。
* 转换 Strings 使用指定的字符集(默认为 UTF-8)转换为字节,反之亦然。
* 当与 Redis 的交互主要通过字符串发生时很有用。
* 不执行任何 null 转换,因为空字符串是有效的键/值
*/
template.setKeySerializer(new StringRedisSerializer());
/**Jackson2JsonRedisSerializer
* 读取和写入 JSON 格式 对象
* 转换器可用于绑定到类型化的 bean,或非类型化的 HashMap实例。
* 注意: Null 对象被序列化为空数组,反之亦然。
*/
template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
return template;
}
}
服务实现
package com.gavin.service.impl;
import com.gavin.mapper.GoodsMapper;
import com.gavin.pojo.Goods;
import com.gavin.service.redisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.stereotype.Service;
@Service
public class redisServiceImpl implements redisService {
@Autowired
private GoodsMapper goodsMappper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public Goods selectById(Integer id) {
// 先从redis中获取数据
String key = "Goods:" + id;
if (redisTemplate.hasKey(key)) {
System.out.println("执行缓存查找");
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Goods>(Goods.class));
Goods goods = (Goods) redisTemplate.opsForValue().get(key);
return goods;
}
System.out.println("执行了mysql");
Goods goods = goodsMappper.selectByPrimaryKey(id);
//将数据放入redis
// redisTemplate.opsForValue()返回对值的操作
redisTemplate.opsForValue().set(key,goods);
return goods;
}
}
controller层
import com.gavin.pojo.Goods;
import com.gavin.service.redisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Gavin
*/
@Controller
public class RedisController {
@Autowired
private redisService redisService;
@RequestMapping("/goods")
public String selectById(Integer id, Model model) {
Goods goods = redisService.selectById(id);
model.addAttribute("goods",goods);
return "index";
}
}
application.yml
spring:
#配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/gavin
username: gavin
password: 955945
#单机版redis设置
redis:
host: 192.168.135.145
port: 6379
# redis集群配置
redis:
cluster:
nodes: 192.168.135.145:6789,192.168.135.145:6790,192.168.135.145:6791,192.168.135.145:6792,192.168.135.145:6793,192.168.135.145:6794
mybatis:
#mapper位置
mapper-locations: classpath:/com.gavin.mapper/*.xml
#实体类别名
type-aliases-package: com.gavin.pojo
返回list集合
//list集合
@Override
public List<Goods> selectAllGoods() {
String key="goodsInfo";
if (redisTemplate.hasKey(key)){
System.out.println("redis缓存中已找到");
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<List>(List.class));
List<Goods> goodsInfo = (List<Goods>)redisTemplate.opsForValue().get("goodsInfo");
return goodsInfo;
}
System.out.println("执行了 mysql");
List<Goods> goodsInfo = goodsMappper.selectAll();
redisTemplate.opsForValue().set(key,goodsInfo);
return goodsInfo;
}