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了,集群有兴趣了再搞一下)