SpringBoot 整合 Redis、Mybatis,封装 RedisUtils 工具类
创建SpringBoot项目(略)
Redis 部分
引入 redis 依赖
org.springframework.boot
spring-boot-starter-data-redis
Redis 配置类
package com.malf.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author malf
* @description Redis 配置类,设置Redis的Template
* @date 2021/5/23
* @project springboot_mybatis
*/
@Configuration
public class RedisConfig {
// redisTemplate注入到Spring容器
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
RedisSerializer redisSerializer = new StringRedisSerializer();
redisTemplate.setConnectionFactory(factory);
//key序列化
redisTemplate.setKeySerializer(redisSerializer);
//value序列化
redisTemplate.setValueSerializer(redisSerializer);
//value hashmap序列化
redisTemplate.setHashKeySerializer(redisSerializer);
//key hashmap序列化
redisTemplate.setHashValueSerializer(redisSerializer);
return redisTemplate;
}
}
配置 Redis 连接信息
spring:
redis:
# 连接的那个数据库
database: 0
# redis服务的ip地址
host: localhost
# redis端口号
port: 6379
# redis的密码,没设置过密码,可为空
password:
Redis 工具类
package com.malf.util;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author malf
* @description Redis 工具类
* @date 2021/5/23
* @project springboot_mybatis
*/
@Service
public class RedisUtils {
@Resource
private RedisTemplate redisTemplate;
private static double size = Math.pow(2, 32);
/**
* 写入缓存
*
* @param key
* @param offset 位 8Bit=1Byte
* @return
*/
public boolean setBit(String key, long offset, boolean isShow) {
boolean result = false;
try {
ValueOperations operations = redisTemplate.opsForValue();
operations.setBit(key, offset, isShow);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存
*
* @param key
* @param offset
* @return
*/
public boolean getBit(String key, long offset) {
boolean result = false;
try {
ValueOperations operations = redisTemplate.opsForValue();
result = operations.getBit(key, offset);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value) {
boolean result = false;
try {
ValueOperations operations = redisTemplate.opsForValue();
operations.set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存设置时效时间
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value, Long expireTime) {
boolean result = false;
try {
ValueOperations operations = redisTemplate.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 批量删除对应的value
*
* @param keys
*/
public void remove(final String... keys) {
for (String key : keys) {
remove(key);
}
}
/**
* 删除对应的value
*
* @param key
*/
public void remove(final String key) {
if (exists(key)) {
redisTemplate.delete(key);
}
}
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public boolean exists(final String key) {
return redisTemplate.hasKey(key);
}
/**
* 读取缓存
*
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
/**
* 哈希 添加
*
* @param key
* @param hashKey
* @param value
*/
public void hmSet(String key, Object hashKey, Object value) {
HashOperations hash = redisTemplate.opsForHash();
hash.put(key, hashKey, value);
}
/**
* 哈希获取数据
*
* @param key
* @param hashKey
* @return
*/
public Object hmGet(String key, Object hashKey) {
HashOperations hash = redisTemplate.opsForHash();
return hash.get(key, hashKey);
}
/**
* 列表添加
*
* @param k
* @param v
*/
public void lPush(String k, Object v) {
ListOperations list = redisTemplate.opsForList();
list.rightPush(k, v);
}
/**
* 列表获取
*
* @param k
* @param l
* @param l1
* @return
*/
public List
控制层
package com.malf.controller;
import com.malf.util.RedisUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author malf
* @description
* @date 2021/5/23
* @project springboot_mybatis
*/
@RestController
public class RedisController {
@Resource
private RedisUtils redisUtils;
@RequestMapping("setAndGet")
public String test(String k, String v) {
redisUtils.set(k, v);
return (String) redisUtils.get(k);
}
}
启动项目,测试 Redis
Mybatis 部分
添加 Mybatis 相关依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.1.23
配置 Mybatis 及其他
server:
port: 8000
mybatis:
# 配置扫描
mapper-locations: classpath:mapping/*Mapper.xml
# 实体类所在的包别名
type-aliases-package: com.malf.entity
configuration:
# 开启控制台打印sql
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# mybatis 下划线转驼峰配置
map-underscore-to-camel-case: true
#showSql
logging:
level:
com:
example:
mapper: debug
spring:
redis:
# 连接的那个数据库
database: 0
# redis服务的ip地址
host: localhost
# redis端口号
port: 6379
# redis的密码,没设置过密码,可为空
password:
# 数据库相关配置
datasource:
url: jdbc:mysql://localhost:3306/springboot_mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# 使用阿里巴巴druid数据源,默认使用自带
type: com.alibaba.druid.pool.DruidDataSource
启动类增加扫描路径
@MapperScan("com.malf.dao") // 扫描的mapper
entity、dao、service、controller 代码见源码参考
测试
Redis 作为 Mybatis 缓存
添加 fastjson 依赖
com.alibaba
fastjson
1.2.73
测试接口
@RequestMapping("test")
public Object test() {
// step1 先从redis中取
String strJson = (String) redisUtils.get("nbaPlayerCache");
if (strJson == null) {
System.out.println("从db取值");
// step2如果拿不到则从DB取值
List listNbaPlayer = nbaPlayerService.list();
// step3 DB非空情况刷新redis值
if (listNbaPlayer != null) {
redisUtils.set("nbaPlayerCache", JSON.toJSONString(listNbaPlayer));
return listNbaPlayer;
}
return null;
} else {
System.out.println("从redis缓存取值");
return JSONObject.parseArray(strJson, NBAPlayer.class);
}
}
打印台效果
压测工具
目前为止已经将SpringBoot、Redis和Mybatis整合到了一起,但是无法知道具体QPS多少,此时我们可以使用压测工具来测压,参考:https://www.cnblogs.com/chenyanbin/p/13332068.html