目录
- 前言
- 为什么要使用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!