spring-boot-route(十二)整合redis作为缓存

redis简介

redis做为一种非关系型数据库,读写很是快,应用十分普遍,它采用key-value的形式存储数据,value经常使用的五大数据类型有string(字符串),list(链表),set(集合),zset(有序集合)和hash(哈希表)。java

redis的特性决定了它的功能,它能够用来作如下这些事情!git

  1. 排行榜,利用zset能够方便的实现排序功能
  2. 计数器,利用redis中原子性的自增操做,能够统计到阅读量,点赞量等功能
  3. 简单消息队列,list存储结构,知足先进先出的原则,可使用lpush/rpop或rpush/lpop实现简单消息队列
  4. session共享,分布式系统中,能够利用redis实现session共享。spring官方提供的分布式解决方案Spring Session就是利用redis 实现的。

Spring Boot对redis也实现自动化装配,使用很是方便。github

Spring Boot整合redis

1. 引入redis依赖

<dependencies>
    <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>
</dependencies>

2. 配置redis相关信息

spring:
  redis:
    # redis库
    database: 0
    # redis 服务器地址
    host: localhost
    # redis 端口号
    port: 6379
    # redis 密码
    password:
    # 链接超时时间(毫秒)
    timeout: 1000
    lettuce:
      pool:
        # 链接池最大连接数(负数表示没有限制)
        max-active: 8
        # 链接池最大阻塞等待时间(负数表示没有限制)
        max-wait: -1
        # 链接池最大空闲链接数
        max-idle: 8
        # 链接池最小空闲链接数
        min-idle: 0

3. 操做redis

SpringBoot提供了两个bean来操做redis,分别是RedisTemplateStringRedisTemplate,这二者的主要区别以下。redis

RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组而后在存入Redis数据库。spring

StringRedisTemplate使用的是StringRedisSerializer。数据库

下面一块儿来看看效果:apache

@RestController
public class RedisDemo {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("redisTmeplateData")
    public void redisTemplateData(){

        redisTemplate.opsForValue().set("name","Java旅途");
    }

    @GetMapping("stringRedisTemplateData")
    public void stringRedisTemplateData(){

        stringRedisTemplate.opsForValue().set("desc","坚持分享java技术栈");
    }
}

第一个方法存入的数据以下图数组

第二个方法存入的数据以下图缓存

因为RedisTemplate是序列化成字节数组存储的,所以在redis客户端的可读性并很差。服务器

自动缓存

@Cacheable能够标记在一个方法上,也能够标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类全部的方法都是支持缓存的。

若是添加了@Cacheable注解,那么方法被调用后,值会被存入redis,下次再调用的时候会直接从redis中取值返回。

@GetMapping("getStudent")
@Cacheable(value = "student:key")
public Student getStudent(){
    log.info("我不是缓存,我是new的对象!");
    Student student = new Student("Java旅途",26);
    return student;
}

记得要开启缓存,在启动类加上@EnableCaching注解

访问上面的方法,若是不打印日志,则是从缓存中获取的值。

封装redisUtils

RedisTemplate提供了不少方法来操做redis,可是找起来比较费事,为了更好的操做redis,通常会封装redisUtils来知足业务开发。这里简单封装几个作个示例,若是开发中有需求能够本身封装。

public class RedisUtils {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 普通存入
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key,Object value){
        try {
            redisTemplate.opsForValue().set(key,value);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 普通获取key
     * @param key
     * @return
     */
    public Object get(String key){
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 存入key,设置过时时长
     * @param key
     * @param value
     * @param time
     * @return
     */
    public boolean set(String key,Object value,long time){
        try {
            if(time > 0){
                redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);
            }else{
                redisTemplate.opsForValue().set(key,value);
            }
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 判断key是否存在
     * @param key
     * @return
     */
    public boolean exists(String key){
        try {
            return redisTemplate.hasKey(key);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除key
     * @param key
     */
    public void del(String key){
        try {
            if(key != null && key.length() > 0){
                redisTemplate.delete(key);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

本文示例代码已上传至github,点个star支持一下!

Spring Boot系列教程目录

spring-boot-route(一)Controller接收参数的几种方式

spring-boot-route(二)读取配置文件的几种方式

spring-boot-route(三)实现多文件上传

spring-boot-route(四)全局异常处理

spring-boot-route(五)整合Swagger生成接口文档

spring-boot-route(六)整合JApiDocs生成接口文档

spring-boot-route(七)整合jdbcTemplate操做数据库

spring-boot-route(八)整合mybatis操做数据库

spring-boot-route(九)整合JPA操做数据库

spring-boot-route(十)多数据源切换

spring-boot-route(十一)数据库配置信息加密

spring-boot-route(十二)整合redis作为缓存

spring-boot-route(十三)整合RabbitMQ

spring-boot-route(十四)整合Kafka

spring-boot-route(十五)整合RocketMQ

spring-boot-route(十六)使用logback生产日志文件

spring-boot-route(十七)使用aop记录操做日志

spring-boot-route(十八)spring-boot-adtuator监控应用

spring-boot-route(十九)spring-boot-admin监控服务

spring-boot-route(二十)Spring Task实现简单定时任务

spring-boot-route(二十一)quartz实现动态定时任务

spring-boot-route(二十二)实现邮件发送功能

spring-boot-route(二十三)开发微信公众号

这个系列的文章都是工做中频繁用到的知识,学完这个系列,应付平常开发绰绰有余。若是还想了解其余内容,扫面下方二维码告诉我,我会进一步完善这个系列的文章!

相关文章
相关标签/搜索