• 【SpirngBoot组件(4)】Redis集成


    个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道

    如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充

    前言

    通常数据存储在两个位置:数据库&缓存.

    然而对于使用频率较高的数据,频繁请求数据库的代价过于昂贵,而自带的缓存机制又过于简陋,这时候第三方服务redis就出现了。

    redis完美解决了这些问题,能够快速的进行数据存取,可以将高频率的数据存于redis,不用再去麻烦数据库了,同时还完美契合了消息队列的实现方案。

    因而在大小项目中redis都成为了一个必要的组件。

    1.介绍

    • redis是最常用的缓存数据库,常用于存储用户登录token、临时数据、定时相关数据等。
    • redis使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
    • redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题
    • redis基于内存,速度非常快,据测试,redis读的速度是110000次/s,写的速度是81000次/s
    • redis也可用于消息队列或任何短期数据

    2.集成

    1. 安装redis服务

      官网https://redis.io/

      • windows环境:

        1. 从官网直接下载redis后
        2. 运行redis-server启动服务

        请注意不要关闭窗口,否则将redis关闭服务

      • Linux环境:

        1. 通过工具上传或者直接下载redis压缩包到服务器,请到官网获取下载地址

        2. 解压tar xzvf redis-4.0.8.tar.gz

        3. 进入目录后,编译make

        4. 安装make install PREFIX=/usr/local/redis,路径请视情况更改

          若安装失败,请先安装gcc,命令为yum -y install gcc automake autoconf libtool make

        5. 启动服务./redis-server

      上述仅给出了前端部署方法,自定义配置和后台部署请自行查阅相关资料,懒得话就直接找传送门好啦~

    2. 添加依赖:

              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-redis</artifactId>
                  <version>2.3.2.RELEASE</version>
              </dependency>
      
    3. 添加默认配置

    4. 创建配置文件:示例如下,自定义配置暂不做赘述,有兴趣的可以找传送门

      @Configuration
      @EnableCaching
      public class RedisConfig extends CachingConfigurerSupport {
          @Bean
          public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
              RedisCacheConfiguration configuration = RedisCacheConfiguration
                      .defaultCacheConfig()
                      .entryTtl(Duration.ofMinutes(30))
                      .disableCachingNullValues();
      
              return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(configuration).build();
          }
      
          @Bean
          public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
      
              RedisTemplate<Object, Object> template = new RedisTemplate<>();
              // 配置连接工厂
              template.setConnectionFactory(factory);
              
              //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
              Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
              ObjectMapper om = new ObjectMapper();
              // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
              om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
              // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
              om.activateDefaultTyping(
                      LaissezFaireSubTypeValidator.instance,
                      ObjectMapper.DefaultTyping.NON_FINAL,
                      JsonTypeInfo.As.WRAPPER_ARRAY);
              jacksonSeial.setObjectMapper(om);
      
              template.setKeySerializer(new StringRedisSerializer());
              template.setValueSerializer(jacksonSeial);
              template.setHashKeySerializer(new StringRedisSerializer());
              template.setHashValueSerializer(jacksonSeial);
              template.afterPropertiesSet();
              return template;
          }
      }
      

    3.使用

    1. 初始化redisTemplate

          private final RedisTemplate redisTemplate;
      
          public TestController(RedisTemplate redisTemplate) {
              this.redisTemplate = redisTemplate;
          }
      

      此处可以指定数据类型,如private final RedisTemplate<String, String> redisTemplate;,若不指定类型,则以json格式存取,通过其他格式存取会报错

    2. 存取,示例如下

          @ApiOperation("存储redis")
          @GetMapping("/saveRedis")
          @ResponseBody
          public ReturnMsg saveRedis(String key, String value) throws Exception {
              redisTemplate.opsForValue().set(key, value);
              return ReturnMsg.success();
          }
      
          @ApiOperation("读取redis")
          @GetMapping("/getRedis")
          @ResponseBody
          public ReturnMsg getRedis(String key) throws Exception {
              if (redisTemplate.opsForValue().getOperations().hasKey(key)) {
                  return ReturnMsg.success(redisTemplate.opsForValue().get(key));
              }
              return ReturnMsg.error();
          }
      

    4.相关操作

    • 存储:

      • redisTemplate.opsForValue().set(key, value)
      • redisTemplate.boundValueOps(key).set(value)
    • 取出:

      • redisTemplate.opsForValue().get(key)
      • (String) redisTemplate.boundValueOps(key).get()
    • 设定有效时间:

      • redisTemplate.expire(key, 2000, TimeUnit.SECONDS);设置key的缓存有效时间为2000秒
    • 其他:算了,懒得枚举了,给个示例算了。。。

      //向redis里存入数据和设置缓存时间  
      stringRedisTemplate.opsForValue().set("baike", "100", 60 * 10, TimeUnit.SECONDS);
      //val做-1操作  
      stringRedisTemplate.boundValueOps("baike").increment(-1);
      //根据key获取缓存中的val  
      stringRedisTemplate.opsForValue().get("baike")
      //val +1  
      stringRedisTemplate.boundValueOps("baike").increment(1);
      //根据key获取过期时间  
      stringRedisTemplate.getExpire("baike");
      //根据key获取过期时间并换算成指定单位  
      stringRedisTemplate.getExpire("baike",TimeUnit.SECONDS);
      //根据key删除缓存  
      stringRedisTemplate.delete("baike");
      //检查key是否存在,返回boolean值  
      stringRedisTemplate.hasKey("baike");
      //向指定key中存放set集合  
      stringRedisTemplate.opsForSet().add("baike", "1","2","3");
      //设置过期时间  
      stringRedisTemplate.expire("baike",1000 , TimeUnit.MILLISECONDS);
      //根据key查看集合中是否存在指定数据  
      stringRedisTemplate.opsForSet().isMember("baike", "1");
      //根据key获取set集合  
      stringRedisTemplate.opsForSet().members("baike");
      //验证有效时间
      Long expire = redisTemplate.boundHashOps("baike").getExpire();
      System.out.println("redis有效时间:"+expire+"S");
      

    5.传送门

    RedisTemplate配置的jackson.ObjectMapper

    Linux下redis的安装以及使用

    使用RedisTemplate操作Redis数据库

    如何使用RedisTemplate访问Redis数据结构

    BB两句

    虽然上述已经满足很多项目的需求,但实际上redis能做的事情远不止这些,慢慢学吧。

    如此小的一个组件,能完成那么多功能,其实挺神奇的。。。


    作者:Echo_Ye

    WX:Echo_YeZ

    email :echo_yezi@qq.com

    个人站点:在搭了在搭了。。。(右键 - 新建文件夹)

  • 相关阅读:
    Linux学习笔记总结--CentOS 设置静态IP
    LAMP环境部署总结
    expect批量分发公钥
    CentOS6.5一键安装MySQL5.5.32(源码编译)
    CentOS6.5 一键部署运行环境shell脚本
    CentOS 更新yum源
    centos 6.6编译安装nginx
    安装Oracle数据库和PLSQL连接数据库
    ABAP 取字段的简短描述
    ABAP OLE常用方法和属性
  • 原文地址:https://www.cnblogs.com/silent-bug/p/13563241.html
Copyright © 2020-2023  润新知