简介
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 * 获取所有配置项
- 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 个更改
- save 900 1
- 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
- 表示每秒同步一次(折中,默认值)
- no
- 指定更新日志条件,共 3 个可选值
- 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 实例间共享一份配置文件,而同时每个实例又拥有自己的特定配置文件
- daemonize no
数据类型
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
- PFADD key element [element…]
发布订阅(Pub/Sub)
- 一种消息通信模式,发布者发送消息,订阅者接收消息(也是一种消息队列,但和专业的 mq 比起来,又缺少一些功能,比如 ttr)
- redis 客户端可以订阅任意数量的频道
- 命令
- PSUBSCRIBE pattern [pattern…]
- 订阅一个或多个符合给定模式的频道
- PUBSUB subcommand [argument…]
- 查看订阅与发布系统状态
- PUBLISH channel message
- 将信息发送到指定的频道
- PUNSUBSCRIBE [pattern…]
- 退订所有给定模式的频道
- SUBSCRIBE channel…
- 订阅给定的一个或多个频道的信息
- UNSUBSCRIBE channel…
- 退订给定的频道
- PSUBSCRIBE pattern [pattern…]
事务
- 三个重要保证
- “批量操作”在发送 exec 命令前被放入队列缓存
- 收到 exec 命令后进入事务执行,事务中任意命令执行失败,其余命令依然被执行
- 事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令序列中
- 三个阶段
- 开始事务
- 命令入队
- 执行事务
- 单个 redis 命令的执行是原子性的,但 redis 没有在事务上增加任何原子性机制,所以 redis 事务执行并不是原子性的
- redis 的事务可以理解为一个打包的批处理脚本,批处理并非原子化操作,不存在回滚概念
- 命令
- DISCARD
- 取消事务,放弃执行事务块内所有命令
- EXEC
- 执行事务块内的命令
- UNWATCH
- 取消 WATCH 命令对所有 key 的监视
- WATCH key…
- 监视一个或多个 key,如果事务执行之前,这些 key 被其他命令改动,则事务将被打断
- MULTI
- 开始一个事务
- DISCARD
连接命令
- 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