redis

  • 开启redis进程  redis-server redis.windows.conf
  • 端口号6379
  • 连接客户端
  1. redis-cli 增加参数 --raw ,可以强制输出中文,不然会乱码
  2. Flushall:清空全部的库
  3. Flushdb:清空当前库
  • redis几种数据类型
  1. List
    @GetMapping("/list")
    public List<String> listTest(){
    ListOperations<String,String> listOperations = redisTemplate.opsForList();
    listOperations.leftPush("list","hello");
    listOperations.leftPush("list","world");
    listOperations.leftPush("list","java");
    List<String> list = listOperations.range("list",0,2);
    return list;
    }
  2. set
        @GetMapping("/set")
        public Set<String> setTest(){
            SetOperations<String,String> setOperations = redisTemplate.opsForSet();
            setOperations.add("set","hello");
            setOperations.add("set","hello");
            setOperations.add("set","word");
            setOperations.add("set","word");
            Set<String> set = setOperations.members("set");
            return set;
        }
  3. hash
    @GetMapping("hash")
        public void hashTest(){
            HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();
            hashOperations.put("key","hashkey","hello");
            System.out.println(hashOperations.get("key","hashkey"));
        }
        }
  4. String
    redisTemplate.opsForValue().get("")
  5. zset
    //zset 有序集合 
    @GetMapping("/zset")
    public Set<String> zserTest(){
        ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
        zSetOperations.add("zset","hello",1);
        zSetOperations.add("zset","world",2);
        zSetOperations.add("zset","java",3);
        Set<String> zset =zSetOperations.range("zset",0,2);
        return zset;
    }

     

  • redis对字符串的常用命令
  1. set 设置   get 获取  del  删除
  2. mset   mget设置获取多个key/val
  3. incr  incrby  decr   decrby    加/减
  4. setnx   msetnx   设置新的key/val   key必须是原来不存在的
  5. setex  对一个key设置有效时间 和val
  6. append   在一个key的val上追加一个值,如果这个key不存在就是执行set
  7. 默认16个库
  • redis对列表的操作
  1. 将一个或多个值插入到列表头部:lpush list
  2. 将一个或多个值插入到列表尾部:rpush list
  3. 返回列表中指定区间内的元素,lrange  
    1. lrange list 0 -1 返回列表数据中的所有结果;
    2. lrange list 2 3 返回下标2到3,包括2,3;
  4. 移除并返回列表的第一个元素:lpop list (当列表key不存在时,返回nil);
  5. 移除列表的最后一个元素,返回值为移除的元素 :rpop list;
  6. 安装索引下标获得元素:lindex(-1代表最后一个,0代表第一个);  lindex list 0;
  7. 返回列表的长度:llen list;
  8. 移除列表中与参数value相同的元素,并且可以指定删除的个数 :  lrem list 1 zhangsan
  9. 对列表进行修剪,让列表保留指定区间内的元素,不在指定区间的元素被删除:ltrim list 1 2 (list区间1到2的保留);
  10. 移除列表的最后一个元素,并将该元素添加到另一个列表并返回;rpoplpush list newlist;
  11. 将列表key下标为index的元素的值设置为value, lset list 1 zhangsan;
  12.  在列表的元素前或后插入元素 :linsert  list before zhangsan lisi  在shangsan前面插入lisi;
  • 事务
  1. 开启事务 MULTI,提交事务exec;
  2. 不保证原子性,redis是乐观锁,没有隔离级别概念;
  3. 使用watch检测balance,事务期间balance数据变动,事务执行失败;
  • 持久化
  1. RDB:save 命令或bgsave;自动持久化
    1. 优势:速度快,适合大规模的数据恢复,对数据完整性和一致性要求不高更适合使用,节省磁盘空间;
    2. 缺点:在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改;
  2. AOF:将命令存到文件中,出现意外时会重新执行该文件;
  • 注解
  1. @EnableCaching      //开启cache(本质是AOP开启增强函数),一般在main函数所在主配置加入;
  2. @CacheConfig      //提取注解公共属性;
    1. 例如:@CacheConfig(cacheNames=“techntxt”)
  3. @Cacheable        //查询结果(必须是一个序列化类)按键值放入Cache中
    1. 例如:@Cacheable(cacheNames= "techntxt",key= "#root.methodName+'" +."('+#p page now+#p page size+#p ClssId" +"+#p Key string+#p Passed+#p UserId+')";
    2. @Cacheable( cacheNames={"emp"},key = "#root .methodName+'_'+#id");
  4. @CachePut         //提交数据按key值存入缓存,不会判断,直接存入
  5. @CacheEvict      //清空缓存
  • 发布订阅
  1. SUBSCRIBE easychanel订阅;
  2. PUBLISH easychanel hello发布消息;
  3. 订阅了就可以收到发布的消息;
  • 主从复制
  1. 主库和从库,读写分离,降低服务器的压力,从库读,主库写;

  2. 从库只能读不能去写;
  3. 定义从库在redis文件夹中redis.windows.conf文件中加slaveof 127.0.0.1 6379 连接主库;
  • 哨兵模式
  1. 主服务器宕机会重新选一个从机当作主服务器;
  • redis做一级缓存(如果对象不会被修改,并且访问量很高就可以用redis做一级缓存)
  1. 在pom文件导入依赖;
      <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>5.0.1</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>2.6.6</version>
            </dependency>
  2. 在yml文件中连接redis;
    spring:
      redis:
        host: 127.0.0.1
        port: 6379
  3. 创建实体类,实现序列化接口,否则无法存入Redis数据库;
  4. ## 在service实现类中加@Cacheable(cacheNames="user",key="#p0)注解;cacheNames代表要存储的key值
    1. @Cacheable的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存;
    2. value :缓存多的名称,在spring配置文件中定义,必须指定至少一个;
  5. 在启动类中加@EnableCaching注解;
  6. 在service层; 
    @Resource
    private RedisTemplate redisTemplate;
    @Override  //查
    public Applicant querySingle(int id){
    Applicant applicant = (Applicant) redisTemplate.opsForValue().get("applicant_"+id);
    if(applicant!=null){
    return applicant;
    }else {
    Applicant applicant1 = applicantMapper.selectById(id);
    redisTemplate.opsForValue().set("applicant_"+id,applicant1);
    return applicant1;
    }
    }
    @Override   //增
    public void addApplicant(Applicant applicant) {
    redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);
        applicantMapper.save(applicant);
    }
    @Override   //改
    public void updateApplicants( Applicant applicant) {
    redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);
    applicantMapper.updateById(applicant);
    }
    @Override  //删除
    public void deleteApplicant(Integer id) {
    redisTemplate.delete("applicant_"+id);
    applicantMapper.deleteById(id);
    }
  7. 也可以用redisTemplate做定时任务
    /**
    * 获取指定key的剩余时间
    */
    @GetMapping("getOrderTime")
    public CommonResult<Long> getOrderTime(String orderId){
    Long expire = redisTemplate.getExpire(orderId);
    return CommonResult.success(expire);
    }

    /**
    * 订单定时
    */
    @GetMapping("addOrder")
    public CommonResult addOrder(){
    redisTemplate.opsForValue().set("orderid123","添加的订单", Duration.ofMinutes(30L));
    return CommonResult.success();
    }

     

  • cache方法
  1. yml文件中往redis中缓存
      redis:
        host: 127.0.0.1
        port: 6379
        database: 0
      cache:
        type: redis
  2. pom文件中添加
      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>2.6.6</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>

     

  3. 在启动类添加   @EnableCaching
  4. value"在service的方法上加@Cacheable注解,
    @Cacheable(value = "applicant",key = "'getApplicantList'")
    @Override
    public List<Applicant> getApplicantList() {
    System.out.println("getApplicantList方法被调用");
    return applicantMapper.selectList(null);
    }
  5. 当数据发生增、删、改变化时,就把缓存区的数据删掉,然后重新执行方法获取新的缓存;
    @CacheEvict(value = "applicant",allEntries = true)
        @Override
        public void updateApplicants( Applicant applicant) {
            redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);
            applicantMapper.updateById(applicant);
        }
    
        @CacheEvict(value = "applicant",allEntries = true)
        @Override
        public void addApplicant(Applicant applicant) {
            redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);
            applicantMapper.save(applicant);
        }
    // 删除时,删除单个id,删除的东西即在getApplicantlist又在querySingle+#id中,所以直接删除前面的value
        @CacheEvict(value = "applicant",allEntries = true)
    @Override
    public void deleteApplicant(Integer id) {
       //redisTemplate.delete(
    "applicant_"+id);
    applicantMapper.deleteById(id);
    }

     

  6. 对于单个id查询,在service层方法上加
     @Cacheable(value = "applicant",key="'querySingle'+#id")
  7. 对于多参数的用","拼接;

     

  • redisTemplate自定义
  1. redisTemplate默认jdk序列化,想要自定义序列化方式,就要自定义redisTemplate
posted @ 2023-12-15 16:25  卡皮巴拉  阅读(4)  评论(0编辑  收藏  举报