SpringBoot整合Redis入门之缓存数据的方法

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

      (0)
      上一篇 2022年3月21日
      下一篇 2022年3月21日

      相关推荐