微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

redis 资料整理

目录

Redis简介

Redis5.0新特性

Redis 安装与调试

安装

Stream

键相关命令

查看键信息

查看键类型type

查看键过期时间 ttl

设置键信息

设置键过期时间expire

删除键过期时间persist

重命名键rename

修改键最后访问 touch

查找键

判断键是否存在 exists

查找符合模式的键 keys

遍历键

随机取键 randomkey

操作键

删除键

序列化/反序列化键

移动键move

键排序 sort

字符串相关命令

设置字符串

set命令

mset 命令

修改字符串

append命令

setrange 命令

计数器命令

字符串获取

get 命令

getset 命令

getrange 命令

strlen 命令

mget命令

散列表相关命令

设置命令

读取命令

hexists命令

hget/hmget 命令

Hkeys/hvals/hgetall 命令

hlen 命令

hscan 命令

删除命令

hdel 命令

自增命令

列表相关命令

栈和队列命令列表

push/pop 相关命令

push命令

pop 命令

阻塞 push/pop 类命令的实现

获取列表数据

获取单个元素 lindex

获取多个元素 lrange

获取列表长度 llen

操作列表

设置元素 lset

插入元素 linsert

删除元素 lrem

裁剪列表 ltrim

集合相关命令

添加成员sadd

删除成员 srem

获取成员 spop/srandmember

smembers命令

查找成员sismember

移动成员 smove

获取基数 scard

遍历成员 sscan

集合运算

交集 sinter

sinterstore命令

并集 sunion

差集 sdiff

有序集合相关命令

zadd命令

zrem命令

zcard 命令

zcount 命令

zincrby 命令

zrank 命令

zrevrank 命令

zscore 命令

zscan 命令

zrange 命令

zrevrange 命令

zrangebyscore 命令

zrevrangebyscore 命令

zrangebylex 命令

zlexcount命令

zremrangebyrank 命令

zremrangebyscore 命令

zremrangebylex 命令

zunionstore命令

zinterstore 命令

GEO 相关命令

geohash 算法

命令介绍

添加地理坐标geoadd

返回标准的 geohash 字符串 geohash

返回经纬度 geopos

计算坐标距离 geodist

查找坐标指定范围内其他坐标georadius

HyperLogLog 相关命令

HLL Redis 实现

添加基数pfadd

统计基数 pfcount

合并基数集 pfmerge

数据流相关命令

xadd命令

xrange 命令

xrevrange 命令

xdel 命令

xgroup 命令

xreadgroup 命令

xread 命令

xack 命令

xpending 命令

xclaim 命令

xinfo命令

xtrim 命令

xlen 命令

其他命令

事务

事务简介

事务命令的实现

发布-订阅命令实现

发布命令 publish

订阅命令subscribe

取消订阅命令unsubscribe

订阅指定模式渠道命令psubscribe

取消订阅指定渠道命令punsubscribe

查看订阅状态命令 pubsub

LUA脚本

持久化

RDB

AOF

AOF 文件写入

AOF 重写

主从复制

主从复制功能实现

哨兵和集群

哨兵

集群

集群简介

副本漂移

分片漂移


Redis简介

Redis5.0新特性

  • 新增 Streams 数据类型,这是 Redis5.0最重要的改进之一。可以把 Streams 当做消息队列。

  • 新的模块 API、定时器、集群及字典。

  • RDB 中持久化存储 LFU 和 LRU 的信息

  • 将集群管理功能完全用 C 语言集成到 redis-cli 中,Redis 3.x 和 Redis 4.x 的集群管理是通过 Ruby 脚本实现的。

  • 有序集合新增命令 ZPOPMIN/ZPOPMAX。

  • 改进 HyperLogLog 的实现。

  • 新增 Client Unblock 和 Client ID

  • 新增 LOLWUT 命令。

  • Redis 主从复制中的从不在称为 Slave,改成 Replicas。

  • Redis 5.0引入动态哈希,以平衡 cpu 的使用率和响应性能,可以通过配置文件进行配置。Redis 5.0认使用动态哈希。

  • Redis 核心代码进行了部分重构和优化。

Redis 安装与调试

安装

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar -zxvf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make
$ cd src
$ make install

至此,编译安装完成,生成的可执行文件在/usr/local/bin 目录中。

  • 其中redis-benchmark 是官方自带的 Redis 性能测试工具;

  • 当 AOF 文件或者 RDB 文件出现语法错误时,可以使用 redis-check-aof 或者 redis-check-rdb 修复;

  • redis-cli 是客户端命令行工具,可以通过命令 redis-cli -h {host} -p {port}连接到指定 Redis 服务其;

  • redis-sentinel 是 Redis 哨兵启动程序;

  • redis-server 是 Redis 服务端启动程序。

Stream

Stream 结构主要由消息、生产者、消费者、消费组4部分组成。

键相关命令

查看键信息

查看键类型type

type 命令用于查看 key 的类型,一般用于排查问题

格式:type key

查看键过期时间 ttl

ttl命令返回 key 剩余生存时间,单位秒。一般用于根据 key 生存时间进行业务逻辑判断处理等,也可以排插问题。类似命令还有 pttl 返回以毫秒为单位的生存时间。

格式:ttl key

设置键信息

设置键过期时间expire

expire 命令用于设置 key 的过期时间,一般情况下 redis 的 key 应该都有一个对应的过期时间。类似命令还有 expireat、pexpire、pexpireat,格式都一样,区别在于时间和单位。他们调用函数也是同一个,以 expire 为例。

格式:expire key seconds

删除键过期时间persist

persist 命令用于移除 key 的过期时间,如果有。有时候我们需要将临时 key 编程永久 key,那么可以使用 persist 命令处理。

格式:persist key

重命名键rename

rename命令将 key 重命名,使用频率较低。同样类似命令还有 renamenx,标识重命名后的 key 不存在时才能执行成功。

格式:rename key new_key

修改键最后访问 touch

touch 命令用于更新 key 的访问时间,避免被 lru 策略淘汰,使用频率较低。

格式:touch key [key ...]

查找键

exists 命令查询键是否存在,keys 命令查找符合模式的键,scan 命令遍历键,以及 randomkey 命令随机取键。

判断键是否存在 exists

exists 命令用于判断指定的 key 是否存在,并返回 key 存在的数量

格式:exists key1 key2 ... key_N

查找符合模式的键 keys

keys 命令匹配合适的 key 并一次性返回,如果匹配的键较多,则可能阻塞服务器,因此该命令一般禁止在线上使用。

格式:keys pattern

@H_502_451@遍历键

scan 命令可以遍历数据库中几乎所有的键,并且不用担心阻塞服务器。使用频率低

格式:scan cursor [MATCH pattern] [COUNT count]

随机取键 randomkey

rendomkey 命令随机返回数据库中的 key

操作键

del 是比较常用的删除键命令,unlink 是 Redis 4.0为了弥补 del 删除大值时阻塞服务器而加入的异步删除键命令。

删除

del 命令用于同步删除一个或多个 key,因为池同步删除,所以在删除大 key 时可能会阻塞服务器。以阻塞方式删除 key

格式:del key [key ...]

unlink 命令以异步方式删除 key,这可以避免 del 删除大 key 的问题,unlink 在删除时会判断删除所需的工作量,以此决定使用同步还是异步删除(另一个线程中进行内存回收,不会阻塞当前线程),通常建议使用 unlink 代替 del 命令,但注意使用 unlink 命令需 Redis 版本在4.0及以上。

格式:unlink key [key ...]

说明:根据删除 key 需要的工作量来选择以阻塞或非阻塞方式删除 key。

序列化/反序列化键

  • dump 命令

    该命令将指定 key 序列化,一般使用较少。

    格式:dump key

    说明:序列化 key 并返回序列化后的数据。

  • restore 命令

    该命令使用 dump 命令序列化后的数据进行反序列化,使用频率较低。

    格式:restore key ttl serialized-value [replace]

    说明:反序列化给定的序列化值,并与 key 关联。

移动键move

  • move命令

    move 命令将指定 key 移动到另一个数据库,该命令使用较少。 此命令不能工作在集群模式下。

    格式:move key db

  • migrate 命令

    migrate 命令将指定 key 迁移到另一个 redis 实例,一般用于运维迁移数据。

    格式:migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]

键排序 sort

sort 命令对列表,集合或有序集合中的元素进行排序,使用方法相对复杂。

字符串相关命令

设置字符串

set命令

set 命令用于将 key-value 设置到数据库。如果 key 已经设置,则 set 会用新值覆盖旧值,如果在设置时不指定 ex 或 px 参数,set 命令会清除原有超时格式。

格式:

set key value [NX] [XX] [EX <deconds>] [PX <milliseconds>]

参数:

  • NX:当数据库中 key 不存在时,可以将 key-value 添加数据库

  • XX:当数据库中 key存在时,可以将 key-value 设置到数据库,与 NX 参数互斥

  • EX:key 的超时秒数

  • PX:key 的超时毫秒数,与 EX参数互斥。

mset 命令

修改字符串

append命令

数据库已经有了 key,它的值为 value。当我们发现 value 值需要追加字符串却又不想直接用 set 命令覆盖原值时,可以用 append 命令来实现。将 value 值追加到原值的末尾,如果 key 不存在,此命令等同于 set key value命令。

格式:

append key value

setrange 命令

setrange 命令主要用于设置 value 的部分子串给,设置时将值从偏移量 offset 开始覆盖成 value 值。如果偏移值大于原值的长度,则偏移量之前的字符串由"\x00"填充。

格式:setrange key offset value

计数器命令

计数器命令主要包括 incr/decr、incrby/decrby 和 incrbyfloat 这5个相关命令,Redis 的计数器命令都是原子性的操作,因此并不会因为并发导致统计出错。

格式:

incr key

decr key

说明:将 key 存储的值加或减1

incrby key increment

decrby key decrement

说明:将 key 存储的值加或减指定值(increment//decrement)

字符串获取

get 命令

get 命令用于获取 key 的值,当 key 不存在时,返回 NULL,当 key 存在时,返回查找到的结果

getset 命令

getset 命令将指定 key 的值设为 value,并返回 key 的旧值。

格式:getset key value

getrange 命令

通过 get 命令可以完整的获取到字符串的值,但当我们只想获取字符串的部分子串时,通过 getrange 命令便可以实现。getrange 返回 key 的 value 值从 start 截取到 end 的子字符串。

格式:getrange key start end

strlen 命令

strlen 命令从数据库获取到 value,返回 value 字符串的长度。

格式:strlen key

mget命令

散列表相关命令

设置命令

3个命令可使用:hset、hmset 和 hsetnx。

格式:

hset key field value

hmset key field value [field value ...]

hsetnx key field value

读取命令

命令有如下5类:

  • hexists:判断 field 域是否存在。

  • hget/hmget:获取单个 field 对应的 value 以及获取批量 field 对应的 value。

  • hkeys/hvals/hgetall:获取全部的 field、value 或者 field-value 对

  • hlen:获取 field 的总个数

  • hscan:遍历 hscan。

hexists命令

hexists 命令用于查看某个 field 是否存在,可以用于标识某个操作之前是否已经执行过。

格式:hexists key field

hget/hmget 命令

hget/hmget 命令用于获取单个 field 或者多个 field 对应的 value 值

格式:

hget key field

hmget key field [field ...]

Hkeys/hvals/hgetall 命令

hkeys 可以获取某个 key 下的所有 field 信息;hvals 可以获取每个 field 对应的 value 信息;hgetall 可以获取所有的 field-value 对。

格式:

hkeys key

hvals key

hgetall key

hlen 命令

hlen 命令可以用于获取散列表中 field 的个数,主要用于数据统计

格式:hlen key

hscan 命令

hscan 命令用于遍历散列表中所有的 field-value 对,需要注意的是,hscan 命令是渐进式遍历(当底层存储为散列表是)。

格式:hscan key cursor [Match pattern] [COUNT count]

删除命令

hdel 命令

hdel 命令直接调用 ziplist 或者散列表的接口将数据删除

格式:hdel key field [field ...]

自增命令

当散列表 field-value 中的 field 为整数或者浮点型的数据时,有时需要对其中的 value 进行加减法操作,为此,Redis 提供了 hincrby、hincrbyfloat 两个命令。

格式:

hincrby key field increment

hincrbyfloat key field increment

列表相关命令

列表命令

命令名称命令格式命令简介
blpopblpop key [key ...] timeout从列表 key 头部弹出元素并返回客户端,当列表 key 为空时会阻塞客户端,可以通过 timeout 设置最大阻塞时间,单位为秒
brpopbrpop key [key ...] timeout与 blpop 类似,只是从列表 key 的尾部弹出元素
brpoplpushBrpoplpush source destination timeout从列表 source 尾部弹出元素并且插入列表 destination 头部,同时将该元素返回给客户端,当 source 列表为空时会阻塞客户端,timeout 用于设置最大阻塞时间,单位为秒
lindexlindex key index返回列表 key 中下标为 index 的元素
linsertlinsert key BEFORE/AFTER pivot value将值 value 插入到列表 key,且位于值 pivot 之前或之后
llenllen key返回列表 key 的长度
lpoplpop key从列表 key 头部弹出元素并返回给客户端,与 blpop 不同的是它不会阻塞客户端,当列表 key 为空时返回 null
lpushLpush key value [value ...]一个或多个值 value 插入到列表 key 的头部,当列表 key 不存在时会创建一个空的列表
lpushxlpushx key value将值 value 插入到列表key 头部,当列表 key 不存在时该命令什么都不做
lrangelrange key start stop返回列表 key 中指定区间内的元素,区间通过索引 start 和 stop 指定
lremlrem key count value移除列表中与参数 value 相等的元素;当 count 大于0,从表头开始向尾部搜索,最大删除 count 个元素;当 count 小于0;从尾部开始向表头搜索,最大删除 count 绝对值个元素;当 count 等于0,删除所有与 value 相等的元素
lsetlset key index value将列表 key 下标为 index的元素值设为 value
ltrimltrim key start stop一个列表进行修剪,即让列表只保留区间 start 与 stop 内元素,不在该区域内内的元素都将被删除
rpoprpop key从列表 key 尾部弹出元素返回给客户端,与 brpop 不同的是它不回阻塞客户端,当列表 key 为空时返回 null
rpoplpushrpoplpush source destination与 brpoplpush 命令类似,但是不回阻塞客户端
rpushrpush key value [value ...]一个多多个值value 插入到列表 key 的尾部
rpushxrpushx key value将值 value 插入到列表 key 的尾部,当列表 key 不存在时,该命令什么都不做

栈和队列命令列表

栈与队列是操作受限制的线性表,栈只允许在线性表的同一侧执行插入或删除操作,具有先进后出的特性;而队列只允许在一侧插入或另一侧删除,具有先进先出的特性。如:

命令类型左侧右侧左侧阻塞右侧阻塞左侧键必须存在右侧键必须存在
push 类lpushrpushlpushxrpushx
pop 类lpoprpopblpopbrpop

push/pop 相关命令

push命令

lpush 命令作用是在列表头部插入元素,并返回列表总长度。

格式:lpush key value [value ...]

pop 命令

rpop命令的作用是从列表尾部弹出元素,并返回给客户端。

格式:rpop key

阻塞 push/pop 类命令的实现

blpop是阻塞版本的 pop:即当列表对象不存在,会阻塞客户端,直到列表对象不为空或者阻塞时间超过 timeout 为止,timeout 为0标识阻塞时间无限长。

格式:blpop key [key ...] timeout

获取列表数据

获取单个元素 lindex

lindex 命令的作用是获取索引为 index 的元素。

格式:lindex key

获取多个元素 lrange

lrange 命令的作用是获取指定索引范围内的所有元素:0表示第一个元素,以此类推;-1表示最后一个元素,以此类推。

格式:lrange key start end

获取列表长度 llen

llen 命令的作用是获取列表长度(元素数目)。

格式:llen key

操作列表

设置元素 lset

lset命令的作用是设置指定索引位置的元素值。

格式:lset key index value

插入元素 linsert

linsert 命令的作用是将值 value 插入到列表 key,且位于值 pivot 之前或之后。

格式:linsert key before|after pivot value

删除元素 lrem

lrem 命令的作用是移除列表中与参数 value 相等的元素,并返回被移除的元素数目。当 count 大于0时,从表头开始向表尾搜索,最大删除 count 个元素;当 count 小于0时,从表尾开始向表头搜索,最大删除count 绝对值个元素;当 count 等于0时,删除所有与 value 相等的元素。

格式:lrem key count value

裁剪列表 ltrim

ltrim 命令的作用是对一个列表进行裁剪,即让列表只保留区间 start 和 stop 内的元素,不在该区间内的元素都将被删除

格式:ltrim key start stop

集合相关命令

添加成员sadd

sadd 命令的作用是为集合添加新成员

格式:sadd key member [member ...]

删除成员 srem

srem 命令的作用是删除集合中的指定成员。

格式:srem key member [member ...]

获取成员 spop/srandmember

spop 与 srandmember 命令都会返回一个随机元素。不通之处在于,spop 会将该返回元素从集合中移除,而 srandmember 不回。

格式:

spop key [count]

说明:

删除并返回集合中的一或多个随机元素

smembers命令

smembers 命令返回集合 key 中的所有成员。不存在的 key 被视为空集合

格式:smembers key

查找成员sismember

查找成员的命令是 sismember,命令的作用是判断元素是否在指定集合中。

格式:sismember key member

说明:判断 member 元素是否是集合 key 的成员,如果是返回1,否则返回0。

移动成员 smove

smove 命令的作用是移动元素至指定集合

格式:smove souce destination member

说明:将 member 元素从 source 集合移动到 destination

获取基数 scard

scard命令的作用是获取集合中的元素数量(集合基数)

格式:scard key

遍历成员 sscan

sscan命令用于增量遍历集合元素。

格式:sscan cursor [match pattern] [count count]

集合运算

交集 sinter

sinter 命令的作用是求多集合的交集

格式:sinter key [key ...]

sinterstore命令

sinterstore命令与 sinter 命令类试,不同之处在于它将结果保存至指定集合,而不是简单返回。

格式:sinterstore destination key [key ...]

并集 sunion

sunion 命令的作用是求多集合的并集

格式:sunion key [key ...]

差集 sdiff

sdiff 命令的作用是求集合间的差集

格式:sdiff key [key ...]

有序集合相关命令

zadd命令

格式:zadd key [NX|XX] [CH] [INCR] score member [score member ...]

说明:将一个或多个 member 元素及其分值 score 加入到有序集合对应的 key 当中。

  • XX:只更新已经存在的元素,不添加元素。

  • NX:不更新已经存在的元素,总是添加新的元素。

  • CH:将返回值从添加的新元素数量修改为更改的元素总数。

  • INCR:当指定此选项时,zadd 的行为与 zincrby 类似。

zrem命令

删除有序集合 key 中的一个或多个 member

格式:zrem key member [member ...]

zcard 命令

获取有序集合中的基数

格式:zcard key

zcount 命令

返回有序集合 key 中值在[min, max]区间的成员的数量

格式:zcount key min max

zincrby 命令

在有序集合 key 的 member 的分值上增加 increment

格式:zincrby key increment member

zrank 命令

按照分值从小到大返回有序集合成员 member 的排名,其中排名从0开始计算。

格式:zrank key member

zrevrank 命令

跟 zrank 类似,唯一区别是按照从大到小返回 member 的排名

格式:zrevrank key member

zscore 命令

获取有序集合 key 中成员 member 的分值,返回值为字符串。

格式:zscore key member

zscan 命令

迭代有序集合中的元素成员和分值,其中 cursor 是游标,MATCH中可以通过正则来匹配元素,count 是返回的元素数量

格式:zscan key cursor [MATCH pattern] [COUNT count]

zrange 命令

获取有序集合 key 中指定的区间的成员,成员按照分值递增排序,如果分值相同,成员按照字典序排序。

格式:zrange key start stop [WITHscoreS]

zrevrange 命令

跟 zrange 相反,获取有序集合 key 中指定区间的成员,成员按照分值递减排序。

格式:zrevrange key start stop [WITHscoreS]

zrangebyscore 命令

返回有序集 key 中,所有 score 值介于 min 和 max 之间(包含 min 和 max)的成员。有续集成员按照 score 值递增。

格式:zrangebyscore key min max [WITHscoreS] [LIMIT offset count]

zrevrangebyscore 命令

除了有序集合按照 score 值递减外,跟 zrangebyscore 完全一样

格式:zrevrangebyscore key max min [WITHscoreS] [LIMIT offset count]

zrangebylex 命令

返回给定的有序集合键 key 中值介于 min 和 max 之前的成员。

格式:zrangebylex key min max [LIMIT offset count]

zlexcount命令

返回给定的有序集合键 key 中值介于 min 和 max 之前的成员数量

格式:zlexcount key min max

zremrangebyrank 命令

移除有序集 key 中指定排名区间内的所有成员

格式:zremrangebyrank key start stop

@H_404_1221@zremrangebyscore 命令

移除有序集 key 中所有 score 值介于【min,max】区间的成员

格式:zremrangebyscore key min max

zremrangebylex 命令

移除该集合中成员介于 min 和 max 范围内(字典序)的所有元素

格式:zremrangebylex key min max

zunionstore命令

计算给定的一个或多个(数量由 numkeys 指定)有序集的并集,将结果存储到 destination 中。结果集中某个成员的 score认是所有给定集下改成元 score 值之和。

格式:

zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

zinterstore 命令

跟 zunionstore 类似,唯一区别是本命令用来求交集。

格式:

Zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

GEO 相关命令

geohash 算法可以把二维的经纬度信息降维到一维,并通过 Base32编码将其转换为字符串。

geohash 算法

命令介绍

添加地理坐标geoadd

格式:geoadd 键名称 经度 纬度 成员名称[经度 纬度 成员名称 ...]

返回标准的 geohash 字符串 geohash

格式:geohash 键名称 成员名称 [成员名称 ...]

返回经纬度 geopos

格式:geopos 键名称 成员名称 [成员名称 ...]

计算坐标距离 geodist

格式:geodist 键名称 成员名称1 成员名称2 [单位]

查找坐标指定范围内其他坐标georadius

格式:

georadius 键名称经度纬度 半径米|千米 [WITHCOORD] [WITHdisT] [WITHHASH] [COUNT 个数] [ASC|DESC] [STORE 键名称] [STOREdisT 键名称]

说明:store,通过返回的坐标创建新的 zset,score 值为 geohash-int;storedist,通过返回的坐标创建新的 zset,score 值为距离。

HyperLogLog 相关命令

在工作当中,经常会遇到与统计相关的功能需求,比如统计网站 PV或者 URl 访问次数

HLL Redis 实现

hyperloglog 非常出色,因为即使使用非常少量的内存,它也能很好的趋近集合的基数。在 Redis 实现中,每个 HyperLoglog(密集存储)只需要12KB 字节内存,标准误差控制在0.81%,并且计算的项目数量上限为2的64次方。

HLL 有3个命令 pfadd、pfcount、pfmerge,分别用来添加基数元素、统计基数、合并基数集。

添加基数pfadd

pfadd命令用来将一个或多个元素添加到指定的 HLL 中,需要注意的是 Redis 不保存元素本身,而是将元素进行散列处理后,找到对应的分组并比较计算值,如果大于旧值则更新,反之不更新。

格式:pfadd key element [element ...]

说明:将所有元素添加到指定的 HyperLogLog 数据结构中。如果在执行命令后 HyperLogLog 估计的近似基数发生变化,则返回1,否则返回0.如果指定的密钥不存在,该命令会自动创建一个空的 HyperLogLog 结构并执行添加操作。不指定 element 的情况下,如果 key 不存在则创建新的 HLL 结构并返回1,否则什么也不做并返回0。

统计基数 pfcount

pfcount 命令用于计算指定 HLL 的近似基数,它可以计算多个 HLL,比如使用 HLL 存储每天的 UV,那么计算一周的 UV 可使用7天的 UV 合并计算即可。

格式:pfcount key [key ...]

合并基数集 pfmerge

pfmerge 命令将一个或多个 HLL 合并后的结果存储在另一个 HLL 中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得。

格式:pfmerge destkey sourcekey [sourcekey ...]

数据流相关命令

xadd命令

xadd命令的作用是将指定消息数据追加到指定的 stream 队列中或裁剪队列中数据长度。

格式:

xadd key [MAXLEN [~|=] <COUNT>] <ID OR *> [field value] [field value] ...

说明:每条消息由一个或多个阀值对象组成,消息插入 Stream 队列中后会返回唯一的消息 ID。xadd 是唯一可以向 Stream 队列中添加数据的命令。

  1. MAXLEN:当 Stream 中数据量过大时,可以通过此关键字来裁剪长度,删除 stream 中旧数据至指定的值;当数据量小于等于指定值,不尽兴剪切。其中裁剪模式有两种。

    • ~:模糊裁剪,优化精确裁剪,一般用此模式效率更高。

    • =:精确裁剪。

xrange 命令

xrange 命令用于读取给定 ID 范围内的消息数据,并可以设置返回数据的条数。

格式:xrange key start end [COUNT count]

  • 范围起始值分别有 start 和 end 字段指定,将返回两个 id 之间(闭区间)的所有消息,消息排序为 id 递增排序

  • Start:开始消息 id,指定具体值或通过"-"特殊符号来表示最小 id

  • end:结束消息 id,指定具体值或通过"+"特殊符号来表示最大id

xrevrange 命令

xrevrange 命令与 xrange 用法完全一致,唯一区别是返回数据的顺序为消息 ID 的递减序,正好与 xrange 返回的数据顺序相反。

xdel 命令

xdel 命令用于删除 stream 队列中指定的一个或多个消息 id 对应的数据。

格式:xdel key id [id ...]

xgroup 命令

xgroup命令用于队列的消息组管理,包含对消息组的创建、删除修改等操作。

格式:

xgroup [CREATE key groupname id-or-$]

[SETID key id-or-$]

[DESTROY key groupname]

[DELCONSUMER key groupname consumername]

[HELP]

xreadgroup 命令

xreadgroup 命令用于从消费组中可靠性地消费 n 条消息,如果指定的消费者不存在,则创建之。

xread 命令

xread命令用于从 stream 队列中读取 n 条消息,一般用作遍历队列中的消息。

xack 命令

xack 命令用于确认一个或多个指定 ID 的消息,使其从待确认列表中删除

xpending 命令

xpending 命令用于读取某消费组或者某个消费者的未确认信息,返回未确认的消息 ID、空闲时间、被读取的次数

xclaim 命令

xclaim命令用于改变一或多个未确认消息的所有权,新的所有者是在命令参数中指定。

xinfo命令

xinfo命令用于读取消息队列、消费组、消费者等信息

格式:xinfo [CONSUMERS key groupname]

[GROUPS key]

[STREAM key]

[HELP]

xtrim 命令

xtrim 命令的作用是缩减消息队列。

格式:xtrim key MAXLEN [~] count

xlen 命令

xlen 命令用于获取 stream 队列的数据长度

格式:xlen key ID [ID ...]

其他命令

事务

Redis 中的事务能够保证一批命令原子性的执行,既所有命令或者都执行或者都不执行。并且在事务执行过程中不会为任何其他命令提供服务。当 Redis 重新启动加载 AOF 文件时也会保证事务命令的完整性。

事务简介

由于需要保证事务原子性,Redis 中提供了 multi 和 exec 命令来显示开启与提交事务。开启事务之后,接着所有的命令会首先入队而不是直接执行,只有显示地提交事务之后该事务才会执行。

# 示例
> multi     //开启事务
> incr counter1 //counter1加1  命令入队
> incr counter2 //counter2加1  命令入队
> exec    //执行事务

放弃一个事务使用 discard 命令,例如上文示例,如果 exec 替换为 discard,即会放弃该事务。

另外,Redis 使用 watch 命令提供了一种乐观锁机制。watch 命令可以监听多个 key、只有当被监听的 key 未修改时,事务才会执行。当一个事务发送 exex 或者 discard 命令后,所有 watch 的 key 会自动 unwatch。

事务命令的实现

事务命令有 watch、unwatch、multi、exec 和 discard。watch 和 unwatch 实现了一种乐观锁机制,multi 用来显示地开启一个事务,exec 用来提交并执行事务,discard 用来放弃事务。

watch 与 unwatch 命令

  1. watch:监听指定的 key,只有当指定的 key 没有变化时该连接上的事务才会执行。返回值为 OK。

    格式:watch key [key ...]

  2. unwatch: 不在监听该连接上 watch 指定的所有 key。返回值为 OK。

    格式:unwatch

发布-订阅命令实现

Redis 的发布-订阅功能解耦了生产者和消费者,生产者可以向指定的 channel 发送消息而无需关心是否有消费者以及消费者是谁,而消费者订阅指定的 channel 之后可以接收发送给该 channel 的消息,也无需关心由谁发送。

发布命令 publish

发布命令 publish 的作用是向指定 channel 发送消息。

格式:publish channel message

返回值:整型数,收到消息的客户端个数。

订阅命令subscribe

订阅命令 subscribe 的作用是订阅指定的渠道。

格式:subscribe channel [channel ...]

返回值:数组,第一个元素固定为 subscribe,第二个元素为订阅的 channel,第三个元素为该客户端总共订阅的 channel 个数(包括模式订阅)。

取消订阅命令unsubscribe

取消订阅命令 unsubscribe 的作用是取消订阅某个渠道,如果不指定,则该客户端所有的订阅都会取消。

格式:unsubscribe [channel [channel ...]]

订阅指定模式渠道命令psubscribe

订阅指定模式渠道命令 psubscribe 的作用是订阅由指定模式表示的所有渠道,匹配该模式的所有渠道发送的消息都会被接收。

格式:psubscribe pattern [pattern ...]

  • pattern 字符:"?"代表一个字符;"*"代表多个字符;"[]"代表选取其中任意一个字符。

  • 返回值数组,第一项为固定的 psubscribe,第二项为订阅的 pattern,第三项为当前客户端订阅的所有 channel 和 pattern 个数。

取消订阅指定渠道命令punsubscribe

取消订阅指定渠道命令 punsubscribe 用于取消订阅指定的模式,如果没有指定,则取消所有该客户端订阅的模式。

格式:punsubscribe [pattern [pattern ...]]

查看订阅状态命令 pubsub

查看订阅状态命令 pubsub 用来查看所有发布订阅的相关状态。

格式:pubsub subcommand [argument [argument ...]]

LUA脚本

Redis 嵌入的 Lua 脚本功能非常强大,它不仅可以运行 Lua 代码,还能保证脚本以原子方式执行:在执行脚本时不会执行其他脚本或 Redis 命令。这种语义类似于 MULTI/EXEC,也就是说我们可以编写逻辑操作的 Lua 代码让 Redis 服务端执行,这解决了 Redis 命令执行间非原子性的问题。

持久化

Redis 有两种持久化方式:一种为 RDB方式,RDB 保存某一个时间节点之前的数据;另一种为 AOF 方式,AOF 保存的是 Redis 服务器端执行的每一条命令。

RDB

RDB 快照有两种触发方式,其一为通过配置参数,其二是通过在客户端指定 bgsave 命令显示触发一次 RDB 快照执行。

  • save 60 1000 //表示60s 内如果有1000个 key 发生变化,就会触发一次 RDB 快照的执行

  • bgsave

AOF

如果开启了 AOF,则每条命令执行完毕后都会同步写入aof_buf 中,aof_buf是个全局的 SDS 类型的缓冲区。

AOF 文件写入

AOF 持久化最终需要将缓冲区中的内容写入一个文件,写文件通过操作系统提供的 write 函数执行。但是 write 之后数据只是保存在 kernel 的缓冲区中,真正写入磁盘还需要调用 fsync 函数。fsync 是一个阻塞并且缓慢的操作,所以 Redis 通过 appendfsync 配置控制执行 fsync 的频次。具体有以下3中模式。

  • no:不执行 fsync,由操作系统负责数据的刷盘。数据安全性最低但 Redis 性能最高。

  • always:每执行一次写入就会执行一次 fsync。数据安全性最高但会导致 Redis 性能降低。

  • ererysec:每1秒执行一次 fsync 操作。属于折中方案,在数据安全性和性能之间达到一个平衡。

生产环境一般配置为 appendfsync ererysec,即每秒执行一次 fsync 操作。

AOF 重写

AOF 重写通过 fork 出一个子进程来执行,重写不会对原有文件进行任何修改和读取,子进程对所有数据库中所有的键各自生成一条相应的命令,最后将重写开始后父进程继续执行的命令进行回放,生成一个新的 AOF 文件

AOF 重写触发方式

AOF 重写有2种触发方式:一种为通过配置自动触发,一种为手动执行 bgrewriteaof 命令显示触发。

  • auto-aof-rewrite-percentage 100

  • auto-aof-rewrite-min-size 64mb

假设如上配置:当 aof 文件大于64mb 时,并且 AOF 文件当前大小比基准大小增长了100%时会触发一次 AOF 重写。

混合持久化

混合持久化指进行 AOF 重写时子进程将当前时间点的数据快照保存为 rdb 文件格式,而后将父进程累计命令保存为 AOF 格式。是否开启混合持久化由如下配置设置:

aof-use-rdb-preamble yes

主从复制

Redis 支持主从复制功能用户可以通过执行 slaveof 命令或者在配置文件中设置 slaveof 选项来开启复制功能

主从复制功能实现

主从复制功能主要特点:读写分离;数据容灾

哨兵和集群

哨兵是 Redis 的高可用方案,可以在 Redis Master 发生故障时自动选择一个 Redis Slaved切换为 Master,继续对外提供服务。集群提供数据自动分片到不同节点的功能,并且当部分节点失效后任然可以使用。

哨兵

哨兵是 Redis 的高可用机制,保证了 Redis 服务不出现单点故障。

哨兵启动后会先与配置文件中监控的 Master 建立两条连接,一条称为命令连接,另一条称为消息连接。哨兵就是通过如上两条连接发现其他哨兵和 Redis Slave 服务器,并且与每个 Redis Slave 也建立同样的两条连接。

哨兵可以直接使用 redis-server 命令启动,命令如下:

> redis-server /path/to/sentinel.conf --sentinel

集群

集群用来提供横向扩展能力,即当数据量增多之后,通过增加服务节点就可以扩展服务能力。背后理论思想是将数据通过某种算法分布到不同的服务节点,这样当节点越多,单台节点所需提供服务的数据就越少。

集群简介

Redis 将键空间分为了16384个 slot(槽),然后通过如下算法:

HASH_SLOT = CRC16(key) mod 16384

计算出每个 key 所属的 slot。客户端可以请求任意一个节点,每个节点中都会保存所有16384个 slot 对应到哪一个节点信息。如果一个 key 所属的 slot 正好由被请求的节点提供服务,则直接处理并返回结果,否则返回 MOVED重定向信息。

节点可以直接使用 redis-server 启动命令,如下:

> redis-server /path/to/redis-cluster.conf

副本漂移

分片漂移

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐