• 使用springBoot+Redis实现分布式缓存


    使用springBoot+Redis实现分布式缓存

    1. 添加redis框架 依赖

    image-20231102215956817

    2. 配置redis连接信息

    #redis 连接的配置信息
    spring.redis.database=15
    spring.redis.port=6379
    spring.redis.host=82.157.236.116
    # 可省略
    spring.redis.lettuce.pool.min-idle=5
    spring.redis.lettuce.pool.max-idle=10
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-wait=1ms
    spring.redis.lettuce.shutdown-timeout=100ms
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3. 操作redis

    3.1 代码式操作redis

    @RestController
    public class RedisController {
        //引入redis模版
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @RequestMapping("/set")
        public String setRedis(){
            //redis写缓存的操作
            stringRedisTemplate.opsForValue().set("username","zhangsan");
            return "redis存储成功";
        }
        @RequestMapping("/get")
        public String getRedis(){
            String result = stringRedisTemplate.opsForValue().get("username");
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.2使用注解操作redis

    • @Cacheable: 查询/添加;判断 redis 是否有缓存,如果没有那么就把当前方法返回值存到 redis; 如果存在缓存直接返回。
    • @CachePut: 修改; 将方法返回值更新到 redis 缓存中。
    • @CacheEvict:删除;将 redis 中对应的缓存删除。

    在启动类中添加注解

    @EnableCaching // 开启全局注解缓存

    @RestController
    public class RedisAnnController {
        //存入或读取缓存
        @RequestMapping("/ann-get")
        @Cacheable(value = "spring.cache", key = "#name+'-'+#pnumber")
        public String get(String name, String pnumber) {
            if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
                return null;
            }
            System.out.println("执行了 get 方法");
            return "name=" + name + "|pnumber=" + pnumber;
        }
        //更新缓存
        @RequestMapping("/put")
        @CachePut(value = "spring.cache", key = "#name+'-'+#pnumber")
        public String put(String name ,String pnumber){
            if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
                return null;
            }
            System.out.println("执行了 put 方法");
            return "[name=" + name + "<->pnumber=" + pnumber + "]";
        }
        //redis 缓存删除
        @RequestMapping("/del")
        @CacheEvict(value = "spring.cache",key = "#name + '-' + #pnumber")
        public void del(String name ,String pnumber){
            System.out.println("执行了删除缓存");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4. 使用Redis存储Session

    4.1 添加依赖

    image-20231105194948808

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.sessiongroupId>
        <artifactId>spring-session-data-redisartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.2 配置 redis 连接和 session 的相关信息

    spring:
      redis:
        host: 82.157.236.116
        port: 6379
        database: 15
        password: "XXXXXXXXXXXXX"
    
      session:
        store-type: redis
        redis:
          flush-mode: on_save
          namespace: spring:session
      servlet:
        session:
          timeout: 1800
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    经过上述操作有关session的信息都存储到了redis中的15号数据库,spring:session包中

    4.3 redis存储对象

    使用Spring Data Redis时,尝试将一个非序列化存储在redis中会产生错误。这个错误是由于在使用Spring Data Redis时,尝试将一个非序列化的对象(Userinfo类型)存储到Redis中导致的。要解决这个问题,你需要确保Userinfo类实现了Serializable接口。

    在Userinfo类上添加@Serializable注解:

    import java.io.Serializable;
    
    public class Userinfo implements Serializable {
        // ... 其他代码 ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    JSTL使用
    Linux - make与makefile
    关于Pickle反序列化的研究总结和一道例题
    分布式ID性能评测:CosId VS 美团 Leaf
    C++ 前置声明错误使用导致的内存泄漏及正确使用方式
    java发送http请求(jquery发送http请求,前后端看这一篇文章够了,很完整)
    前端周刊第二十一期
    国开现代汉语专题,形考答案形考任务
    基于RPC接口的业务侧流量回放
    超详细的顺序表(附源码)
  • 原文地址:https://blog.csdn.net/weixin_66409969/article/details/134234639