SpringBoot入门(五)Redis数据缓存

Redis了解

一、缓存的应用场景

什么是缓存?
在互联网场景下,尤其 2C 端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用 Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。

Redis 是一个高性能的 key-value 数据库。GitHub 地址:https://github.com/antirez/redis 。Github 是这么描述的:
Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, HyperLogLogs, Bitmaps.

缓存的应用场景有哪些呢?
比如常见的电商场景,根据商品 ID 获取商品信息时,店铺信息和商品详情信息就可以缓存在 Redis,直接从 Redis 获取。减少了去数据库查询的次数。但会出现新的问题,就是如何对缓存进行更新?这就是下面要讲的。

二、更新缓存的策略

参考《缓存更新的套路》http://coolshell.cn/articles/17416.html,缓存更新的模式有四种:Cache aside, Read through, Write through, Write behind caching。

这里我们使用的是 Cache Aside 策略,从三个维度:(摘自 耗子叔叔博客)
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。

大致流程如下:
获取商品详情举例
a. 从商品 Cache 中获取商品详情,如果存在,则返回获取 Cache 数据返回。
b. 如果不存在,则从商品 DB 中获取。获取成功后,将数据存到 Cache 中。则下次获取商品详情,就可以从 Cache 就可以得到商品详情数据。
c. 从商品 DB 中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存

Redis安装及密码修改

redis安装及密码修改
redis修改密码(1)与2相互参考
redis修改密码(2)

项目配置

pom.xml中添加依赖

<dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> 
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>  
           <groupId>mysql</groupId>  
           <artifactId>mysql-connector-java</artifactId>  
</dependency>  
<dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> 

application.yml

spring:
  profiles:
    active:
    - dev
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/dbperson
    username: root  
    password: 123456
  jpa:
    hibernate:
      ddl-auto: create
      hbn2ddl:
        auto: update
    show-sql: true
 redis:
#redis数据库名称  从015,默认为db0 
    database: 1
    host: 127.0.0.1
    password: 123456
#redis服务器连接端口号 
    port: 6379
#redis连接池设置      
    pool:
      max-active: 8
      max-idle: 8
      max-wait: -1
      min-idle: 0
    timeout: 60000

StringRedisController

@RestController
public class StringRedisController {
    protected static Logger logger=LoggerFactory.getLogger(StringRedisController.class);
    @Resource
    StringRedisTemplate stringRedisTemplate;
    @Resource(name="stringRedisTemplate")
    ValueOperations<String, String> valOpsStr;

    @RequestMapping("set")
    public String setkayAndValue(String key,String value) {
        logger.info("访问set:key={},value={}",key,value);
        valOpsStr.set(key, value);
        return "key:"+key+",value:"+value;
    }

    @RequestMapping("get")
    public String getKey(String key) {
        logger.info("访问get:key{}",key);
        return valOpsStr.get(key);
    }
}

运行redis+运行项目
http://localhost:8088/set?key=123&&value=456
这里写图片描述

使用示例:

Fruit

public class Fruit implements Serializable {
    private static final long serialVersonUID=1L;

    private Integer id;
    private String name;
    private Integer price;
    public Fruit() {
        super();
    }

    public Fruit(Integer id, String name, Integer price) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }   
}

FruitDao

@Repository
public class FruitDao {
    @Autowired
    RedisTemplate<Object, Object> redisTemplate;
    @Resource(name="redisTemplate")
    ValueOperations<Object,Object> valOps;

    public void save(Fruit fruit) {
        valOps.set(fruit.getId(), fruit);
    }
    public Fruit getFruits(Integer id){
        return  (Fruit) valOps.get(id);
    }
}

FruitRedisController

@RestController
public class FruitRedisController {
    protected static Logger logger=LoggerFactory.getLogger(FruitRedisController.class);

    @Autowired
    FruitDao fruitDao;
    @RequestMapping(value="setFruit")
    public void setFruit(Integer id,String name,Integer price) {
        logger.info("id={},name={},price={}",id,name,price);
        Fruit fruit=new Fruit(id,name,price);
        fruitDao.save(fruit);
    }

    @RequestMapping(value="getFruit")
    public Fruit getFruits(Integer id){

        return fruitDao.getFruits(id);
    }
}

运行项目,浏览器输入:
http://localhost:8088/setFruit?id=1&&name=苹果&&price=4
http://localhost:8088/setFruit?id=2&&name=香蕉&&price=3
http://localhost:8088/setFruit?id=3&&name=橘子&&price=3
插入数据后进行查询
http://localhost:8088/getFruit?id=1
这里写图片描述

“Java分布式中间件大汇聚系列一(SpringBoot+Redis+RabbitMQ+ZooKeeper+Redisson....)” 包含了几大重磅性课程,学员 可以根据自己的喜好 进行学习,一步一个脚印深入巩固SpringBoot知识体系栈、消息中间件RabbitMQ、缓存中间件Redis 综合中间件Redisson 以及 分布式锁(ZooKeeper+Redisson+数据库级别锁...)的实现方式 1、SpringBoot实战知识体系~从菜鸟到小牛 本课程可以让学员一步一个脚印学习当前微服务SpringBoot项目开发涉及的相关技术要点,包括项目多模块搭建,通用上传文件服务,通用发送邮件服务,Redis,RabbitMQ等的学习掌握 2、SpringBoot2.0缓存中间件Redis技术入门与典型应用场景 这是一门关于目前相当流行的分布式缓存中间件Redis相关技术栈的介绍与实战,目的在于带领各位小伙伴一起学习、攻克Redis,更好地巩固自己的核心竞争力;值得介绍的是,本课程在技术层面涵盖了中间件Redis的相关技术栈,比如数据结构String、List、Set、SortedSet以及Hash等等,除此之外,在设计并实战“抢红包系统”以及实战各种数据结构对应的应用场景期间,也使用了微服务、分布式相关的技术。包括SpringBoot2.x、Mybatis、热部署工具、二倍均值法、多线程并发编程、发送邮件等等 3、RabbitMQ实战视频教程 本课程可以让学员零基础从官网的权威技术开发手册入手,学习掌握消息中间件RabbitMQ的各大专用词汇,之后会着重基于SpringBoot搭建的微服务项目实战RabbitMQ的各大知识要点,包括各大消息模型,异步解耦,异步通信发送邮件,业务服务模块解耦,死信队列实战以及死信队列实际业务场景实战等等 4、中间件Redisson实战视频教程,则是介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势! 5、分布式锁实战视频教程 本课程将更深入的实战当前分布式系统、微服务架构下“高并发多线程访问共享资源”时如何实现分布式锁,控制对于共享资源的访问,其中涉及到的相关技术主要是各种分布式中间件:Redis、Zookeeper、Redisson等,还有数据库级别的乐观悲观锁实战,最后还实战了两大常见的业务场景: (1)重复提交 (2)抢单系统如CRM系统销售人员抢单场景 (可以自行扩充到 “抢微信红包”、“商城系统抢单”、“美团骑手、滴滴司机、货拉拉司机抢单”等业务场景!!!) 相信学习了这套视频教程之后,将会更加深入的巩固各位学员的微服务以及分布式知识体系!!!
“Java分布式中间件大汇聚实战第1季 套餐课程~SpringBoot2.0+Redis+RabbitMQ+Redisson+ZooKeeper+面试突击” 包含了几大重磅性课程,学员 可以根据自己的喜好 进行学习,一步一个脚印深入巩固消息中间件RabbitMQ、缓存中间件Redis 综合中间件Redisson 以及 分布式锁(ZooKeeper+Redisson+数据库级别锁...)的实现方式 1、SpringBoot2.0缓存中间件Redis技术入门与典型应用场景: 这是一门关于目前相当流行的分布式缓存中间件Redis相关技术栈的介绍与实战,目的在于带领各位小伙伴一起学习、攻克Redis,更好地巩固自己的核心竞争力;值得介绍的是,本课程在技术层面涵盖了中间件Redis的相关技术栈,比如数据结构String、List、Set、SortedSet以及Hash等等,除此之外,在设计并实战“抢红包系统”以及实战各种数据结构对应的应用场景期间,也使用了微服务、分布式相关的技术。包括SpringBoot2.x、Mybatis、热部署工具、二倍均值法、多线程并发编程、发送邮件等等 2、RabbitMQ实战视频教程 :本课程可以让学员零基础从官网的权威技术开发手册入手,学习掌握消息中间件RabbitMQ的各大专用词汇,之后会着重基于SpringBoot搭建的微服务项目实战RabbitMQ的各大知识要点,包括各大消息模型,异步解耦,异步通信发送邮件,业务服务模块解耦,死信队列实战以及死信队列实际业务场景实战等等 3、中间件Redisson实战视频教程: 介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势! 4、分布式锁实战视频教程 : 本课程将更深入的实战当前分布式系统、微服务架构下“高并发多线程访问共享资源”时如何实现分布式锁,控制对于共享资源的访问,其中涉及到的相关技术主要是各种分布式中间件:Redis、Zookeeper、Redisson等,还有数据库级别的乐观悲观锁实战,最后还实战了两大常见的业务场景: (1)重复提交 (2)抢单系统如CRM系统销售人员抢单场景 (可以自行扩充到 “抢微信红包”、“商城系统抢单”、“美团骑手、滴滴司机、货拉拉司机抢单”等业务场景!!!) 相信学习了这套视频教程之后,将会更加深入的巩固各位学员的微服务以及分布式知识体系!!! 5、Java分布式中间件大汇聚实战第一季(基于SpringBoot2.0+典型业务场景+点赞系统+面试突击) : 主要介绍了企业级项目中真实应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)的实战, 同时也介绍了基于Redis设计并实战一款点赞系统(点赞、取消点赞、排行榜、用户中心、文章点赞用户列表…)可以说技术干货甚多,不仅可以巩固企业级应用系统的开发实战能力,相信在面试、跳槽涨薪方面也能带来相应的帮助!值得一提的是,本季课程实战的应用场景包括“日志记录”、“邮件发送”、“通告消息通知”、“短信验证码失效验证”、“会员到期自动提醒/到期前N天自动提醒”以及“点赞系统”的设计与实战。 课程的最后,我们给大家整理了一份最新的面向BAT大厂招聘 ~ 2020年程序猿最新的Java面试题(附带目录和答案),希望对各位小伙伴的成长有所帮助!
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页