Redis高可用——API的理解和使用

2017-08-27 22:28:40 字数 5182 阅读 653 评论 0

1. Redis特性

1.1. 速度快

  • 可以达到10w OPS
  • 数据存在在内存
  • C语言实现
  • 单线程

1.2. 持久化(断电不丢数据)

  • 所有数据保存在内存中,对数据的更新将异步地存储到磁盘上

1.3. 丰富的数据结构

  • Strings/Blobs/Bitmaps/HyperLogLog/GEO
  • Hash Tables (objects!)
  • Linked Lists
  • Sets
  • Sorted Sets

1.4. 支持多种编程语言

1.5. 功能丰富

  • 发布订阅
  • Lua脚本
  • 事务
  • pipeline

1.6. 简单

1.7. 主从复制

1.8. 高可用、分布式

2. API理解和使用

2.1 通用命令

命令 演示 说明 时间复杂度
keys [pattern] keys * 遍历所有key,生成环境一般不使用 O(n)
dbsize dbsize 计算key的总数,时间复杂度 O(1)
exists key exists name 检查key是否存在 O(1)
del key del name 删除指定键值 O(1)
expire key seconds expire name 3 key 在seconds秒后过期 O(1)
ttl key ttl name 查看key剩余过期时间 O(1)
pesist key pesist key 去掉key的剩余过期时间,永不过期 O(1)
type key type key 返回key的类型 O(1)

2.2 数据结构和内部编码

2.3 单线程

  • 出内存
  • 非阻塞IO
  • 避免了线程切换和竞态消耗 注意:
  1. 一次只执行一条命令
  2. 拒绝长(慢)命令

keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)

3. 字符串类型

3.1 场景

  • 缓存(缓存视频的基础信息)
  • 计数器(文章访问量 incr)
  • 分布式锁
  • 其它

3.2 常用命令

3.2.1 get set del

命令 示例 说明 时间复杂度
get key get name 获取key对应的value O(1)
set key value set name alan 设置key-value O(1)
del key del name 删除key-value O(1)

3.2.2 incr decr incrby decrby

命令 示例 说明 时间复杂度
incr key incr id key自增1,如果key不存在,自增后get(key)=1 O(1)
decr key decr id key自减1,如果key不存在,自减后get(key)=-1 O(1)
incrby key increment incrby id 5 key自增5,如果key不存在,自增后get(key)=5 O(1)
decrby key increment decrby id 5 key自减5,如果key不存在,自减后get(key)=-5 O(1)

3.2.3 set setnx set xx

命令 示例 说明 时间复杂度
set key value set key value 不管key是否存在,都设置 O(1)
setnx key value setnx key value key不存在才设置(create) O(1)
set key value xx set key value xx key存在才设置(update) O(1)

3.2.4 mget mset

命令 示例 说明 时间复杂度
mget key1 key2 key3 mget key1 key2 key3 批量获取key对应的value O(n)
mset key1 value1 key2 value2 mset key1 value1 key2 value2 批量设置key-value O(n)

注:n次get指令=n次网络时间+n次get命令时间,所以使用批量命令可以节约网络时间

3.2.5 getset append strlen

命令 示例 说明 时间复杂度
getset key newvalue getset key newvalue set key newvalue,返回旧值 O(1)
append key value append key value 将value追加到旧的value O(1)
strlen key strlen name 返回value长度,注意中文 O(1)

3.2.6 incrbyfloat getrange setrange

命令 示例 说明 时间复杂度
incrbyfloat key increment incrbyfloat key 0.5 浮点自增0.5 O(1)
getrange key start end getrange key 0 10 获取字符串指定下标所有值(下标从0开始计算) O(1)
setrange key index value setrange key 5 hello 获取字符串指定下标对应的值 O(1)

4. 哈希

4.1 命令特点

hash命令大多数与string命令一直,只不过都是加了个h的前缀,比如hset hget hgetall

String与Hash相似的API

字符串 哈希
get hget
set setnx hset hsetnx
del hdel
incr incrby decr decrby hincr hincrbyfloat
mset hmset
mget hmget

4.2 String VS Hash

  • 哈希优点:编程较复杂
  • 哈希缺点:ttl不好控制

4.3时间复杂度

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

5. 列表

5.1 特点

  • 有序
  • 可以重复
  • 左右两边插入弹出

5.2 list命令

命令 示例 说明 时间复杂度
rpush key value1 value2 value3 rpush key value1 value2 value3 从列表右边插入值 O(1~n)
lpush key value1 value2 value3 lpush key value1 value2 value3 从列表左边插入值 O(1~n)
linsert key before/after value newvalue linsert key before/after value newvalue 在列表指定值的前或后插入newvalue O(n)
rpop key rpop key 从列表右边弹出一个元素 O(1)
lpop key lpop key 从列表左边弹出一个元素 O(1)
brpop key timeout brpop key 5 timeout=0永远不阻塞,从列表右边弹出一个元素 O(1)
blpop key timeout blpop key 5 timeout=0永远不阻塞,从列表左边弹出一个元素 O(1)
lerm key count value Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
O(n)
ltrim key start end ltrim key 1 4 按照索引范围截取列表 O(n)
lrange key start end lrange key 1 4 获取列表指定索引范围的item O(n)
lindex key index lindex key 4 获取列表指定索引的item O(n)
llen key llen key 获取列表长度 O(n)
lset key index newvalue lset key index newvalue 设置列表指定索引值为newValue O(n)

5.3 tips

LRPUPH+LPOP=Stack

LPUSH+RPOP=Queue

LPUSH+LTRIM=Capped Collection

LPUSH+BRPOP=Message Queue

6. 集合

6.1 特点

  • 无序
  • 无重复
  • 支持集合间操作

6.2 sadd srem

命令 说明
sadd key element 向集合中添加元素,如果元素已存在,添加失败
srem key element 从集合中移除元素

6.3 scard sismmber srandmember smembers

命令 时间复杂度
scard key 计算集合大小
sismmber key memeber member是否在集合中
srandmember key count 随机取出count个元素,不会破坏集合
spop key 随机弹出一个元素,会破坏集合
smembers key 取出集合中所有元素,小心使用

6.4 场景

  • 抽奖
  • 点赞 踩
  • 添加标签

6.5 集合间操作 sdiff sinter sunion

命令 说明
sdiff key1 key2 差集
sinter key1 key2 交集
sunion key1 key2 并集
sdiff/sinter/sunion key1 key2 store key3 将差集/交集/并集 保存到key3

6.6 Tips

SADD = Tagging SPOP/SRANDMEMBER = Random item SADD + SINTER = Social Graph

7. 有序集合

7.1 集合VS有序集合

集合 有序集合
无重复元素 无重复元素
无序 有序
element score+element

7.2 列表VS有序集合

集合 有序集合
可以有重复元素 无重复元素
有序 有序
element score+element

7.3 zadd zrem

命令 说明 时间复杂度
zadd key score element 增加元素,可以是多对 O(logN)
zrem key element 删除元素,可以是多个 O(1)

7.4 zsocre zincrby zcard

命令 说明 时间复杂度
zsocre key element 返回元素分数 O(1)
zincrby key incrScore element 添加或减少元素分数 O(1)
zcard key 返回元素总个数 O(1)

7.5 zrange

命令 说明 时间复杂度
zrange key start end [WITHSCORE] 返回指定索引范围内的升序元素[分值] O(log(n)+m)
zrangebyscore key minscore maxscore [WITHSCORE] 返回指定分数范围内的升序元素[分值] O(log(n)+m)
zcount key minscore maxscore返回指定分数范围内的元素个数 O(log(n)+m)
zremrangebyrank key start end 删除指定排名范围内的升序元素 O(log(n)+m)
zremrangebyscore key start end 删除指定分支范围内的升序元素 O(log(n)+m)

7.6 场景

  • 排行榜
标签: Redis

评论(0)

请先登陆,参与评论。

    聚合标签