Redis核心数据结构之String(一)

一、特性说明

(一)String 是 Redis 最基本的类型,一个key对应一个value;

(二)String类型是二进制安全的。意思是 redis 的String可以包含任何数据。比如jpg图片或者序列化对象;

(三)String类型是Redis最基本的数据类型,一个键最大能存储512MB;

二进制安全是指,如果在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译,如果被攻击,能够及时检测出来;

二进制安全特点:
    编码、解码发生在客户端,执行效率高;
    不需要频繁的编解码,不会出现乱码;
复制代码

二、常用命令

(一)SET

命令格式: SET key value

功能:存入字符串键值

demo说明: image.png

(二)GET

命令格式: get key

功能:获取一个字符串键值

demo说明: image.png

(三)MSET

命令格式: MSET key value [key value ]

功能:批量存储字符串键值

demo说明: image.png

(四)MGET

命令格式: mget key value [key value ]

功能:批量获取字符串键值

demo说明: image.png

(五)SETNX

命令格式: setnx key value

功能:存入一个不存在的字符串键值

demo说明:存入一个键为test444,第一次成功,第二次已存在则返回失败 image.png

(六)DEL

命令格式: setnx key value

功能:存入一个不存在的字符串键值

demo说明: image.png

(七)EXPIRE

命令格式: setnx key value

功能:存入一个不存在的字符串键值

demo说明: image.png

(八)INCR

命令格式: incr key

功能:将key中的存储值加一,首次不存在则会创建一个值为0的key

demo说明: image.png

(九)DECR

命令格式: decr key

功能:将key中的存储值减一,首次不存在则会创建一个值为0的key

demo说明: image.png

(十)INCRBY

命令格式: incrby key increment

功能:将key中的存储值加上increment,首次不存在则会创建一个值为0的key

demo说明: image.png

(十一)DECRBY

命令格式: incrby key increment

功能:将key中的存储值减去increment,首次不存在则会创建一个值为0的key

demo说明: image.png

三、应用场景

总结一下生产常用应用场景,主要分为下列几种

(一)普通数据缓存

说明:日常存入mysql的一下配置数据,可以加载到redis中

1、需求

saas服务每个商家都可以在后台动态填写自己支付配置,每次查询后需要将其缓存下来

2、设计

  • 获取配置时,首先获取一下缓存,若缓存没有数据,则查询mysql。有则直接返回配置数据
  • 查询mysql拿到配置数据,将数据缓存redis后,再返回配置
  • 缓存键设计为 paysetting:payment:{服务商id}

3、开发


//下面写了主要逻辑,没有处理异常逻辑  需要小伙伴自己补充

public PaymentDto getPaymentSetting() throws Exception{
    ObjectMapper objectMapper = new ObjectMapper();

    //查询缓存
    String key = "paysetting:payment:1";
    //查询缓存
    PaymentDto paymentDto = objectMapper.readValue((String) redisTemplate.opsForValue().get(key), PaymentDto.class);
    if(ObjectUtils.isEmpty(paymentDto)){
        //查询数据库
        PaymentDto data = getData();
        //缓存
        redisTemplate.opsForValue().set(key,objectMapper.writeValueAsString(data),3000,TimeUnit.SECONDS);
        return data;
    }
    //返回数据
    return paymentDto;
}

//这里假设从数据库获取信息
private PaymentDto getData(){
    PaymentDto paymentDto = new PaymentDto();
    paymentDto.setAppId("98765365830261325");
    paymentDto.setAppSecret("fodkcjeuhaytwgvbdmi873tg4doo");
    return paymentDto;
}
复制代码

(二)对象实例缓存

说明:业务需要的常用对象实例,也可以将其缓存起来。就像spring框架启动会把单例非懒加载的对象提前实例化缓存进JVM

(三)计数器

说明:一些实时性要求高、频繁写入的业务场景对mysql等数据库性能压榨,这时候可以使用redis来缓解。如文章点赞数、评论数之类,或者接口限流等M

1、需求

某些开放接口需要根据不同的套餐流量限制客户每天访问次数

2、设计

  • 获取套餐配置,得到客户每天能访问接口的最大次数
  • 从缓存获取今日客户已访问该接口的次数,与最大次数对比,若等于则返回提示“今日已达访问上限”。否则该接口记录次数加一
  • 缓存键设计为 {接口标识}:{year-month-day}:{服务商id}

3、开发

//下面写了主要逻辑,没有处理异常逻辑 需要小伙伴自己补充

public void limitInterface() throws Exception{
    //获取套餐配置,得到客户每天能访问接口的最大次数
    Integer limitNum = getLimitNum();
    //key值
    String key = "findData:2021-11-26:100";
    
    //查询缓存  缓存键设计为  {接口标识}:{year-month-day}:{服务商id}
    String  count = (String) redisTemplate.opsForValue().get(key);

    Integer countNum = Integer.valueOf(count);
    
    if(countNum < limitNum){
        //接口记录次数加一
        redisTemplate.opsForValue().increment(key);
        
        //继续执行业务逻辑
    }else{
        System.out.println("今日已达访问上限");
    }
}

public Integer getLimitNum(){
    //从缓存里面取,缓存没有再从数据库里面取(从数据库里面取出来后要更新到缓存)

    return 100;
}
复制代码

(四)分布式锁

说明:使用redis的setnx命令可以实现只有一个客户端成功设置一个键值,从而实现分布式锁。

(五)session共享

说明:多台机器想要实现session共享,就需要寻找一个公共存储数据的地方,或者说能够实现数据的同步。显然,redis就可以是一个公共存储数据的地方。

(六)分布式ID生成。

说明:为了保证id的唯一性,可以让redis统一生成一批id,然后取出来使用

猜你喜欢

转载自juejin.im/post/7034816122109050893