目录
- 前言
- 为什么要使用redis呢?
- 相关依赖
- 配置
- 数据库
- 实体类
- redisconfig
- mapper
- service接口
- service实现类
- 测试redis
- controller
前言
redis是一个开源的使用ansi c语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。从2010年3月15日起,redis的开发工作由vmware主持。从2013年5月开始,redis的开发由pivotal赞助。
为什么要使用redis呢?
举个例子,假如系统中有2千万用户信息,用户信息基本固定,一旦录入很少变动,那么你每次加载所有用户信息时,如果都要请求数据库,数据库编译并执行你的查询语句,这样效率就会低下很多,针对这种信息不经常变动并且数据量。
较大的情况,通常做法,就是把他加入缓存,每次取数前先去判断,如果缓存不为空,那么就从缓存取值,如果为空,再去请求数据库,并将数据加入缓存,这样大大提高系统访问效率。
相关依赖
<!-- springboot版本 --> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.2.7.release</version> </parent> <!-- 依赖 --> <dependencies> <!-- redis --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid> </dependency> <!-- 通用池 --> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-pool2</artifactid> </dependency> <!-- mysql --> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> </dependency> <!-- mybatis --> <dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>2.1.1</version> </dependency> <!-- 通用mapper --> <dependency> <groupid>tk.mybatis</groupid> <artifactid>mapper-spring-boot-starter</artifactid> <version>2.1.5</version> </dependency> <!-- lombok --> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> </dependency> <!-- test --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> </dependency> </dependencies>
配置
# 端口
server:
port: 9998
# mysql数据源
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/dbtest?servertimezone=gmt%2b8
# redis
redis:
host: localhost
port: 6379
timeout: 1000
jedis:
pool:
min-idle: 5
max-idle: 10
max-wait: -1
# mybatis
mybatis:
mapper-locations: classpath:/mybatis/mapper/*.xml
type-aliases-package: cn.kgc.entities
# 开启驼峰命名
configuration:
map-underscore-to-camel-case: true
# log
logging:
level:
cn.kgc: debug
数据库
#建表create table `emp` ( `id` int(11) not null auto_increment, `name` varchar(255) character set utf8 collate utf8_general_ci null default null, `age` int(11) null default null, primary key (`id`) using btree) engine = innodb character set = utf8 collate = utf8_general_ci row_format = dynamic;#插入数据insert into `emp` values (1, '张三', 18);insert into `emp` values (2, '李四', 20);insert into `emp` values (3, '王五', 22);
实体类
emp
@data
@table(name = "emp")
public class emp implements serializable {
@id
@generatedvalue(strategy = generationtype.identity)
private integer id;
private string name;
private integer age;
}
redisconfig
指定redis序列化方式
@configuration
public class redisconfig {
@bean
public redistemplate<string,object> redistemplate(redisconnectionfactory factory){
redistemplate<string,object> redistemplate = new redistemplate<>();
redistemplate.setconnectionfactory(factory);
// 指定kv的序列化方式
jackson2jsonredisserializer jackson2jsonredisserializer = new jackson2jsonredisserializer(object.class);
redistemplate.setvalueserializer(jackson2jsonredisserializer);
redistemplate.setkeyserializer(new stringredisserializer());
return redistemplate;
}
}
mapper
emp的mapper接口继承tk的mapper类,泛型为实体类emp
public interface empmapper extends mapper<emp> {
}
service接口
业务接口定义add添加和getempbyid根据id查询的方法
public interface empservice {
public void add(emp emp);
public object getempbyid(integer id);
}
service实现类
先查redis,redis没有数据再从数据库中拿数据,同时缓存到redis中。
@service
@slf4j
public class empserviceimpl implements empservice {
@autowired
public redistemplate redistemplate;
@resource
private empmapper empmapper;
@override
public void add(emp emp) {
empmapper.insert(emp);
}
@override
public object getempbyid(integer id) {
// 先从缓存获取数据,如果有则直接返回
// 如果无,则查询mysql,并将数据设置到缓存
string key = "user:" + id;
object userobj = redistemplate.opsforvalue().get(key);
if(userobj == null){
synchronized (this.getclass()){
userobj = redistemplate.opsforvalue().get(key);
if(userobj == null ){
log.debug("----> 查询数据库..............");
// 查数据库
emp emp = empmapper.selectbyprimarykey(id);
redistemplate.opsforvalue().set(key,emp);
return emp;
}else{
log.debug("----> 查询缓存(同步代码块)>>>>>>>>>>>>>>>>>");
return userobj;
}
}
}else{
log.debug("----> 查询缓存>>>>>>>>>>>>>>>>>");
}
return userobj;
}
}
测试redis
redis-controller
@restcontroller
public class rediscontoller {
@autowired
private redistemplate redistemplate;
@getmapping("/redis/get/{key}")
public object get(@pathvariable("key") string key){
return redistemplate.opsforvalue().get(key);
}
@postmapping("/redis/set/{key}/{value}")
public object set(@pathvariable("key") string key,
@pathvariable("value") string value){
redistemplate.opsforvalue().set(key,value);
return "set success";
}
}
controller
redis+mysql
@restcontroller
public class empcontroller {
@autowired
private empservice empservice;
@postmapping("/emp")
public string addemp(emp emp){
empservice.add(emp);
return "add ok";
}
@getmapping("/emp/{id}")
public object getempbyid(@pathvariable("id") integer id){
executorservice es = executors.newfixedthreadpool(200);
for(int i=0 ;i<500;i++){
es.submit(new runnable() {
@override
public void run() {
empservice.getempbyid(id);
}
});
}
return empservice.getempbyid(id);
}
}
到此这篇关于springboot整合redis入门之缓存数据的文章就介绍到这了,更多相关springboot整合redis缓存数据内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!