Redis.png

简介

k-v 缓存

支持持久化

支持 list、set、zset、hash 等数据结构

支持 master-slave 形式的数据备份

优势

  • 性能极高,每秒 110000 次读, 81000 次写
  • 丰富的数据类型
  • 支持原子性
  • 丰富的特性,如 publish/subscribe、通知、key过期等

默认端口 6379

配置

  • 一般在安装目录下的 redis.conf,如果是 windows,则为 redis.windows.conf
  • Config 命令格式
    • CONFIG GET
    • CONFIG GET * 获取所有配置项
  • 可以通过修改 redis.conf 来修改配置,也可以使用 CONFIG SET 命令:CONFIG SET name value
  • 常用配置
    • daemonize no
      • redis 默认不是以守护进程的方式运行的,可以通过修改此选项为 yes ,启用为守护进程
    • pidfile /var/run/redis.pid
      • 当 redis 以守护进程方式运行时,redis 默认会把 pid 写入 /var/run/redis.pid 文件,修改此选项,可以将 pid 写入的目标文件更换掉
    • port 6379
      • 默认监听端口为 6379
    • bind 127.0.0.1
      • 绑定的主机地址
    • timeout 300
      • 当客户端闲置超过此配置的时间后,关闭连接,如果设定为 0 ,则关闭此功能
    • loglevel notice
      • 指定日志记录级别,redis 总共支持四个级别,debug、verbose、notice、warning,默认为 notice
    • logfile stdout
      • 日志记录方式,默认为标准输出,如果配置 redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则会将日志发送给 /dev/null
    • database 16
      • 设置数据库数量,默认数据库为 0,16 指从数据库编号从 0 到 16,可以用 select 命令在连接上指定数据库 id
    • save
      • 指定在多场时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
      • redis 默认配置文件中提供了三个条件
        • save 900 1
          • 900秒内有一个更改
        • save 300 10
          • 300 秒内有 10 个更改
        • save 60 10000
          • 60 秒内有 10000 个更改
    • rdbcompression yes
      • 指定存储至本地数据库时是否压缩数据,默认为 yes,redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭此选项,但会导致数据库文件变大
    • dbfilename dump.rdb
      • 指定本地数据库文件名,默认为 dump.rdb
    • dir ./
      • 指定本地数据库存放目录
    • slaveof
      • 设置本地为 slave 服务时,设置 master 服务的 ip 及端口,在 redis 启动时,它会自动从 master 进行数据同步
    • requirepass foobared
      • 设置 redis 连接密码,如果配置了连接密码,客户端在连接 redis 时,想要通过 Auth 命令提供密码,默认此功能关闭
    • maxclients 128
      • 设置同一时间最大客户端连接数,默认无限制,redis 可以同时打开客户端连接数为 redis 进程可以打开的最大文件描述符数,如果设置为 0 ,表示不限制,当客户端连接数达到限制时,redis 会关闭新的连接并向客户端返回 max number of clients reached
    • maxmemory
      • 指定最大内存限制,redis 在启动时会把数据加载到内存中,达到最大内存后,redis 会先尝试清除已到期或即将到期的 key,如果尝试后仍达到最大内存限制,将无法再执行写入操作,但仍可以读取,redis 新的 vm 机制,会把 key 存放内存中,value 存放在 swap 区
    • appendonly no
      • 指定是否在每次更新操作后进行日志记录,默认为 no ;redis 默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失,因为 redis 本身同步数据文件时按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中
    • appendfilename appendonly.aof
      • 指定更新日志文件名,默认为 appendonly.aof
    • appendfsync everysec
      • 指定更新日志条件,共 3 个可选值
        • no
          • 表示等操作系统进行数据缓存同步到磁盘(快)
        • always
          • 表示每次更新操作后手动调用 fsync() 将数据斜倒磁盘(慢,安全)
        • everysec
          • 表示每秒同步一次(折中,默认值)
    • vm-enabled no
      • 指定是否启用虚拟内存机制,默认值为 no
      • vm 机制将数据分页存放,由 redis 将访问量较少的页(冷数据)swap 到磁盘上,访问多的页面由磁盘自动换出到内存中
    • vm-swap-file /tmp/redis.swap
      • 虚拟内存文件路径,不可多个 redis 实例共享
    • vm-max-memory 0
      • 将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所有索引数据都是内存存储的(索引数据就是指 key),也就是说,当 vm-max-memory 设置为 0 的时候,其实所有 value 都存储在磁盘中,默认值为 0
    • vm-page-size 32
      • redis swap 文件分成了很多 page,一个对象可以保存在多个 page 上面,但一个 page 不能被多个对象共享,此配置时要根据存储的数据大小来设定的,如果只是存储较小的对象,page 大小最好设置为 32 或 64 bytes;但如果存储很大的对象,则可以使用更大的 page,如果不确定,就使用默认值
    • vm-pages 1342177288
      • 设置 swap 文件中最大的 page 数量,由于页表(一个 bitmap,类似于页目录)存放在内存中,在磁盘上每 8 个 pages 将消耗 1 byte 内存
    • vm-max-threads 4
      • 设置访问 swap 文件的线程数,最好不要超过极其的核数,如果设置为 0,则所有对 swap 文件的操作都是串行的,可能会造成较长时间的延迟,默认值为 4
    • glueoutputbuf yes
      • 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
    • hash-max-zipmap-entries 64
      hash-max-zipmap-value 512
      • 指定在超过一定数量或者最大元素超过某一临界时,采用一种特殊的 hash 算法
    • activerehashing yes
      • 指定是否激活重置 hash,默认开启
    • include /path/to/local.conf
      • 指定包含其它配置文件,可以在同一主机上多个 redis 实例间共享一份配置文件,而同时每个实例又拥有自己的特定配置文件

数据类型

string

  • 最基本的数据类型
  • 它是二进制安全的,可以包含任何数据,如 jpg 图片、序列化的对象
  • 最大能存储 512 M

hash

  • 一个键值对的集合
  • 是 sting 类型的 k-v 映射表,特别适用于存储对象
  • 每个 hash 可以存储 2^32 -1 个键值对(40+亿)

list

  • 简单的字符串列表,按照插入顺序排序
  • 每个 list 最多可存储 2^32 -1 个元素

set

  • string 类型的无序集合
  • 集合是通过 hash 表实现的,所以添加、删除、查找的复杂度都是 O(1)
  • set 的值具备唯一性,重复插入会被忽略
  • 每个 set 最多可存储 2^32 -1 个元素

zset(sorted set)

  • 基本同 set,但 zset 插入元素时还需要加入一个 score(double类型),用于对集合中成员进行从小到大排序
  • 成员具备唯一性,但分数可以重复,分数相同,则按字典序排序

list、set、zset 区分

  • list 是有序列表,按插入顺序排序,主要是可以用作消息队列
  • set 是无需集合,优势在于操作复杂度为 O(1),并且 set 有求交集、差集的命令
  • zset 可以通过指定 score 来自定义集合成员的顺序

命令

redis-cli -h host -p port -a password

Key

  • 键命令用于管理 redis 下的键
  • DEL key
    • key 存在时删除 key
  • DUMP key
    • 序列化给定的 key,并返回序列化的值
  • EXISTS key
    • 检查给定的 key 是否存在
  • EXPIRE key seconds
    • 给 key 设定过期时间,单位秒
  • EXPIREAT key timestamp
    • 设置过期时间,但接收 unix 时间戳,到了该时间点过期
  • PEXPIRE key milliseconds
    • 设定 n 毫秒之后过期
  • PEXPIREAT key milliseconds-timestamp
    • 设定在某个时间点过期,接收毫秒级 unix 时间戳
  • KEYS pattern
    • 查找所有符合给定 pattern 表达式的 key
  • MOVEL key db
    • 将当前数据库的 key 移动到给定的数据库中
  • PERSIST key
    • 移除 key 的过期时间,key 将持久保持
  • PTTL key
    • 以毫秒为单位返回 key 剩下的过期时间(还有多少毫秒过期)
  • TTL key
    • 以秒为单位,返回给定的 key 剩余生存时间,ttl:time to live
  • RANDOMKEY
    • 随即从当前 redis 中返回一个 key
  • RENAME key newkey
    • 重命名 key
  • TYPE key
    • 返回 key 所储存的类型

String

  • 相关操作 string 的命令
  • SET key value
    • 设定指定 key 的值
  • GET key
    • 获取指定 key 的值
  • GETRANGE key start end
    • 返回 key 中字符串值的子字符串
  • GETSET key value
    • 更新 key 的值,并返回 key 的旧值
  • GETBIT key offset
    • 对 key 所存储的 bitmap,获取指定偏移量上的位
  • SETBIT key offset value
    • 对 key 所存储的 bitmap,设置指定偏移量上的 bit
  • MGET key1 [key2…]
    • 获取多个 key 的值
  • SETEX key seconds value
    • 将值 value 关联到 key,并将 key 的过期时间设置为 seconds 所指定的秒数
  • SETNX key value
    • 只有在 key 不存在时设置 key 值
  • SETRANGE key offset value
    • 用 value 参数覆盖写给指定 key 所存储的字符串值,从偏移量 offset 开始
  • STRLEN key
    • 返回 key 所存储的字符串值的长度
  • MSET key value key value
    • 同时设置一个或多个 k-v
  • MSETNX key value key value
    • 同时设置一个或多个 k-v,当且仅当所有给定的 key 都不存在
  • PSETEX key milliseconds value
    • 这个命令和 SETEX 相似,只是把秒换成了毫秒
  • INCR key
    • 将 key 中储存的数字值 +1
  • INCRBY key increment
    • 将 key 中储存的数字值 + 给定的数字
  • INCRBYFLOAT key increment
    • 将 key 中存储的值加上给定的浮点增量
  • DECR key
    • key 的数字值 -1
  • DECRBY key decrement
    • key 的数字值 -n
  • APPEND key value
    • 如果 key 已经存在,并且是一个字符串,append 将指定的 value 追加到其末尾

Hash

  • HDEL key field1 [field2…]
    • 删除 key 下的几个字段
  • HEXISTS key field
    • 检查 key 中是否存在该字段
  • HGET key field
    • 获取 key 中该字段
  • HGETALL key
    • 获取 key 下所有字段和值
  • HINCRBY key field increment
    • 给 key 下该字段 +n
  • HINCRBYFLOAT key field increment
    • 给 key 下该字段 +n,n 为浮点型
  • HKEYS key
    • 获取 key 下所有字段,不带值
  • HLEN key
    • 获取 key 下字段数量
  • HMGET key field1 [field2…]
    • 批量获取 key 下的字段
  • HMSET key field1 value1 [field2 value2…]
    • 同时将多个字段及值加入到 key 中
  • HSET key field value
    • 为 key 下新增字段
  • HSETNX key field value
    • 只有字段 field 不存在时,添加
  • HVALS key
    • 获取 key 下所有字段的值,不带字段
  • HSCAN key cursor [MATCH pattern] [COUNT count]
    • 迭代 key 中的键值对

List

  • BLPOP key1 [key2] timeout
    • 弹出并获取列表的第一个元素,如果列表没有元素,会阻塞,直到得到元素或超时为止
  • BRPOP key1 [key2…] timeout
    • 弹出并获取列表最后一个元素,如果没有,则阻塞,直到得到或超时为止
  • BRPOPLPUSH source destination timeout
    • 从列表右侧弹出一个值,将弹出的值查到另一个列表的左侧,并返回它,如果列表没有元素会阻塞,直到超时或得到为止
  • LINDEX key index
    • 通过索引获取列表中的元素
  • LINSERT key BEFORE|AFTER pivot value
    • 在列表的 n 元素前或后插入元素
  • LLEN key
    • 获取列表长度
  • LPOP
    • 弹出列表第一个元素,弹出后该元素消失
  • LPUSH key value1 [value2]
    • 将一个或多个值插入到列表头部
  • LPUSHX key value
    • 将一个值插入到已存在的列表头部
  • LRANGE key start stop
    • 获取列表指定范围内的元素
  • LREM key count value
    • 移除列表元素
  • LSET key index value
    • 为 key 的索引为 index 处设置 value
  • LTRIM key start stop
    • 对一个列表进行 trim ,就是说,让列表只保留指定区间内的元素,其它全被删除
  • RPOP key
    • 弹出列表最后一个元素
  • RPOPLPUSH source destination
    • 弹出最后一个元素,并将之出入到另一个列表,并返回
  • RPUSH key value1 [value2…]
    • 在列表尾部添加一个或多个值
  • RPUSHX key value
    • 为已存在的列表从尾部添加值

Set

  • SADD key member1 [member2…]
    • 向集合添加一个或多个成员
  • SCARD key
    • 获取集合成员数
  • SDIFF key1 [key2…]
    • 返回给定所有集合的差集
  • SDIFFSTORE destination key1 [key2…]
    • 返回给定所有集合的差集,并存储在新的集合中
  • SINTER key1 [key2…]
    • 返回给定所有集合的交集
  • SINTERSTORE destination key1 [key2…]
    • 返回给定所有集合的交集,并存储在新集合中
  • SISMEMBER key member
    • 判断 member 元素是否是 key 的成员
  • SMEMBERS key
    • 返回集合中的所有成员
  • SMOVE source destination member
    • 将 member 元素从 source 集合移动到 destination 集合
  • SPOP key
    • 移除并返回集合中的一个随机元素
  • SRANDMEMBER key [count]
    • 返回集合中一个或多个随机成员
  • SREM key member1 [member2…]
    • 移除集合中一个或多个成员
  • SUNION key [key2…]
    • 返回所有给定集合的并集
  • SUNIONSTORE destination key1 [key2…]
    • 返回所有给定集合的并集并存储到新集合中
  • SSCAN key cursor [MATCH pattern] [COUNT count]
    • 迭代集合中的元素

Zset

  • ZADD key score1 member1 [score2 member2…]
    • 向有序集合添加一个或多个成员,或者更新已存在成员的分数
  • ZCARD key
    • 获取有序集合的成员数
  • ZCOUNT key min max
    • 计算在有序集合中指定区间分数的成员数
  • ZINCRBY key increment member
    • 为指定成员的分数增加 n
  • ZINTERSTORE destination numkeys key1 [key2…]
    • 计算所有指定集合的交集,并将结果存储到新集合中
    • numkeys 是指参与计算的 key 的个数,需要提前指定
  • ZLEXCOUNT key min max
    • 计算指定区间内的成员数量
    • 与 ZCOUNT 不同,ZCOUNT 是指定分数区间,而此命令则是指定字符,如 a b c d 这个 zset,此命令是指定 min 为 [a ,max 为 c),而非分数;另外 zset 本身就有序;[] 代表开区间,() 代表闭区间
  • ZRANGE key start stop [WITHSCORES]
    • 通过索引区间返回有序集合指定区间内的成员
    • start 和 stop 指在有序集合中元素的下标,从 0 开始
  • ZRANGEBYLEX key min max [LIMIT offset count]
    • 通过字典区间返回有序集合的成员,即以字符作为 min 和 max,并做匹配
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
    • 通过分数返回该区间内的成员
  • ZRANK key member
    • 返回指定成员的索引
  • ZREM key member [member…]
    • 移除一或多个成员
  • ZREMRANGEBYLEX key min max
    • 按 LEX 形式删除匹配到该区间内的所有成员
  • ZREMRANGEBYRANK key start stop
    • 移除给定的排名区间内的所有成员
  • ZREMRANGEBYSCORE key min max
    • 移除给定分数区间内的所有成员
  • ZREVRANGEBYSCORE key max min [WITHSCORES]
    • 返回从高到低指定分数区间内的成员
  • ZREVRANK key member
    • 返回指定排名的成员,从大到小
  • ZSCORE key member
    • 返回成员的分数值
  • ZUNIONSTORE destination numberkeys key [key…]
    • 计算并集,并存储到新 zset 中
  • ZSCAN…
    • 迭代元素

HyperLogLog

  • 基数
    • 比如数据集 {1,3,5,7,5,7,8},基数集就是{1,3,5,7,8},基数为 5
    • 基数估计就是在误差可接受的范围内,快速计算基数
  • 用于做基数统计的算法,有点在于输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且很小
  • 每个 hyperLogLog 键只需要 12kb 内存,就可以计算接近 2^64 个不同元素的基数,这和计算基数时,元素越多耗费内存越多的集合形成鲜明对比
  • 但是 HyperLogLog 只会根据输入元素来计算基数,不会存储元素本身,所以无法像集合那样返回输入的各个元素
  • 命令
    • PFADD key element [element…]
      • 添加指定元素到 HyperLogLog 中
    • PFCOUNT key [key…]
      • 返回基数估算值
    • PFMERGE destkey sourcekey [sourcekey…]
      • 将多个 HLL 合并为一个 HLL

发布订阅(Pub/Sub)

  • 一种消息通信模式,发布者发送消息,订阅者接收消息(也是一种消息队列,但和专业的 mq 比起来,又缺少一些功能,比如 ttr)
  • redis 客户端可以订阅任意数量的频道
  • 命令
    • PSUBSCRIBE pattern [pattern…]
      • 订阅一个或多个符合给定模式的频道
    • PUBSUB subcommand [argument…]
      • 查看订阅与发布系统状态
    • PUBLISH channel message
      • 将信息发送到指定的频道
    • PUNSUBSCRIBE [pattern…]
      • 退订所有给定模式的频道
    • SUBSCRIBE channel…
      • 订阅给定的一个或多个频道的信息
    • UNSUBSCRIBE channel…
      • 退订给定的频道

事务

  • 三个重要保证
    • “批量操作”在发送 exec 命令前被放入队列缓存
    • 收到 exec 命令后进入事务执行,事务中任意命令执行失败,其余命令依然被执行
    • 事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令序列中
  • 三个阶段
    • 开始事务
    • 命令入队
    • 执行事务
  • 单个 redis 命令的执行是原子性的,但 redis 没有在事务上增加任何原子性机制,所以 redis 事务执行并不是原子性的
  • redis 的事务可以理解为一个打包的批处理脚本,批处理并非原子化操作,不存在回滚概念
  • 命令
    • DISCARD
      • 取消事务,放弃执行事务块内所有命令
    • EXEC
      • 执行事务块内的命令
    • UNWATCH
      • 取消 WATCH 命令对所有 key 的监视
    • WATCH key…
      • 监视一个或多个 key,如果事务执行之前,这些 key 被其他命令改动,则事务将被打断
    • MULTI
      • 开始一个事务

连接命令

  • AUTH password
    • 验证密码是否正确
  • ECHO mesasge
    • 打印字符串
  • PING
    • 查看服务是否运行
  • QUIT
    • 关闭当前连接
  • SELECT index
    • 切换到指定的数据库

高级

备份与恢复(持久化)

  • save 命令,创建当前数据库的备份
  • CONFIG GET dir 输出当前 redis 安装目录
  • 恢复只需要将备份的 rdb 移动到 redis 安装目录,再启动服务即可
  • 也可以用 gbsave 进行备份,该任务会在后台执行
  • RDB
    • 原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化
    • 启动效率高,但只能做到半持久化,且生成 rdb 文件时,如果数据量大,可能会影响到 redis 主进程停止服务几百毫秒
  • AOF
    • 原理是将Reids的操作日志以追加的方式写入文件
    • 采用 append 模式,写入过程中宕机,日志文件也不会被破坏,还可以用 redis-check-aof 工具处理一致性问题
    • 数据安全性比 rdb 高太多
    • 日志过大,会启用 rewrite 机制
    • 缺点
      • aof 文件比 rdb 大很多,启动效率和运行效率也比不上 rdb

管道技术

  • 一般客户端在未获得服务器反馈之前,都会阻塞等待,而 redis 的管道技术可以在服务端未响应时,客户端可以继续向服务器请求,并最终一次性读取所有服务端响应
  • 提升交互性能

分布式

  • 分割数据到多个 redis 实例的处理过程,每个实例只保存 key 的一个子集
  • 优势
    • 通过利用多台计算机内存的总和,允许我们构造更大的数据库
    • 通过多核和多态计算机,扩展计算能力
    • 通过多台计算机的网络适配器,扩展网络带宽
  • 不足
    • 涉及多个 key 的操作通常不被支持,比如两个 set 被映射到不同的 redis ,就无法对其计算交集
    • 涉及多个 key 的情况无法使用事务
    • 数据处理较为复杂,需要多个 rdb/aof 文件,并且从多个实例和主机备份持久化文件
    • 增加或删除容量也比较复杂,redis 集群大多数支持在运行时增加、删除节点的透明数据平衡能力,但类似客户端分区就很难利用起这项特性
  • 方式
    • 求余或范围
    • 一致性哈希环

XMind: ZEN - Trial Version