美文网首页
redis字符串详解

redis字符串详解

作者: handsomemao666 | 来源:发表于2020-04-04 19:29 被阅读0次

字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。如图2-7所示,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

1. 命令
  • 设置值

    set key value [ex seconds] [px milliseconds] [nx|xx]
    

    set命令有几个选项:

    • ex seconds:为键设置秒级过期时间。
    • px milliseconds:为键设置毫秒级过期时间。
    • nx:键必须不存在,才可以设置成功,用于添加。
    • xx:与nx相反,键必须存在,才可以设置成功,用于更新。

    除了set选项,Redis还提供了setex和setnx两个命令,它们的作用和ex和nx选项是一样的。

  • 批量设置值

    mset key value [key value ...]
    
  • 批量获取值

    mget key [key ...]
    
  • 计数
    incr命令用于对值做自增操作,返回结果分为三种情况:

    • 值不是整数,返回错误。
    • 值是整数,返回自增后的结果。
    • 键不存在,按照值为0自增,返回结果为1。

    除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数)


    字符串类型命令时间复杂度
2. 内部编码

字符串类型的内部编码有3种,Redis会根据当前值的类型和长度决定使用哪种内部编码实现:

  • int:8个字节的长整型。
  • embstr:小于等于39个字节的字符串。
  • raw:大于39个字节的字符串。
3. 使用场景

3.1 缓存功能
图3-1是比较典型的缓存使用场景,其中Redis作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。下面伪代码模拟了图3-11的访问过程:

图3-1 Redis + MySQL组成的缓存存储架构
功能伪代码如下:
    UserInfo getUserInfo(long id){
        userRedisKey = "user:info:" + id
        value = redis.get(userRedisKey);
        UserInfo userInfo;
        if (value != null) {
            userInfo = deserialize(value);
        } else {
            userInfo = mysql.get(id);
            if (userInfo != null)
                redis.setex(userRedisKey, 3600, serialize(userInfo));
        }
        return userInfo;
    }

注意事项:
与MySQL等关系型数据库不同的是,Redis没有命令空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用“业务名:对象名:id:[属性]”作为键名(也可以不是分号)。例如MySQL的数据库名为vs,用户表名为user,那么对应的键可以用"vs:user:1","vs:user:1:name"来表示,如果当前Redis只被一个业务使用,甚至可以去掉“vs:”。如果键名比较长,例如“user:{uid}:friends:messages:{mid}”,可以在描述键含义的前提下适当减少键的长度,例如变为“u:{uid}:fr:m:{mid}”,从而减少由于键过长的内存浪费。
3.2 限速
很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。

phoneNum = "138xxxxxxxx";
key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <=5){
//  通过
}else{
//  限速
}

相关文章

网友评论

      本文标题:redis字符串详解

      本文链接:https://www.haomeiwen.com/subject/ebajphtx.html