【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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值