• 2.RedisAPI的使用和理解


    RedisAPI的使用和理解

    • 通用命令
      • 通用命令
        • keys 遍历所有key O(n)
          • 热备从节点
          • scan
        • dbsize 计数器 算出key的总数 O(1)
        • exists key 判断一个key是否存在 O(1)
        • del key [key ...] 删除指定key-value 也可以删除多个 O(1)
        • expire O(1)
          • expire key seconds 设置过期时间 O(1)
          • ttl key 查询key的过期时间 O(1)
          • persist key 去掉过期时间 O(1)
        • type key 返回key的类型 O(1)
      • 数据结构和内部编码
        • string
          • raw
          • int
          • embstr
        • hash
          • hashtable
          • ziplist
        • list
          • linkedlist
          • ziplist
        • set
          • hashtable
          • intset
        • zset
          • skiplist
          • ziplist
      • 单线程架构
        • 纯内存
        • 非阻塞 epoll IO--》Redis Event Loop
        • 避免线程切换和竞态消耗
        • 一次运行一条命令
        • 拒绝长(慢)命令
    • 字符串类型 *特点 * 缓存 * 计数器 * 分布式锁

      • 重要API
        • get key 获取key对应的value O(1)
        • set key 设置key的值 O(1)
        • del key O(1)
        • incr 自增1 key不存在 自增get(key)=1
        • decr 自减1
        • incrby 增加特定值
        • decrby 减小特定值
      • 实战
        • incr userid:pagevire (单线程 无竞争)
        • 缓存视频的基本信息(数据源在mysql中)伪代码vie --> App Server --> redis --> mysql
        • 原子单线程 incr id
      • 查缺补漏
        • set key value 不管key是否存在 都可设置
        • setnx key value key不存在 ,才设置 添加
        • set key value xx key存在,才设置 更新操作
        • mget 批量获取key 原子操作 O(n)
        • mset key1 key2 .. 批量设置key-value O(n)
        • get命令 n次get = n次网络时间+ n次命令时间
        • mget 1次mget = 1次网络时间 + n次命令时间
        • getset key newvalue 设置新的值返回旧的值
        • append key value 将value追加到旧的value O(1)
        • strlen key 返回字符串的长度(注意中文) O(1)
        • incrbyfloat key 3.5 增加key对应的值3.5
        • getrange key start end 获取字符串指定下标所有值 O(1)
        • setrange key index value 指定下标所对应的值
      • 总结

        命令含义复杂度
        set key value 设置key-value O(1)
        get key 获取key-value O(1)
        del key 删除key-value O(1)
        setnx setxx 根据key是否存在设置key-value O(1)
        incr decr 计数 O(1)
        mget mset 批量操作key-value O(n)
    • 哈希类型 key field

      • 重要API
        • hget key field O(1)
        • hset key field value O(1)
        • hdel key field O(1)
        • hgetall field
        • hexists key field O(1)
        • hlen key O(1)
        • hmget key field1 ..fieldN 批量获取 O(n)
        • hmset key field1 value1 ..fieldN valueN
      • 哈希实战
        • 记录网站每个用户个人主页的访问量
          • hincrby user:info pageview count
        • 缓存视频的基本信息
          • hgetall(rediskey)
          • 从redis获取数据
          • 如果redis中没有 则从sql数据库中获取 然后返回给用户 写入redis中
      • 查缺补漏
        • hgetall key O(n)
        • hvals key O(n)
        • hkeys key O(n)
        • hsetnx
      • 总结

        命令复杂度
        hget hset hdel O(1)
        hexists O(1)
        hincrby O(1)
        hgetall hvals hkeys O(n)
        hmget hmset O(n)
    • 列表类型

      • 特点
        • 有序
        • 可以重复
        • 左右两边插入
      • 重要API
        • rpush key value1 value2 O(1~n)
          • rpush listkey c b a c -> b -> a
        • rpush key value1 value2 O(1~n)
          • lpush listkey c b a a <- b <- c
        • linsert key before|after value newvalue O(n)
          • a - b - c - d
          • linsert listkey before b java ==> a - java - b - c - d
          • linsert listkey after b php ==> a - b - php - c - d
          • lpop key : lpop listkey ==> b - c - d
          • rpop key : rpop listkey ==> a - b - c
          • lrem key count value
            • 根据count值,从列表中删除所有value相等的项目
            • count> 0 从左到右 删除最多count个value相等的项
            • count < 0 从右到左 删除最多个count绝对值个value相等的项
            • count=0 删除所有value相等的项
            • lrem listkey 0 a
            • lrem listkey -1 c
          • ltrim key start end O(n) 按照索引修建列表
            • ltrim listkey 1 4
          • 查询
          • lrange key start end(包含end) O(n)
            • lrange key 0 2 前三个元素
            • lrange listkey 1 -1 从第二个元素到最后一个元素范围
          • lindex key index O(n)
            • lindex listkey 0 第一个元素
            • lindex listkey -1 最后一个元素
          • llen key 列表长度 O(1)
          • lset key index newValue O(n)
            • lset listkey 2 java 第三个元素修改为java
          • blpop key timeout O(1)
            • lpop阻塞版本 timeout 是阻塞超时时间 timeout=0 为永远不阻塞
          • brpop key timeout
      • 实战
        • stack = lpush + lpop 先进后出
        • queue = lpush + rpop 先进先出
        • capped collection = lpush + ltrim 控制队列大小
        • message Queue = lpush + brpop
    • 集合类型

      • 特点
        • 无序
        • 无重复
        • 集合间操作
      • 集合内API和实战

        • sadd key element O(1)
        • srem key element O(1)
        • scard key 计算集合大小
        • sismember key 判断key是否存在在集合中
        • srandmember key count 从集合中随机挑选count个元素
        • spop key 从集合中随机弹出一个元素
          • srandmember 和 spop
            • spop从集合弹出
            • srandmember 不会破坏集合的数据 随机返回多个元素
        • smembers key 取出几个中所有元素
          • 无序
          • 小心使用 集合元素过多 会阻塞redis
          • scan 扫描集合中的元素 根据游标取出元素
        • 实战
          • 127.0.0.1:6379> sadd user:1:follow it news his sports
          • (integer) 4
          • 127.0.0.1:6379> smembers user:1:follow
          • 1) "his"
          • 2) "it"
          • 3) "sports"
          • 4) "news"
          • 127.0.0.1:6379> spop user:1:follow
          • "it"
          • 127.0.0.1:6379> smembers user:1:follow
          • 1) "his"
          • 2) "sports"
          • 3) "news"
          • 127.0.0.1:6379> scard user:1:follow
          • (integer) 3
          • 127.0.0.1:6379> sismember user:1:follow entertainment
          • (integer) 0
        • 抽奖 spop 或 srandmember
        • Like、赞、踩 sadd
        • 标签(tag) 同事务
          • 给用户添加标签 用户关注的标签
            • sadd user:1 tag1 tag2 tag3
          • 给标签添加用户 关注标签的用户
            • sadd tag1:users user:1 user:3
      • 集合间API和实战

        • sdiff key key
        • sinter key key
        • sunion key key
        • sdiff|sinter|sunion +store destkey 将差集、交集、并集结果保存在destkey中
        • 实战
          • 共同关注 sinter
          • sadd = tagging
          • spop/srandmember = random item
          • sadd + sinter = social graph 社交相关应用
    • 有序集合

      • 特定
        • 无重复元素
        • 有序
        • elment + score
      • 重要API 压缩列表 超列表
        • zadd key score element O(logN)
          • score 可以重复
          • element 不可重复
          • zadd user:1:ranking 255 tom
        • zrem key element 可以是多个 O(1)
          • zrem user:1:ranking tom
        • zscore key element O(1)
          • zscore user:1:ranking tom
        • zincrby key increScore element
          • zincrby user:1:ranking 9 mike
        • zcard key 返回元素总数 O(1)
        • zrank key element 获取元素index
        • zrange key start end [withscores] O(log(n) +m)
          • 返回指定索引范围内的升序元素
        • 例子

          • 127.0.0.1:6379> zadd player:rank 100 ronaldo 900 messi 800 c-ronaldo 600 kaka
          • (integer) 4
          • 127.0.0.1:6379> zscore player:rank kaka
          • "600"
          • 127.0.0.1:6379> zrank player:rank ronaldo
          • (integer) 0
          • 127.0.0.1:6379> zrank player:rank messi
          • (integer) 3
          • 127.0.0.1:6379> zrem player:rank messi
          • (integer) 1
          • 127.0.0.1:6379> zrange player:rank 0 -1 withscores
          • 1) "ronaldo"
          • 2) "100"
          • 3) "kaka"
          • 4) "600"
          • 5) "c-ronaldo"
          • 6) "800"
        • zrangebyscore key minScore maxScore [withscores] O(log(n) +m)
          • 返回指定分数范围内的升序元素【分值】
          • zrangebyscore user:1:ranking 90 210 withscores
        • zcount key minScore maxScore
          • 返回有序集合内指定分数范围内的个数
          • zcount user:1:ranking 200 221
        • zremrangebyrank key start end O(log(n) +m)
          • 删除指定排名内的升序元素
          • zremrangebyrank user:1:ranking 1 2 删除第二名到第三名
        • zremrangebyscore key minScore maxScore O(log(n) +m)
          • 删除指定分之内的升序元素
          • zremrangebyscore user:1:ranking 90 210
      • 实战
        • 排行榜 新书热卖榜 特价畅销书 图书关注榜
          • score timeStamp saleCount followCount
      • 查缺补露
        • zrevrank
        • zrevrange
        • zrevrangebyscore
        • zinterstore
        • zunionstore
      • 总结

        操作类型命令
        基本操作 zadd zrem zcard zincrby zscore
        范围操作 zrange zrangebyscore zcount zremrangebyrank
        集合操作 zunionstore zinterstore
  • 相关阅读:
    Leetcode 从前序与中序遍历序列构造二叉树
    python基础一 day6 序列操作集合
    python基础一 day6 文件操作
    python基础一 day5 集合
    python基础一 day5 复习
    python基础一 day5 知识点
    python基础一 day4 字典
    python基础一day4 元组
    python基础一 day3 列表
    python基础一 day2 字符串操作
  • 原文地址:https://www.cnblogs.com/richiewlq/p/12182307.html
Copyright © 2020-2023  润新知