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字符串转成对象
    }
}
 
 
                    
                
                
            
        
浙公网安备 33010602011771号