【SpringBoot】整合Redis实战

时间:2021-05-08 17:27:47

========================9、SpringBoot2.x整合Redis实战 ================================

 


1、分布式缓存Redis介绍
简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具
【SpringBoot】整合Redis实战

通过缓存减少数据库访问,提高访问速度


1、redis官网 https://redis.io/download

2、新手入门redis在线测试工具:http://try.redis.io/

 


2、源码编译安装Redis4.x
简介:使用源码安装Redis4.x和配置外网访问

1、快速安装 https://redis.io/download#installation
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xzf redis-4.0.9.tar.gz
cd redis-4.0.9
make

启动服务端:src/redis-server
启动客户端:src/redis-cli

2、默认是本地访问的,需要开放外网访问
1)打开redis.conf文件在NETWORK部分修改
注释掉bind 127.0.0.1可以使所有的ip访问redis
修改 protected-mode,值改为no

 【SpringBoot】整合Redis实战查看当前占用端口

 

 

 

3、SpringBoot2.x整合redis实战讲解

简介:使用springboot-starter整合reids实战

1、官网:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-redis
集群文档:https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#cluster

2、springboot整合redis相关依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3、相关配置文件配置
#=========redis基础配置=========
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6390
# 连接超时时间 单位 ms(毫秒)
spring.redis.timeout=3000

#=========redis线程池设置=========
# 连接池中的最大空闲连接,默认值也是8。
spring.redis.pool.max-idle=200

#连接池中的最小空闲连接,默认值也是0。
spring.redis.pool.min-idle=200

# 如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.pool.max-active=2000

# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
spring.redis.pool.max-wait=1000

 

4、常见redistemplate种类讲解和缓存实操(使用自动注入)

1、注入模板
@Autowired
private StirngRedisTemplate strTplRedis

2、类型String,List,Hash,Set,ZSet
对应的方法分别是opsForValue()、opsForList()、opsForHash()、opsForSet()、opsForZSet()

 

【SpringBoot】整合Redis实战【SpringBoot】整合Redis实战
package com.atguigu.springboot.controller;




import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.atguigu.springboot.controller.domain.JsonData;


@RestController
@RequestMapping("/api/v1/redis")
public class RdisTestController {

    
    @Autowired
    private StringRedisTemplate redisTpl; //jdbcTemplate

    @GetMapping(value="add")
    public Object add(){
        
        //opsForValue : Returns the operations performed on simple values (or Strings in Redis terminology).
 
        redisTpl.opsForValue().set("name", "xdclass2018");
        
        return JsonData.buildSuccess();
        
    }
    
    @GetMapping(value="get")
    public Object get(){
        
        String value = redisTpl.opsForValue().get("name");        
        return JsonData.buildSuccess(value);
        
    }
    
    
    
    
    
    
}
controller

 

4、Redis工具类封装讲解和实战
简介:高效开发方式 Redis工具类封装讲解和实战
1、常用客户端 https://redisdesktop.com/download
2、封装redis工具类并操作

utils用于 对象 转str    str转对象

【SpringBoot】整合Redis实战【SpringBoot】整合Redis实战
package net.xdclass.base_project.utils;

import java.io.IOException;

import org.springframework.util.StringUtils;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtils {

    private static ObjectMapper objectMapper = new ObjectMapper();
    
    //对象转字符串
    public static <T> String obj2String(T obj){
        if (obj == null){
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    //字符串转对象
    public static <T> T string2Obj(String str,Class<T> clazz){
        if (StringUtils.isEmpty(str) || clazz == null){
            return null;
        }
        try {
            return clazz.equals(String.class)? (T) str :objectMapper.readValue(str,clazz);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
utils
【SpringBoot】整合Redis实战【SpringBoot】整合Redis实战
package net.xdclass.base_project.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 功能描述:redis工具类
 *
 * <p> 创建时间:Apr 29, 2018 10:07:30 PM </p> 
 *
 *@作者 小D课堂  小D
 */
@Component
public class RedisClient {

    
    
    @Autowired
    private StringRedisTemplate redisTpl; //jdbcTemplate

    
    
    /**
     * 功能描述:设置key-value到redis中
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key ,String value){
        try{
            redisTpl.opsForValue().set(key, value);
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        
    }
    
    
    /**
     * 功能描述:通过key获取缓存里面的值
     * @param key
     * @return
     */
    public String get(String key){
        return redisTpl.opsForValue().get(key);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//    
//    
//     /** 
//     * 通过字符串key获取值 
//     * @param key 键 
//     * @return 值 
//     */  
//    public String get(String key){  
//        return key==null?null:redisTemplate.opsForValue().get(key);  
//    } 
//    
//    
//    /** 
//     * 普通缓存放入 
//     * @param key 键 
//     * @param value 值 
//     * @return true成功 false失败 
//     */  
//    public boolean set(String key,String value) {  
//         try {  
//            redisTemplate.opsForValue().set(key, value);  
//            return true;  
//        } catch (Exception e) {  
//            e.printStackTrace();  
//            return false;  
//        }  
//          
//    }  
//    
    
    
    
    
    
    
    
    
//    
//    /**
//     * 功能描述:设置某个key过期时间
//     * @param key
//     * @param time
//     * @return
//     */
//      public boolean expire(String key,long time){  
//            try {  
//                if(time>0){  
//                    redisTemplate.expire(key, time, TimeUnit.SECONDS);  
//                }  
//                return true;  
//            } catch (Exception e) {  
//                e.printStackTrace();  
//                return false;  
//            }  
//        }  
//
//          
//      
//      
//      /**
//       * 功能描述:根据key 获取过期时间 
//       * @param key
//       * @return
//       */
//      public long getExpire(String key){  
//            return redisTemplate.getExpire(key,TimeUnit.SECONDS);  
//        }  
//      
//      
//          /** 
//         * 递增 
//         * @param key 键 
//         * @return 
//         */  
//        public long incr(String key, long delta){    
//            return redisTemplate.opsForValue().increment(key, delta);  
//        }  
//        
//        
//        /** 
//         * 递减 
//         * @param key 键 
//         * @param delta 要减少几
//         * @return 
//         */  
//        public long decr(String key, long delta){    
//            return redisTemplate.opsForValue().increment(key, -delta);    
//        }    
//        
//        //==============Map结构=====================
//        
//        
//        //==============List结构=====================
//        
//        
//        
        
}
client
【SpringBoot】整合Redis实战【SpringBoot】整合Redis实战
package net.xdclass.base_project.controller;

import java.util.Date;

import net.xdclass.base_project.domain.JsonData;
import net.xdclass.base_project.domain.User;
import net.xdclass.base_project.utils.JsonUtils;
import net.xdclass.base_project.utils.RedisClient;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/api/v1/redis")
public class RdisTestController {

    
    @Autowired
    private StringRedisTemplate redisTpl; //jdbcTemplate

    @Autowired
    private RedisClient redis;
    
    @GetMapping(value="add")
    public Object add(){
         
        //redisTpl.opsForValue().set("name", "xdclass2018");
        redis.set("username", "xddddddd");
        return JsonData.buildSuccess();
        
    }
    
    @GetMapping(value="get")
    public Object get(){
        
        //String value = redisTpl.opsForValue().get("name");
        String value = redis.get("username");
        return JsonData.buildSuccess(value);
        
    }
    

    @GetMapping(value="save_user")
    public Object saveUser(){
        User user = new User(1, "abc", "11", new Date());
        String userStr = JsonUtils.obj2String(user);
        boolean flag = redis.set("base:user:11", userStr);
        return JsonData.buildSuccess(flag);
        
    }
    
    @GetMapping(value="find_user")
    public Object findUser(){

        String userStr = redis.get("base:user:11");
        User user = JsonUtils.string2Obj(userStr, User.class);
        
        return JsonData.buildSuccess(user);
        
    }
    
    
}
controller

【SpringBoot】整合Redis实战

【SpringBoot】整合Redis实战

 

 

 test单元测试

【SpringBoot】整合Redis实战【SpringBoot】整合Redis实战
package base_project.base;

import net.xdclass.base_project.XdclassApplication;
import net.xdclass.base_project.domain.User;
import net.xdclass.base_project.utils.JsonUtils;
import net.xdclass.base_project.utils.RedisClient;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
@SpringBootTest(classes={XdclassApplication.class})//启动整个springboot工程
public class JsonTest {
    
    
    @Autowired
    private StringRedisTemplate strTpl;
    
    @Autowired
    private RedisClient redis;
    
    @Test
    public void testOne(){
        User u = new User();
        u.setAge(1);
        u.setPhone("22222");
        u.setPwd("0000");    
        
        String str = JsonUtils.obj2String(u);
        strTpl.opsForValue().set("str", str);
        System.out.println(str);
        
    }

}
test