Redis

1、应用场景

  • 缓存
  • 任务队列
  • 消息队列
  • 分布式锁

redis服务默认端口号:6379

2、数据类型

  • 字符串String
  • 哈希 hash 【key-value】
  • 列表list 【插入顺序排序,数据可重复】
  • 集合 set 【无序集合,无重复】
  • 有序集合sorted set 【有序集合,无重复】

3、Java中操作Redis

  • Jedis
添加依赖
<dependency>
		jedis
</dependency>


//1.获取连接
Jedis jedis  =new Jedis(host,port)

// 2.执行操作
jedis.set("key","value");
jedis.get(key)
// 3.关闭连接
jedis.close()
  • Spring Data Redis
maven坐标:
spring-boot-starter-data-redis


Spring Data Redis提供了一个高度封装的类:RedisTmeplate

redisTemplate.opsForValue().set(key, value);
// key和value存储到redis中时,会使用到相应的序列化器
  • redisTemplate.opsForValue().setIfAbsent():若key不存在,则设置key-value,返回boolean值

4、redis缓存优化

// 1.spring-redis相关配置

spring.redis.host=128.1.120.239
spring.redis.port=6379
spring.redis.password=redispassword
spring.redis.database=77号数据库)
spring.redis.timeout=60000

//2.配置类RedisConfig
// RedisTemplate 序列化器
    @Bean(name = "redisTemplate")
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //序列化
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }


4.1缓存短信验证码

1、在服务端Controller中注入RedisTemplate对象,操作redis
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
2、将验证码缓存至redis中,并设置有效期
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);

3、从redis中获取缓存的验证码
redisTemplate.opsForValue().get(key)

4.2缓存菜品数据

  1. 改造list方法,先从Redis中获取菜品数据,如果有则直接返回,若没有则查询数据库,并将查询到的菜品数据放入Redis
  2. 改造update和save方法,加入清理缓存策略(保证数据库中的数据和缓存的数据一致)
根据categoryId获取菜品列表
// 动态构造key
String key = "dish_"+dish.getCategoryId+"_"+dish.getStatus;

// 先从redis中获取缓存数据
dishDtoList = redisTemplate.opsForValue().get(key);

if(dishDtoList !=null){
// 如果存在,则直接返回
return R.success(list);
}
// 若不存在,则执行查询
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
// 查询数据保存在redis中
redisTemplate.opsForValue().set(key, dishDtoList , time, TimeUnit.SECONDS);




 改造update和save方法
 // 清理所有菜品得缓存数据
 Set keys = redisTemplate.keys(“dish_*")
 redisTemplate.delete(keys)
// 清理某个分类的菜品数据
String key = "dish_"+dishDto.getCategoryId+"_"+dishDto.getStatus;

5、spring cache+redis 注解缓存

5.1 导入maven坐标

1】springframework.data.redis.cache
2】spring-boot-starter-cache

  • 5.2 缓存注解
  • @EnableCaching:开启基于注解的缓存 在springboot 启动类上开启缓存注解
  • @CacheConfig 类级别的注解,允许共享缓存的名称
  • @Cacheable 方法或类,作用:本方法执行后,先去缓存看有无数据,如果没有,从数据库中查询,给缓存中存一份,返回结果


 @Cacheable(value="cacheName", key="#id")
      public ResultDTO method(int id);

 @Cacheable(value = "service", key = "#service.serviceId.toString()", unless = "#result == null")

  • @CachePut 类似于更新操作,不管缓存中有无结果,都从数据库查找,并将结果更新到缓存,并返回结果

  • @CacheEvict用来清除用在本方法或者类上的缓存数据

你可能感兴趣的:(redis,数据库,缓存)