美文网首页
redis笔记(三)redis的设计与开发

redis笔记(三)redis的设计与开发

作者: 7ColorLotus | 来源:发表于2020-05-14 00:22 被阅读0次

    redis的设计与开发

    • Redis基本通讯模型

      1. 执行过程:发送指令 -> 执行命令 -> 返回结果
      2. 执行命令:单线程执行,所有命令进入队列,按顺序执行
      3. 单线程快的原因:纯内存访问,单线程避免线程切换和竞争产生资源消耗,RESP协议简单
      4. 问题:如果某个命令执行慢,会造成其他命令的阻塞
    • 数据结构-字符串
      1.字符串类型:实际上可以是字符串(包括XML和JSON),还有数字(整形,浮点型),二进制(图片,音视频),最大不超过512MB
      2.设值命令:

        set age 23 ex 10 //10秒后过期 px 10000 毫秒后过期
        setnx name test //不存在键name时,返回1设置成功,反之,返回0设置失败
        set age 25 xx //存在键age时返回1成功
      
      1. 获值命令:get age //存在则返回value,不存在返回Null
      2. 批量设置:mset country china city bejing
      3. 批量获取:mget country city address //返回 china beijing nill
        注意:若没有mget命令,则要执行n次get命令
    • 字符串-计数

        incr age //值必须为整数自加1,非整数返回错误,无age键从0自增返回1
        decr age //整数值age减1
        incrby age 2 //整数age+2
        decrby age 2 //整数age - 2
        incrbyfloat score 1.1 //浮点型score+1.1
      
    • 字符串-追加

      1. append追加指令:
        set name hello
        append name world  //追加后成hello world 
      
      1. 字符串长度
        set hello "世界"
        strlen hello //结果6 ,每个中文占3个字节
      
      1. 截取字符串
        set name helloworld 
        getrange name 24
      
    • 数据结构-hash

      1. 哈希hash 是一个string 类型的field和value的映射表,hash特适合用于存储对象
      2. 命令:hset key field value
      3. 设值:hset user:1 name james //成功返回1 反之返回0
      4. 取值:hget user:1 name //返回james
      5. 删值:hdel user:1 age //返回删除的个数
      6. 计算个数:
        hset user:1 name james
        hset user:1 age 23
        hlen user:1
      
      1. 批量设值:hmset user:2 name james age 23 sex boy //返回ok
      2. 批量取值:hmget user:2 name age sex //返回三行:james 23 boy
      3. 判断field是否存在:hexists user:2 name //若存在返回1, 不存在返回0
      4. 获取所有field:hkeys user:2 //返回name,age,sex 三个field
      5. 获取所有value:hvals user:2 //返回james 23 boy
      6. 获取所有fields和values:hgetall user:2 //返回name age sex james 23 boy值
      7. 增加1:
        hincrby user:2 age 1    //age + 1
        hincrbyfloat user:2 age 2 //浮点型增加2
      
    • 三种方案实现用户信息存储优缺点

      1. 原生
        1)命令
        set user:1:name jason
        set user:1:age 22
        

      2)优缺点:
      优点:简单直观,每一个键对应一个值
      缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

      1. 将对象序列化存入redis
        1) 命令
        set user:1 serialize(userInfo)
        2) 优缺点:
        优点:编程简单,若使用序列化合理内存使用率高
        缺点:序列化和反序列化有一定的开销,更新属性时,需要把userInfo全取出来进行反序列化,更新后再序列化到redis
      2. 使用Hash类型
        1)命令
        hmset user:1 name james age 23 sex boy
        2)优缺点
        优点:简单直观,使用合理,减少内存空间消耗
        缺点:要控制ziplist与hashtable两种编码转换,且hashtable会比serialize(userInfo)消耗更多内存
    • 数据结构-列表<list>

      1. 列表是用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素。因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复
      2. 添加命令:
        rpush james c b a //从右向左插入cba,返回值3
        lrange jame 0 -1 //从左到右获取列表所有元素 返回cba 
        lpush key c b a //从左向右插入cba 
        linsert james before b teacher //在b之前插入teacher,after为之后,使用lrange james 0 -1 查看 c teacher b a 
      
      1. 查找命令
        lrange key start end //索引下标特点:从左到有 0 到n-1
        lindex james -1 // 返回最末尾a,-2 返回b
        llen james //返回当前列表长度
        lpop james //把最最左边的第一个元素删除
        rpop james //把最右边的元素a删除
      
    • 数据结构-集合<set>

      1. 用户标签,社交,查询有共同兴趣爱好的人,智能推荐等。保存多元素,与列表不一样的是不允许有重复的元素,而且是无序,一个集合最多可以存2的32次方减1个元素,处理支持增删改查,还支持集合交集,并集,差集
      2. 命令:
      exists user //检查user键是否存在
      sadd user a b c //向user插入3个元素,返回3
      sadd user a b //插入重复数据,则插入无效,返回0
      smembers user //获取user的所有元素,返回结果无序
              
      srem user a //返回1,删除a元素
      scard user //返回2,计算元素个数
      
    • 有序集合-<zset>

      1. 常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
      2. 指令:
      zadd key score member 
      zadd user:zan 200 james //james的点赞数为1 ,返回操作成功的条数1
      zadd user:zan 200 james 120 mike 100 lee //返回3 
              
      zadd test:1 nx 100 james //键test:1 必须不存在,主要用于添加
      zadd test:1 xx incr 200 james //键test:1 必须存在,主要用于修改,此时为300 
      zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1
      
      zrange test:1 0 -1 withscores //查看点赞分数与成员名
              
      zcard test:1 //计算成员个数,返回1 
      
      1. 排名场景
      zadd user:3 200 james 120 mike 100 lee //先插入数据
      zrange user:3 0 -1 withscores //查看分数和成员
              
      zrank user:3 james //返回名次:第三名返回2 ,从0开始到2,共3名
      zrevrank user:3 james //返回0 ,反排序,点赞数越高,排名越前
      
      1. 应用场景:排行榜系统
        // 点赞数:
        zadd user:1:20180601 3 mike //mark获得3个赞
        // 再获得一赞
        zincrby user:1:20180601 1 mike //在3的基础上加1
        // 用户作弊,将用户从排行榜删掉
        zrem user:1:20180601 mike 
        // 展示赞数最多的5个用户
        zrevrangebyrank user:1:20180601 0 4
        // 查看用户赞数与排名
        zscore user:1:20180601 mike 
        zrank user:1:20180601 mike 
      
    • 全局命令

      1. 查看所有键:
         set school enjoy 
         set hello world
         keys * 
      
      1. 键总数
          dbsize //2个键,如果存在大量键,禁止使用此命令
      
      1. 检查键是否存在
          exists key //存在返回1 ,反之返回0
      
      1. 删除键
          del key //del hello school ,返回删除键数,不存在返回0
      
      1. 键过期
          expire key seconds //set name test expire 10 ,表示10秒过期
          ttl key //查看剩余的过期时间
      
      1. 键的数据结构类型
          type key //type hello //返回string ,不存在返回none
      
    • redis数据库管理

      1. 选择使用某个库,redis默认16个库(0-15)
        select 0
      
      1. 清空当前库中的数据
        flushdb 0
      
      1. 清空所有库的数据
        flushall 
      
      1. 键总数
        dbsize
      

    相关文章

      网友评论

          本文标题:redis笔记(三)redis的设计与开发

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