Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

redis #63

Open
magicdawn opened this issue Feb 29, 2016 · 5 comments
Open

redis #63

magicdawn opened this issue Feb 29, 2016 · 5 comments

Comments

@magicdawn
Copy link
Owner

something on redis.

books

  • Redis in Action
  • Redis入门指南(第二版)
@magicdawn
Copy link
Owner Author

magicdawn commented Mar 1, 2016

commands

通用

  • SELECT 0 选择db

  • KEYS <pattern> 列出符合pattern的key

    字符 说明
    * 匹配任意个(包括0)个字符
    ? 匹配一个字符
    [ab] 匹配 a 或者 b
    \x 匹配字符x, 如 \? 匹配 ?
  • EXISTS <KEY> 判断KEY是否存在, return 1 = 存在 0 = 不存在

  • DEL <KEY> 删除键

  • TYPE <KEY> 判断数据类型
    包括

    • string
    • list
    • hash
    • set
    • zset(sorted set)

string

  • GET key
  • SET key value
  • INCR key / DECR key +1 / -1, 返回 增加/减少 操作之后的结果
  • INCRBY key num / DECRBY key num +n / -n
  • INCRBYFLOAT key num / DECRBYFLOAT key num +n.m / -n.m 浮点数
  • APPEND key value append值, 若不存在, 则是 SET
  • STRLEN key 返回字符长度
  • MGET k1 k2 / MSET k1 v1 k2 v2 一条命令取多个值 / 设置多个值
  • GETBIT key offset / SETBIT key offset value 设置key的某个位
  • BITCOUNT key [start end] 在start-end范围内统计位为 1 的个数
  • BITTOP [AND|OR|XOR|NOT] dest key1 key2key1key2处的值进行AND|OR|XOR|NOT运算, 将结果存在 dest 指定的key中

hash

  • HGET hash-key field / HSET hash-key field value 取field / 设置field值
  • HMGET hash-key field1 field2 / HMSET hash-key field1 value1 field2 value2 取多个值, 设置多个值
  • HGETALL hash-key 返回
    • field1
    • value1
    • field2
    • value2
  • HEXISTS hash-key field1 判断在 hash-key 中 field1 是否存在
  • HSETNX hash-key field value 如果在 hash-key 中, field 若已存在, 则不执行任何操作
  • HINCRBY hash-key field / HINCRBYFLOAT hash-key field 注意没有 HINCR 这个命令, 当前v3.0.7
  • HDEL hash-key field 删除某一field
  • HKEYS hash-key / HVALS hash-key 获取所有 key / val
  • HLEN hash-key 获取包含的field数量

list

  • LPUSH list-key value / LPOP list-key 左侧 插入/弹出 元素, 从右侧使用 RPUSH / RPOP, 这条命令没有对应的 multi 命令, push 可以带多个值, 返回总length
  • LLEN list-ken 计算length
  • LRANGE list-key start end 包含start和end
  • LREM list-key n value 删除前 n 个值为 value的元素
    • 当 n 为负数时,从后面开始删除
    • 当 n = 0时, 会删除所有值为 value 的元素
  • LINDEX list-key index 获取 list-key[index]
  • LSET list-key index value list-key[index] = value
  • LRANGE list-key start end 只保留start至end, 包含start和end
  • LINSERT list-key BEFORE|AFTER pivot valuepivot 的之前或之后插入 value, 返回值为总元素个数
  • RPOPLPUSH source dest = LPUSH dest (RPOP source)
  • LTRIM list-key start end 只保留 start - end (inclusive)

set

  • SADD set-key value1 value2 / SREM set-key value1 value2 增/删 元素, 都返回影响的个数
  • SMEMBERS set-key 获取所有成员
  • SISMEMBER set-key value 判断value是否在集合中
  • SDIFF set-key1 set-key2 ... 差集, set-key1 - set-key2 - set-key3
  • SINTER set-key1 set-key2 ... 交集, 从左至右
  • SUNION set-key1 set-key2 ... 并集, 从左至右
  • SCARD set-key 取得集合中元素个数
  • SDIFFSTORE dest set-key1 set-key2 ... 将结果存在 dest 中, 下同
  • SINTERSTORE dest set-key1 set-key2 ...
  • SUNIONSTORE dest set-key1 set-key2 ...
  • SRANDMEMBER set-key [n] 随机获取n个元素, n默认为1
    • n > 0, 为不重复的n个元素
    • n <0, 则可能重复
  • SPOP set-key 弹出一个元素, 因为无序, 所以也是随机

zset = (sorted set)

sorted set有一个score的概念, 使用score进行排序, 使set有序

  • ZADD zset-key score member [score2 member2] 增加新成员, score为分数. 如果set中已有同名member, 则覆盖.
  • ZSCORE zset-key member 获得member的分数score
  • ZRANGE zset-key start end [WithScores] score排名从小到大, 从start到end的member, 包含start & end. 如果包含了 WithScores, 则结果为 member1, score1, member2, score2, ...
  • ZREVRANGE zset-key start end [WithScores] 从大到小
  • ZRANGEBYSCORE zset-key min max [WithScores] [LIMIT offset count]
    返回score在min至max之间的元素
    • min,max 默认包含min,max. 若想不包含max, 可以写成 (max, 如 (100
    • min,max 支持无穷大, +inf / +inf
    • LIMIT 关键字
    • offset count, 跳过 offset 个元素, 取出 count 个元素
  • ZREVRANGEBYSCORE ... 从大到小, 同上
  • ZINCRBY zset-key increment member member.score += increment
  • ZCARD zset-key 获得元素数量
  • ZCOUNT zset-key min max 获得指定区间的元素的数量
  • ZREM zset-key member [member1 member2 ...] 删除一个或多个元素
  • ZREMRANGEBYRANK zset-key start end 删除排名为start至end的元素, 从小到大
  • ZREMRANGEBYSCORE zset-key min max 删除score为 min至max的元素
  • ZRANK zset-ket member / ZREVRANK zset-key member 计算一个member的排名, 默认小->大.
  • ZINTERSTORE zset-key dest... / ZUNIONSTORE zset-key dest ... 计算交集/并集, 存储在dest, 具体规则较复杂, 用时再查吧...

@magicdawn
Copy link
Owner Author

事务

multi

statement1
statement2
statement3

exec
  • 如果是语法错误, 例如参数个数不对, 则一条命令都不会执行
  • 如果是运行错误: 运行错误指命令执行时出现的错误, 如使用了散列命令操作集合类型的键. 运行错误是会继续执行的

Redis不支持回滚, 出错之后要自己进行错误处理.

watch

watch命令可以监控一个或多个键, 一旦有一个键被修改或删除, 之后的事务就不会被执行. 监控一直持续到 EXEC 命令
watch的功能是被watch的key被更改后, 阻止其后的第一个事务的执行, 但不能保证其他客户端不修改这一键值.

> SET key 1
OK
> WATCH key
OK
> SET KEY 2
OK
> MULTI
OK
> SET KEY 3
QUEUED
> EXEC
(nil)
> GET key
2
  • 因为 WATCH 组织了随后的 MULTI 事务, 故该事务执行结果为空.
  • 事务执行前修改 key 值为2.
  • EXECUNWATCH 都可以取消监视动作

WATCH 貌似书上也讲不明白, 用时查.

生存时间

  • EXPIRE key seconds 设置过期时间, 成功返回 1, 不成功返回 0
  • TTL key 获取过期时间, 键不存在 or 没有设置过期时间, 返回 -1
  • PERSIST key 取消过期时间, 即 EXPIRE 的逆动作
  • PEXPIRE key millseconds 与expire区别在于, PEXPIRE 是毫秒

SORT

可对 list / set / zset 类型数据进行操作

sort list-key [ALPHA] [DESC] 对list进行排序

  • ALPHA 按照字幕排序
  • DESC 默认升序ASC, 此参数为降序

[LIMIT offset count]

加上 LIMIT offset count, offset表示偏移, count表示结果集大小

BY

SORT list-key BY other-list-key:* 按照其他的key来排序

  • list-key[1, 2, 3], 则会按照 other-list-key:1 / other-list-key:2 / other-list-key:3的值来排序
  • * 是占位符
  • BY 后面接一个可访问的标量值. 如 SORT list-ket some-hash-key:*->field 将list内容填充至 *, 取 other-hash-key:*->timetime 字段.
  • 当参考键不存在时, 取默认值 0
  • GET 键名 取值是指定的键, 跟 BY 参考键类似

STORE 键名

将 SORT 结果保存在指定键中, list 类型.

pub/sub 模式

subscribe / unscribe

  • PUBLISH <channel> <message> 项一个 channel 发布 message
    • 返回收到这条消息的客户端数量, 没有返回0
    • 发送的消息不会被持久化, 类似 Node.js EventEmitter
  • SUBSCRIBE <channel> 订阅一个频道
    • 进入 Subscribe 模式的client, 只能使用这四个命令 Subscribe / Unsubscribe / Psubscribe / Punsubscribe, 运行其他命令会报错
    • 进入 Subscribe 模式的client, 可能接受三种类型的数据
      • [Subscribe <channel_name> <channel_num>] channel_num是当前客户端订阅的channel数量
      • [message <channel_name> <message_content>] 收到消息了
      • [Unsubscribe <channel_name> <channel_num>] channel_num是当前客户端订阅的channel数量

psubscribe / punscribe

p = pattern

pattern规则同 KEYS <pattern>对应的pattern

@magicdawn
Copy link
Owner Author

magicdawn commented Jun 8, 2016

redis-sentinel

http://redis.io/topics/sentinel

redis 哨兵. 监控. 容错, 并提升 slave -> master

@magicdawn
Copy link
Owner Author

magicdawn commented Aug 11, 2016

redis-cluster

client

redis-cli 需要加上 -c 可以自动跳转

@magicdawn
Copy link
Owner Author

list

队列

  • RPUSH 生产数据
  • LPOP 消费数据

循环策略

  • 如果 LPOP 值为空, 休眠一段时间
  • 使用 BLPOP 命令, 没有数据就阻塞住

BLPOP

http://redis.io/commands/blpop

blpop key1 key2 key3 timeout
  • 可以指定多个 key, 处理顺序从前到后, 因此可以做 优先级队列, 排在前面的 key 有内容的话, 即处理签名的 key
  • 可以指定超时时间, 超过超时
    • redis-cli 中是, nil
    • ioredis 中是 null, 没有 error
  • 返回值
    • redis-cli:

      127.0.0.1:6379> BLPOP queue1 5
      1) "queue1"
      2) "hello"
      
    • ioredis: results = [key, val]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant