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

 

RedisAPI的使用和理解

上一篇:WPF DataGrid的可见性


下一篇:【MySQL参数优化】根据架构优化