一、前言
Memcached是一款高性能的分布式内存对象缓存系统,可以用来缓存SQL查询结果、API调试结果等。使用Memcached可以减少对数据库的查询次数,提高系统性能。它主要用于减轻数据库负载,提供应用系统,减少数据库压力。SpringBoot可以快速集成Memcached实现对缓存到读写操作。
二、安装和配置
下载和安装Memcached我们可以下载我们系统的相关版本。
我们下载好之后,解压文件夹得到下面文件。
运行方法:
我们需要命令行到当前目录执行以下命令。
1.先安装服务 memcached.exe -d install 以管理员身份运行。
2.启动服务 memcached.exe -d start
3.关闭服务 memcached.exe -d stop
我们启动服务后也可以在服务上找到刚才我们创建的服务。
三、常用命令
set:存储数据 set key flags exptime bytes [noreply] value
get:获取数据 get key
delete:删除数据 delete key
incr:增加一个值 incr key increment_value
decr:减少一个值: decr key decrement_value
四、SpringBoot集成Memcached
1.添加依赖
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.5</version>
</dependency>
2.Memcached配置
package com.example.nettydemo.config;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
/**
* @author qx
* @date 2023/12/20
* @des memcached的配置类
*/
@Configuration
public class MemcachedConfig {
@Bean
public MemcachedClient getMemcachedClient() throws IOException {
//memcached默认对外服务端口11211。
MemcachedClientBuilder memcachedClientBuilder = new XMemcachedClientBuilder("localhost:11211");
return memcachedClientBuilder.build();
}
}
3.创建数据实体
package com.example.nettydemo.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author qx
* @date 2023/12/20
* @des 测试实体
*/
@Entity
@Table(name = "t_user")
@Data
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
}
4.创建服务类
具体步骤是先获取缓存的操作,如果缓存存在就直接返回,或者缓存不存在就请求数据库然后把数据添加到缓存中并返回。
package com.example.nettydemo.service;
import com.example.nettydemo.entity.User;
import com.example.nettydemo.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.concurrent.TimeoutException;
/**
* @author qx
* @date 2023/12/20
* @des
*/
@Slf4j
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Resource
private MemcachedClient memcachedClient;
public User getUserById(Long id) throws InterruptedException, TimeoutException, MemcachedException {
// 使用Memcached查询指定的缓存
User user = memcachedClient.get(String.valueOf(id));
if (user == null) {
log.info("没有缓存,请求数据库");
user = userRepository.findById(id).orElse(null);
if (user != null) {
// 设置缓存
memcachedClient.set(String.valueOf(id), 300, user);
}
} else {
log.info("使用缓存返回数据");
}
return user;
}
}
5.控制层
package com.example.nettydemo.controller;
import com.example.nettydemo.entity.User;
import com.example.nettydemo.service.UserService;
import net.rubyeye.xmemcached.exception.MemcachedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeoutException;
/**
* @author qx
* @date 2023/12/20
* @des
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User selectUserById(@PathVariable("id") Long id) throws InterruptedException, TimeoutException, MemcachedException {
return userService.getUserById(id);
}
}
6.测试
我们请求查询ID为1的数据。http://localhost:8080/user/1
我们的目的是第一次没有缓存会先请求数据库,第二次请求会直接使用缓存。
我们查看控制台的日志显示数据库的查询语句。
2023-12-20 17:59:07.469 INFO 19504 --- [nio-8080-exec-5] c.example.nettydemo.service.UserService : 没有缓存,请求数据库
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from t_user user0_ where user0_.id=?
我们第二次请求数据同样返回了数据,这是因为返回了缓存中的数据。
控制台的日志显示使用了缓存返回数据。
2023-12-20 18:00:34.621 INFO 19504 --- [nio-8080-exec-7] c.example.nettydemo.service.UserService : 使用缓存返回数据
这样我们就完成了SpringBoot集成Memached实现简单的数据缓存。
标签:缓存,SpringBoot,nettydemo,id,user,import,Memcached,example From: https://blog.51cto.com/u_13312531/8920962