Springboot集成redis

1.数据库来实现
//让每个方法返回值都是json,不需要再加ResponseBody
@RestController
public class CacheConytroller {
@Resource
private KetiDao ketiDao;

//第一种获取课题的实现逻辑,只使用数据库来实现
//这种实现方式的优点:逻辑简单,不容易出现逻辑上的问题
//缺点:当请求量特别高的时候,所有的用户请求会直接打在数据库服务上
//数据库瞬间压力过大,会造成大量的耗时长的查询,这样会阻塞用户请求
//服务器积攒的请求数多了以后,会导致服务假死,无法处理请求
@RequestMapping("getKeti1")

public Keti getKeti1(int id){
return ketiDao.selectById(id);
}
2.使用redis缓存,引入jar包:pom.xml

org.springframework.boot
spring-boot-starter-data-redis

 //application.yml

redis:
//ip地址
host: 127.0.0.1
//默认端口号
port: 6379
jedis:
pool:
//最大等待时间
max-wait: 30000
//连接池最大连接数
max-active: 8
//最大空闲连接数
max-idle: 8
//最小空闲连接数
min-idle: 0
//超时时间
timeout: 3000

package com.haina.springboot.controller;

import com.haina.springboot.dao.KetiDao;
import com.haina.springboot.model.Keti;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController//让每个方法返回值都是json,不需要再加ResponseBody
public class CacheConytroller {
@Resource
private RedisTemplate<String,String> redisTemplate;
@Resource
private KetiDao ketiDao;

//第一种获取课题的实现逻辑,只使用数据库来实现
//这种实现方式的优点:逻辑简单,不容易出现逻辑上的问题
//缺点:当请求量特别高的时候,所有的用户请求会直接打在数据库服务上
//数据库瞬间压力过大,会造成大量的耗时长的查询,这样会阻塞用户请求
//服务器积攒的请求数多了以后,会导致服务假死,无法处理请求
@RequestMapping("getKeti1")

public Keti getKeti1(int id){
return ketiDao.selectById(id);
}
@RequestMapping(“testRedis”)
public String testRedis(){
//设置值,调用redis方法
redisTemplate.opsForValue().set(“springboot”,“123”);
return “ok”;
}
}

package com.haina.springboot.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

//方法的整体创建一个RedisTemplate类型的Bean,对对象进行配置,设置键和值的序列化,解决乱码
@Configuration
public class BeanConfig {
//在springboot项目里面,可以使用这种形式来配置bean,类似于spring xml
//文件里的bean标签的功能
//RedisConnectionFactory redis的连接工厂
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
//手动设置序列化方式,避免乱码(key和值)
//使用StringRedisSerializer来序列化和反序列化redis的key
redisTemplate.setKeySerializer(new StringRedisSerializer());

    //使用json格式来存储对象,把对象使用jackson进行序列化
    Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om=new ObjectMapper();
    //指定要序列化的范围,ANY表示所有字段(任何权限修饰符修饰的)都需要序列化
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson.setObjectMapper(om);

    //redis值使用jakson来序列化
    redisTemplate.setValueSerializer(jackson);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;

}

}

package com.haina.springboot.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

//方法的整体创建一个RedisTemplate类型的Bean,对对象进行配置,设置键和值的序列化,解决乱码
@Configuration
public class BeanConfig {
//在springboot项目里面,可以使用这种形式来配置bean,类似于spring xml
//文件里的bean标签的功能
//RedisConnectionFactory redis的连接工厂
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
//手动设置序列化方式,避免乱码(key和值)
//使用StringRedisSerializer来序列化和反序列化redis的key
redisTemplate.setKeySerializer(new StringRedisSerializer());

    //使用json格式来存储对象,把对象使用jackson进行序列化
    Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om=new ObjectMapper();
    //指定要序列化的范围,ANY表示所有字段(任何权限修饰符修饰的)都需要序列化
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson.setObjectMapper(om);

    //redis值使用jackson来序列化
    redisTemplate.setValueSerializer(jackson);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;

}

}

超过缓存时间时,再从数据库查询,并放入缓存:
在这里插入图片描述
3.本地缓存:

com.google.guava
guava
18.0

KetiService:

@Resource
private KetiDao ketiDao;
@Resource
private RedisTemplate<String,Keti> redisTemplate;
//构建者模式,设置属性
private LoadingCache<Integer,Keti> cache= CacheBuilder.newBuilder()
//过期时间30s
.expireAfterWrite(30,TimeUnit.SECONDS)
//最大的存储数量
.maximumSize(10)
//并发级别,同时支持5个
.concurrencyLevel(5)
//缓存加载的对象,提供加载缓存的方法
.build(new CacheLoader<Integer, Keti>() {
//load方法是在当通过key,在本地缓存中没有找到数据的时候,会调用load方法加载数据
@Override
public Keti load(Integer s) throws Exception {
return ketiDao.selectById(s);
}
});

public Keti getKetiWithCache(int id){
try {
return cache.get(id);
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}public Keti getKetiWithCache(int id){
try {
return cache.get(id);
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}
CacheController:

@RequestMapping(“getKeti3”)
public Keti getKeti3(int id){
return ketiService.getKetiWithCache(id);
}

本地缓存:(无法控制台输出)LoadingCache实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值