Redis
简介
Redis是一个基于内存的key-value结构数据库
- 基于内存存储,读写性能高
 - 适合存储热点数据(热点商品、资讯、新闻)
 - 企业应用广泛
 
基础操作
启动

在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl+c停止
连接
保证服务端启动时,在cmd命令行中输入redis-cli.exe -h 用户名 -p 端口号 -a 密码

数据类型


常用命令
字符串操作命令
- SET key value 设置指定key的值
 - GET key 获取指定key的值
 - SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
 - SETNX key value 只有key不存在时设置key的值(key已存在则无法设置)
 
哈希操作命令(Hash Map)
Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象,常用命令:
(这些命令中的key是哈希表名,field是字段名,value是值)
- HSET key field value 将哈希表key中的字段field的值设为value
 - HGET key field value 获取存储在哈希表中的指定字段
 - HDEL key field 删除存储在哈希表中的指定字段
 - HKEYS key 获取哈希表中所有字段
 - HVALS key 获取哈希表中所有值
 
列表操作命令(Linked List)
Redis列表是简单的String列表,按照插入顺序排序,常用命令:
- LPUSH key value1 [value2] 将一个或多个值插入到列表头部
 - LRANGE key start stop 获取列表指定范围内的元素
 - RPOP key 移除并获取列表最后一个元素
 - LLEN key 获取列表长度
 
集合操作命令(Set)
Reids set 是String类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令:
- SADD key member1 [member2] 向集合添加一个或多个成员
 - SMEMBERS key 返回集合中的所有成员
 - SCARD key 获取集合的成员数
 - SINTER key1 [key2] 返回给定所有集合的交集
 - SUNION key1 [key2] 返回所有给定集合的并集
 - SREM key member1 [member2] 删除集合中一个或多个成员
 
有序集合操作命令
Redis有序集合是String类型元素的集合,且不允许有重复成员(集合中的元素是string类型,每个元素有一个double类型的分数,会自动根据分数进行排序)。每个元素都会关联一个double类型的分数,常用命令:member 是元素,score 是分数
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
 - ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
 - ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
 - ZREM key member [member…] 移除有序集合中的一个或多个成员
 
通用命令
Reids的通用命令是不分数据类型的,都可以使用的命令:
- KEYS pattern 查找所有符合给定模式(pattern)的key
 - EXISTS key 检查给定key是否存在
 - TYPE key 返回key所储存的数据类型
 - DEL key 该命令用于在key存在时删除key
 
Java操作Redis
在Java项目中。可以使用Spring Data Redis来简化操作
步骤:
1.导入Spring Data Redis的maven坐标
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> 
2、配置Redis数据源
spring:
   redis:
      host: ${sky.redis.host}
      port: ${sky.redis.port}
      auth: ${sky.redis.auth}
      database: ${sky.redis.database} 
sky:
  redis:
    host: localhost
    port: 6379
    auth: 325523 #密码
    database: 0 #指定使用0号数据源 
3、编写配置类,创建RedisTemplate对象
package com.sky.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建Reids模版对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置reids的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}
 
4、通过ReidsTemplate对象操作Redis
package com.sky.test;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testRedisATemplate(){
        System.out.println(redisTemplate);
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
    /**
     * 操作字符串数据类型
     */
    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city","北京");
        String city = (String) redisTemplate.opsForValue().get("city");
        System.out.println(city);
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);//设置3分钟后过期
        redisTemplate.opsForValue().setIfAbsent("lock","1");//如果不存在才能设置
        redisTemplate.opsForValue().setIfAbsent("lock","2");
    }
    @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("100","name","tom");//向哈希中插入键值对
        hashOperations.put("100","age","20");
        String name = (String)hashOperations.get("100", "name");//根据键获取值
        System.out.println(name);
        Set keys = hashOperations.keys("100");//返回哈希中的所有键
        System.out.println(keys);
        List values = hashOperations.values("100");//返回哈希中的所有值
        System.out.println(values);
        hashOperations.delete("100","age");//根据键删除键值对
    }
}
 
Spring Cache
简介
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:
- EHCache
 - Caffeine
 - Redis
 
在pom.xml中配置相关坐标即可使用Spring Cache框架
常用注解
| @EnableCaching | 开启注解缓存功能,通常加在启动类上 | 
| @Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则世界返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 | 
| @CachePut | 将方法的返回值放到缓存中 | 
| @CacheEvict | 将一条或多条数据从缓存中删除 | 
这些注解本质是通过代理对象执行的
项目应用
思路
- 导入Spring Cache 和Redis的相关maven坐标
 - 在启动类上加入@EnableCaching注解,开启缓存注解功能
 - 在用户端接口SetmealController的list方法上加入@Cacheable注解
 - 在管理端接口SetmealController的save、delete、update等方法上加入@CacheEvict注解
 
新增操作需要精确清理缓存(新增哪个就清理哪个)
删、改操作需要清空全部缓存
查询操作先在缓存中查,缓存中没有再去数据库中查,并把查询结果放入缓存中
代码实现
用户端接口SetmealController
/**
     * 条件查询
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询套餐")
    @Cacheable(cacheNames = "setmealCache",key ="#categoryId")//key:setmealCache::categoryId
    public Result<List<Setmeal>> list(Long categoryId) {
        Setmeal setmeal = new Setmeal();
        setmeal.setCategoryId(categoryId);
        setmeal.setStatus(StatusConstant.ENABLE);
        List<Setmeal> list = setMealService.list(setmeal);
        return Result.success(list);
    } 
管理端接口SetmealController
/**
    * 新增套餐
    * @param setmealDTO
    * @return
    */
   @PostMapping
   @ApiOperation("新增套餐")
   @CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")
   public Result save(@RequestBody SetmealDTO setmealDTO){
      log.info("新增套餐:{}",setmealDTO);
      setMealService.saveWithDish(setmealDTO);
      return Result.success();
   }
 /**
    * 批量删除套餐
    * @param ids
    * @return
    */
   @DeleteMapping
   @ApiOperation("批量删除套餐")
   @CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存
   public Result delete (@RequestParam List<Long> ids){
      log.info("批量删除套餐:{}",ids);
      setMealService.delete(ids);
      return Result.success();
   }
/**
    * 修改套餐
    * @param setmealDTO
    * @return
    */
   @PutMapping
   @ApiOperation("修改套餐")
   @CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存
   public Result update(@RequestBody SetmealDTO setmealDTO){
      setMealService.update(setmealDTO);
      return Result.success();
   }
 /**
    * 起售停售菜品
    * @param status
    * @param id
    * @return
    */
   @PostMapping("/status/{status}")
   @ApiOperation("起售停售菜品")
   @CacheEvict(cacheNames = "setmealCache",allEntries = true)//清空所有缓存
   public Result updateStatus(@PathVariable Integer status,Long id){
      setMealService.updateStatus(status,id);
      return Result.success();
   } 
                









![[论文笔记]MRRNET](https://i-blog.csdnimg.cn/direct/a29e56138dac492c80bdf34db25c3cb8.png)







