redis在springcloud中的使用
1.redis的使用场景
做中央缓存,通过空间换时间
特点:快、安全、持久、可用jedis java客户端
启动服务命令:redis-server.exe redis.conf
2.优化的好处
每次请求都要从数据库中查询数据,对数据库服务器压力很大;
3.常用的缓存实现
jpa/mybits的二级缓存,但是不能支持集群;所以用到了redis
4.怎么实现交互
前台请求-》先从redis中查询数据,有就之久返回数据;没有查询到数据就从数据库中查询,并同步到redis中,再返回前台;
5.保证redis中数据与数据库中的数据一致
修改时,先修改数据库中的数据再同步到redis中
6.redis怎么储存对象
序列化和json字符串(采纳),,,一般使用json字符串的方式
--1:存:
就是把数据库的数据存到redis(json字符串)
--2:取:
就是把redis(json字符串)的数据转换成对象
--3对象与json字符串的转换
我们使用到了 Alibaba:fastjson---功能很强大
7.redis的项目实战
--导包
<!--redis的依赖-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
--创建一个redis的一个工具类
/**
* pool:
* get和set
*/
public class RedisUtil {
static JedisPool jedisPool = null;
static {
GenericObjectPoolConfig poolConfig = new JedisPoolConfig();
//参数设置:
poolConfig.setMaxTotal(30);//最大连接数
poolConfig.setMaxIdle(10);//最大空闲数
poolConfig.setMaxWaitMillis(3*1000);//超时时间
poolConfig.setTestOnBorrow(true);//借的时候进行测试
//你在做的时候,应该丢到properties的配置文件:直接用这个工具类
String host = "127.0.0.1";
int port = 6379;
int timeout = 5 * 1000;
String password = "root";//根据自己的redis密码进行修改
jedisPool = new JedisPool(poolConfig, host, port, timeout, password);
}
//get和set
public static void set(String key,String value){
Jedis jedis=null;
try {
jedis = jedisPool.getResource();
jedis.set(key,value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
public static String get(String key){
Jedis jedis=null;
try {
jedis = jedisPool.getResource();
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
--controller调用set和get
@RestController
@RequestMapping("/common")
public class RedisController implements RedisClient{
@RequestMapping(value = "/redis",method = RequestMethod.POST)
@Override
public void set(@RequestParam("key") String key,@RequestParam("value") String value){
RedisUtil.set(key,value);
}
@RequestMapping(value = "/redis/{key}",method = RequestMethod.GET)
@Override
public String get(@PathVariable("key") String key){
return RedisUtil.get(key);
}
--启动类
@SpringBootApplication
@EnableEurekaClient
public class CommonApplication8848 {
public static void main(String[] args) {
SpringApplication.run(CommonApplication8848.class);
}
}
--yml配置
server:
port: 8848//端口
max-http-header-size: 4048576 #Request header is too large异常解决
spring:
application:
name: COMMON-PRIVODER
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300//地址
eureka:
instance:
hostname: localhsot
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:7001/eureka/ //注册到注册中心
--给内部的消费者访问
--redisclient
@RequestMapping("/common")
@FeignClient(value = "COMMON-PRIVODER",fallbackFactory = RedisClientCallBackFactory.class)//映射的服务名:在注册中心的服务名,告诉使用哪一个托底类
public interface RedisClient {
@RequestMapping(value = "/redis",method = RequestMethod.POST)
public void set(@RequestParam("key") String key, @RequestParam("value") String value);
@RequestMapping(value = "/redis/{key}",method = RequestMethod.GET)
public String get(@PathVariable("key") String key);
}
--RedisClientCallBackFactory
@Component
public class RedisClientCallBackFactory implements FallbackFactory<RedisClient> {
@Override
public RedisClient create(Throwable throwable) {
return new RedisClient() {
@Override
public void set(String key, String value) {
}
@Override
public String get(String key) {
return null;
}
};
}
}
--消费者
--依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
--service
* 使用中央缓存:
* 先从redis根据一个key获取:
* 1:没有:从mysql获取,放入redis,并返回
* 2:有:就直接返回
--抽取常量
public class GlobalConstant {
//redis的:商品分类的key
public static final String TREE_DATA="tree_data";
public static final String PAGE_MODEL="page_model";//页面静态需要的数据
public static final String TEMPLATE_FILE="template_file";//页面静态需要的模板路径
public static final String TARGET_FILE="target_file";//页面静态生成的静态页面路
}
@Override
public List<ProductType> treeData() {
//常量:
String treeDataRedis = redisClient.get(GlobalConstant.TREE_DATA);
if(StringUtils.isEmpty(treeDataRedis)){
//1:没有:从mysql获取,放入redis,并返回
redisClient.set(GlobalConstant.TREE_DATA,JSON.toJSONString(productTypes));//对象转换成json字符串
System.out.println("========mysql========");
return productTypes;
}else{
// 2有:就直接返回
System.out.println("=====cache==========");
return JSON.parseArray(treeDataRedis,ProductType.class);//json字符串转成对象
}
}