菜鸟的成长之路——springboot整合redis

redis是一个key-value的存储形式,他存储在计算机的内存中,所以存储和读取的速度比较快。但是内存毕竟有局限,不如数据库安全,所以我们经常将redis和mysql配合使用,来提高一些常用数据的读取速度。今天我们使用springboot来整合一下redis。

  • 使用MySQL存储主页数据
  • springboot整合redis
  • 使用redis的集群

使用MySQL存储主页数据

我们拿首页推广的店铺数据来举例子,首先要从数据库创建出相应的数据表,
商家表provider结构如下:
这里写图片描述
推广商家表providerad结构如下:
这里写图片描述
商家的标签表provider_label如下:
这里写图片描述
我们创建实体类Provider如下:

package com.witkey.entity;

import java.util.ArrayList;

import org.springframework.stereotype.Component;
@Component
public class Provider {
    private String id;
    private String name;
    private String phoneNumber;
    private String password;
    private ArrayList<String> labels;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhoneNumber() {
        return phoneNumber;
    }
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public ArrayList<String> getLabels() {
        return labels;
    }
    public void setLabels(ArrayList<String> labels) {
        this.labels = labels;
    }
}

我们创建ProviderMapper.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    <mapper namespace="com.witkey.dao.ProviderMapper">
        <select id="getProviderad" resultType="com.witkey.entity.Provider">
            SELECT * FROM provider WHERE id in (SELECT providerid FROM providerad);
        </select>
        <select id="getLabels" resultType="String">
            SELECT label FROM provider_label WHERE id = #{id};
        </select>
    </mapper>

我们创建ProviderMapper.java如下:

package com.witkey.dao;

import java.util.ArrayList;
import java.util.HashMap;

import com.witkey.entity.Provider;

public interface ProviderMapper {
    public ArrayList<Provider> getProviderad();
    public ArrayList<String> getLabels(Provider provider);
}

我们创建ProviderService.java如下:

package com.witkey.service;

import java.util.ArrayList;

import com.witkey.entity.Provider;

public interface ProviderService {
    public ArrayList<Provider> getProvider();
}

我们创建ProviderServiceImpl.java如下:

package com.witkey.serviceImpl;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.witkey.dao.ProviderMapper;
import com.witkey.entity.Provider;
import com.witkey.service.ProviderService;

@Service
public class ProviderServiceImpl implements ProviderService{

    @Autowired
    private ProviderMapper providerMapper;
    public ArrayList<Provider> getProvider() {
        // TODO Auto-generated method stub
        ArrayList<Provider> providerList = providerMapper.getProviderad();
        for (Provider provider : providerList) {
            provider.setLabels(providerMapper.getLabels(provider));
        }
        return providerList;
    }

}

我们创建HomeController.java如下:

package com.witkey.controller;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.witkey.entity.Provider;
import com.witkey.service.ProviderService;

@RestController
@RequestMapping("action")
public class ProviderController {
    @Autowired
    private ProviderService providerService;
    @RequestMapping("/providerad.action")
    @ResponseBody
    public ArrayList<Provider> getProvider(){
        return providerService.getProvider();
    }
}

再创建一个js的文件,并引入index.html中,别忘了引入我们的jquery.js文件,js代码如下:

$(document).ready(function(){
    $.post("/action/providerad.action",
            {},
            function(data){
                providerad(data);
            });

});
function providerad(data){
    for(var i=1;i<=8;i++){
        $("#provider"+i+" .p1").text(data[i-1].name);
        alert(data[i-1].labels)
        for(var j=0;j<data[i-1].labels.length;j++){
            $("#provider"+i+" .p2").append("<span>"+data[i-1].labels[j]+"</span>");
        }
        $("#provider"+i+" img").attr("src","./static/imgs/25.png");
    }
}

这样,我们访问主页,可看到,我们从数据库中拿到的数据已经展示在我们的主页中了。


springboot整合redis

我们首先导入redis整合springboot的依赖,pom.xml如下:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

再配置yml配置文件,application.yml如下:

spring:
 datasource:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/user
  username: root
  password: 
 redis:
  database: 0
  host: 172.16.25.137
  port: 6379

mybatis:
 mapper-locations: classpath:com/witkey/dao/*Mapper.xml

我们在启动类中使用@EnableCaching开启redis缓存,WitkeyApplication.java如下:

package com.witkey;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;


@MapperScan("com.witkey.dao")
@SpringBootApplication
@EnableCaching
public class WitkeyApplication {
    public static void main(String[] args) {
        SpringApplication.run(WitkeyApplication.class, args);
    }
}

我们使用@Cacheable来进行数据的读取,如果缓存中有数据,优先从缓存里拿数据。如果缓存中没有这个数据,那么就会执行注解标注的方法,在方法中,我们从数据库查找数据就可以了,同时,这些数据也会被加到缓存中。
ProviderServiceImpl.java

package com.witkey.serviceImpl;

import java.util.ArrayList;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.witkey.dao.ProviderMapper;
import com.witkey.entity.Provider;
import com.witkey.service.ProviderService;

@Service
public class ProviderServiceImpl implements ProviderService{

    @Autowired
    private ProviderMapper providerMapper;
    @Cacheable(value="keytest")
    public ArrayList<Provider> getProvider() {
        // TODO Auto-generated method stub
        System.out.println("aaaaaa");
        ArrayList<Provider> providerList = providerMapper.getProviderad();
        for (Provider provider : providerList) {
            provider.setLabels(providerMapper.getLabels(provider));
        }
        return providerList;
    }

}

我们使用@CacheEvict注解标注方法,就可以删除缓存中相应的数据,使用方法如下:

@CacheEvict(value="keytest")
    public ArrayList<Provider> removeProvider() {
        // TODO Auto-generated method stub
        return new ArrayList<Provider>();
    }

调用这个方法,就可以删除redis中的数据了。
这样我们第一遍访问之前,看到rdm中没有数据,第一次访问之后,我们就可以看到rdm中有数据了,即使我们删除数据库中的数据,也是可以访问到这部分数据的。
这可以证明,我们确实可以从缓存中读取了数据。
我们修改数据,也就做到了同步redis和mysql中数据的效果。


使用redis的集群

(想搞dubbo了,集群有兴趣了再搞一下)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值