SpringBoot集成Memcached实现高效缓存
  19qMgiCiiRfc 2023年12月22日 59 0

一、前言

Memcached是一款高性能的分布式内存对象缓存系统,可以用来缓存SQL查询结果、API调试结果等。使用Memcached可以减少对数据库的查询次数,提高系统性能。它主要用于减轻数据库负载,提供应用系统,减少数据库压力。SpringBoot可以快速集成Memcached实现对缓存到读写操作。


二、安装和配置

下载和安装Memcached我们可以下载我们系统的相关版本。

我们下载好之后,解压文件夹得到下面文件。

SpringBoot集成Memcached实现高效缓存_SpringBoot

运行方法:

我们需要命令行到当前目录执行以下命令。

1.先安装服务 memcached.exe -d install 以管理员身份运行。

2.启动服务 memcached.exe -d start

3.关闭服务  memcached.exe -d stop

我们启动服务后也可以在服务上找到刚才我们创建的服务。

SpringBoot集成Memcached实现高效缓存_memcached_02

三、常用命令

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

我们的目的是第一次没有缓存会先请求数据库,第二次请求会直接使用缓存。

SpringBoot集成Memcached实现高效缓存_缓存_03

我们查看控制台的日志显示数据库的查询语句。

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=?

我们第二次请求数据同样返回了数据,这是因为返回了缓存中的数据。

SpringBoot集成Memcached实现高效缓存_memcached_04

控制台的日志显示使用了缓存返回数据。

2023-12-20 18:00:34.621  INFO 19504 --- [nio-8080-exec-7] c.example.nettydemo.service.UserService  : 使用缓存返回数据

这样我们就完成了SpringBoot集成Memached实现简单的数据缓存。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
19qMgiCiiRfc