《Redis DevOps》二:API的理解和使用

概述

  1. 数据结构与内部编码

    优点:
    1)改进内部编码时,对外数据结构与命令无影响
    2)多种内部编码适配不同使用场景

  2. 单线程架构
    单线程访问快速的原因:
    1)纯内存访问
    2)非阻塞IO,epoll的I/O多路复用技术
    3)避免了线程切换和竞态的消耗

5种数据结构

字符串string

  1. 命令
    get/set/del/mset/mget/incr/decr/incrby/decrby/incrbyfloat/append/strlen/setrange/getrange
  2. 内部编码
    1. int: 8字节的长整型
    2. embstr: 长度小于等于39的字符串
    3. raw: 长度大于39的字符串
  3. 典型应用场景
    1. 缓存
    2. 计数
    3. 共享session
    4. 限速

哈希hash

  1. 命令

    hset/hget/hdel/hlen/hgetall/hmget/hmset/hexists/hkeys/hvals/hsetnx/hincrby/hincrbyfloat/hstrlen

  2. 内部编码

    1. ziplist: hash-max-ziplist-entries 512,hash-max-ziplist-value 64B,更为节约内存
    2. hashtable: 对比ziplist读写效率下降,复杂度O(1)
  3. 典型应用场景

    1. 存储结构性数据

列表list(有序、可重复)

  1. 命令

    lpush/rpush/linsert/{lrange lindex llen}/{lpop rpop lrem ltrim}/lset/

  2. 内部编码

    1. ziplist: list-max-ziplist-entries 512,list-max-ziplist-value 64B,更为节约内存
    2. linkedlist
  3. 典型应用场景

    1. 消息队列:lpush + brpop
    2. 文章列表

集合set(无序、不重复)

  1. 命令
    1. 集合内:sadd/srem/scard/sismember/spop/smembers
    2. 集合间:sinter/sunion/sdiff/
  2. 内部编码
    1. intset: set-max-intset-entries 512,整数
    2. hashtable
  3. 典型应用场景
    1. 标签,sadd -> Tagging, spop/srandmember 抽奖,sdiff + dinter 社交网络

有序集合(有序、不重复)

  1. 命令
    1. 集合内:zadd/zcard/zscore/{zrank zrevrank}/zrem/zincrby/{zrange zrevrange}/{zrangebyscore zrevrangebyscore}/zcount/zremrangebyrank/zremrangebyscore
    2. 集合间: zinterstore/zunionstore
  2. 内部编码
    1. ziplist: zset-max-ziplist-entries 512,zset-max-ziplist-value 64B,更为节约内存
    2. skiplist: 读写效率下降
  3. 典型应用场景
    1. 排行榜系统

键管理

1. 单个键管理

  • 键重命名 rename key newkey

  • 随机返回一个键 randomkey

  • 键过期 expire/ttl/expireat/pexpire/pexpireat/pttl/persist,注意事项:

    • 1)若键不存在,expire 结果返回0
    • 2)若过期时间为负值,键会立即被删除,等于del
    • 3)persist命令会清除过期时间
    • 4)对于字符串类型键,set命令会去掉过期时间。源码中,set命令最后执行了removeExpire
    • 5)不支持二级数据结构内部元素单独设置过期时间
    • 6)setex,原子执行+节约网络开销
  • 迁移键

    • move,实例内部,原子性,不支持多键
    • dump+restore,实例之间,非原子性,不支持多键
    • migrate,实例之间,原子性,支持多键

2. 遍历键

    1. 全量遍历键 keys pattern

由于redis单线程,keys命令可能会造成阻塞,可以使用keys命令的场景:
1)在不对外提供服务的从节点上执行
2)确认键值比较少
3)使用scan替代

    1. 渐进遍历键 scan cursor [match pattern] [count number]

缺点:若scan执行过程中,键值发生变化,新增的键可能遍历不到,或有重复的键,可能无法遍历出所有的键。

hscan/sscan/zscan分别对应hash/set/zset

3. 数据库管理

    1. 数据库大小 dbsize
    1. 切换数据库 select dbIndex
    1. 清除数据库 flushdb(当前库)/flushall
posted @ 2022-12-13 23:23  雪梨大佬  阅读(17)  评论(0编辑  收藏  举报