Wetts's blog

Stay Hungry, Stay Foolish.

0%

Redis-常用命令

key pattern 查询相应的key

  • redis 允许模糊查询 key 有 3 个通配符 *、?、[]
  • randomkey:返回随机 key
  • type key:返回 key 存储的类型
  • exists key:判断某个 key 是否存在
  • del key:删除 key
  • rename key newkey:改名
  • renamenx key newkey:如果 newkey 不存在则修改成功
  • move key 1:将 key 移动到 1 数据库
  • ttl key:查询 key 的生命周期(秒)
  • expire key 整数值:设置 key 的生命周期以秒为单位
  • pexpire key 整数值:设置 key 的生命周期以毫秒为单位
  • pttl key:查询 key 的生命周期(毫秒)
  • perisist key:把指定 key 设置为永久有效

字符串类型的操作

  • set key value [ex 秒数] [px 毫秒数] [nx/xx]
    • ```
      如果ex和px同时写,则以后面的有效期为准
      nx:如果key不存在则建立
      xx:如果key存在则修改其值
      1
      2
      3
      4
      5
      6
      - get key:取值
      - mset key1 value1 key2 value2:一次设置多个值
      - mget key1 key2:一次获取多个值
      - setrange key offset value:把字符串的 offset 偏移字节改成 value,
      - ```
      如果偏移量 > 字符串长度,该字符自动补 0x00
  • append key value:把 value 追加到 key 的原值上
  • getrange key start stop:获取字符串中 [start, stop] 范围的值
    • ```
      对于字符串的下标,左数从 0 开始,右数从 -1 开始
      注意:当 start>length,则返回空字符串
        当 stop>=length,则截取至字符串尾
        如果 start 所处位置在 stop 右边,则返回空字符串
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      - getset key nrevalue:获取并返回旧值,在设置新值
      - incr key:自增,返回新值,如果 incr 一个不是 int 的 value 则返回错误,incr 一个不存在的 key,则设置 key 为 1
      - incrby key 2:跳 2 自增
      - incrbyfloat by 0.7:自增浮点数 
      - setbit key offset value:设置 offset 对应二进制上的值,返回该位上的旧值
      - ```
      注意:如果offset过大,则会在中间填充0
      offset最大到多少
      2^32-1,即可推出最大的字符串为512M
  • bitop operation destkey key1 [key2..]:对 key1 key2 做 opecation 并将结果保存在 destkey 上,opecation 可以是 AND OR NOT XOR
  • strlen key:取指定 key 的 value 值的长度
  • setex key time value:设置 key 对应的值 value,并设置有效期为 time 秒

链表操作

Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表,链表的最大长度是 $2^32$。list 既可以用做栈,也可以用做队列。

list 的 pop 操作还有阻塞版本,主要是为了避免轮询

  • lpush key value:把值插入到链表头部

  • rpush key value:把值插入到链表尾部

  • lpop key:返回并删除链表头部元素

  • rpop key:返回并删除链表尾部元素

  • lrange key start stop:返回链表中 [start, stop] 中的元素

  • lrem key count value:从链表中删除 value 值,删除 count 的绝对值个 value 后结束

    • ```
      count > 0 从表头删除  
      count < 0 从表尾删除  
      count=0 全部删除
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      - ltrim key start stop:剪切 key 对应的链接,切 `[start, stop]` 一段并把改制重新赋给 key
      - lindex key index:返回 index 索引上的值
      - llen key:计算链表的元素个数
      - linsert key after|before search value:在 key 链表中寻找 search,并在 search 值之前|之后插入 value
      - rpoplpush source dest:把 source 的末尾拿出,放到 dest 头部,并返回单元值
      - ```
      应用场景: task + bak 双链表完成安全队列

      业务逻辑: rpoplpush task bak
      接收返回值并做业务处理
      如果成功则rpop bak清除任务,如果不成功,下次从bak表取任务
  • brpop,blpop key timeout:等待弹出 key 的尾/头元素

    • timeout为等待超时时间,如果timeout为0则一直等待下去
      
      应用场景:长轮询ajax,在线聊天时能用到
      
      1
      2
      3
      4
      5

      ## hashes 类型及操作
      Redis hash 是一个 string 类型的 field 和 value 的映射表,它的添加、删除操作都是 $O(1)$(平均)。hash 特别适用于存储对象,将一个对象存储在 hash 类型中会占用更少的内存,并且可以方便的存取整个对象。

      配置:
      hash_max_zipmap_entries 64 #配置字段最多 64 个 hash_max_zipmap_value 512 #配置 value 最大为 512 字节
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73

      - hset myhash field value:设置 myhash 的 field 为 value
      - hsetnx myhash field value:不存在的情况下设置 myhash 的 field 为 value
      - hmset myhash field1 value1 field2 value2:同时设置多个 field
      - hget myhash field:获取指定的 hash field
      - hmget myhash field1 field2:一次获取多个 field
      - hincrby myhash field 5:指定的 hash field 加上给定的值
      - hexists myhash field:测试指定的 field 是否存在
      - hlen myhash:返回 hash 的 field 数量
      - hdel myhash field:删除指定的 field
      - hkeys myhash:返回 hash 所有的 field
      - hvals myhash:返回 hash 所有的 value
      - hgetall myhash:获取某个 hash 中全部的 field 及 value 

      ## 集合(sets)
      特点:无序性、确定性、唯一性
      - sadd key value1 value2:往集合里面添加元素
      - smembers key:获取集合所有的元素
      - srem key value:删除集合某个元素
      - spop key:返回并删除集合中 1 个随机元素(可以坐抽奖,不会重复抽到某人)   
      - srandmember key:随机取一个元素
      - sismember key value:判断集合是否有某个值
      - scard key:返回集合元素的个数
      - smove source dest value:把 source 的 value 移动到 dest 集合中
      - sinter key1 key2 key3:求 key1 key2 key3 的交集
      - sunion key1 key2:求 key1 key2 的并集
      - sdiff key1 key2:求 key1 key2 的差集
      - sinterstore res key1 key2:求 key1 key2 的交集并存在 res 里 

      ## 有序集合
      概念:它是在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动按新的值调整顺序。可以理解为有两列的 MySQL 表,一列存储 value,一列存储顺序,操作中 key 理解为 zset 的名字。

      和 set 一样 sorted sets 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 型的 score。sorted set 的实现是 skip list 和 hash table 的混合体。

      当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 $O(1)$。另一个 score 到元素的映射被添加的 skip list,并按照 score 排序,所以就可以有序地获取集合中的元素。添加、删除操作开销都是 $O(logN)$ 和 skip list 的开销一致,redis 的 skip list 实现是双向链表,这样就可以逆序从尾部去元素。sorted set 最经常使用方式应该就是作为索引来使用,我们可以把要排序的字段作为 score 存储,对象的 ID 当元素存储。

      - zadd key score1 value1:添加元素
      - `zrange key start stop [withscore]`:把集合排序后,返回名次 `[start,stop]` 的元素(默认是升续排列 withscores 是把 score 也打印出来)
      - zrank key member:查询 member 的排名(升序 0 名开始)
      - `zrangebyscore key min max [withscores] limit offset N`:集合(升序)排序后取 score 在 `[min, max]` 内的元素,并跳过 offset 个,取出 N 个
      - zrevrank key member:查询 member 排名(降序 0 名开始)
      - zremrangebyscore key min max:按照 score 来删除元素,删除 score 在 `[min, max]` 之间
      - zrem key value1 value2:删除集合中的元素
      - zremrangebyrank key start end:按排名删除元素,删除名次在 `[start, end]` 之间的
      - zcard key:返回集合元素的个数
      - zcount key min max:返回 `[min, max]` 区间内元素数量
      - `zinterstore dest numkeys key1[key2..] [WEIGHTS weight1 [weight2...]] [AGGREGATE SUM|MIN|MAX]`
      - ```
      求`key1,key2的交集,key1,key2的权值分别是weight1,weight2
      聚合方法用 sum|min|max
      聚合结果 保存子dest集合内
      注意:weights,aggregate如何理解?
      答:如果有交集,交集元素又有score,score怎么处理?aggregate num->score相加,min最小score,max最大score,另外可以通过weights设置不同的key的权重,交集时  score*weight
      ````

      ## 服务器相关命令
      - ping:测定连接是否存活
      - echo:在命令行打印一些内容
      - select:选择数据库
      - quit:退出连接
      - dbsize:返回当前数据库中key的数目
      - info:获取服务器的信息和统计
      - monitor:实时转储收到的请求
      - config get 配置项:获取服务器配置的信息
      - config set 配置项  值:设置配置项信息
      - flushdb:删除当前选择数据库中所有的 key
      - flushall:删除所有数据库中的所有的 key
      - time:显示服务器时间,时间戳(秒),微秒数
      - bgrewriteaof:后台保存 aof 快照
      - bgsave:后台保存 rdb 快照
      - save:保存 rdb 快照
      - lastsave:上次保存时间
      - shutdown [save/nosave]
      注意:如果不小心运行了 flushall,立即 shutdown nosave,关闭服务器,然后手工编辑 aof 文件,去掉文件中的 flushall 相关行,然后开启服务器,就可以倒回原来是数据。如果 flushall 之后,系统恰好 bgwriteaof 了,那么 aof 就清空了,数据丢失。
      1
      2

      - showlog:显示慢查询
      问:多慢才叫慢? 答:由 slowlog-log-slower-than 10000,来指定(单位为微秒) 问:服务器存储多少条慢查询记录 答:由 slowlog-max-len 128,来做限制