- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
A Redis stream is a data structure that acts like an append-only log. You can use streams to record and simultaneously syndicate events in real time. Examples of Redis stream use cases include
Redis generates a unique ID for each stream entry. You can use these IDs to retrieve their associated entries later or to read and process all subsequent entries in the stream. 。
Redis streams support several trimming strategies (to prevent streams from growing unbounded) and more than one consumption strategy (see XREAD , XREADGROUP , and XRANGE ). 。
redis stream 是一个追加式的数据结构,可以用在以下三个场景: 1 、事件溯源,比如跟踪用户的操作,点击,等 2 、传感监视,如某些专业领域的设置监控 3 、消息 可以把不同用户的消息存在一个单据的stream中
127.0 . 0.1 : 6386 > XADD temperatures:us-ny: 10007 * temp_f 87.2 pressure 29.69 humidity 46 " 1678622044821-0 " 127.0 . 0.1 : 6386 > XADD temperatures:us-ny: 10007 * temp_f 83.1 pressure 29.21 humidity 46.5 " 1678622061283-0 " 127.0 . 0.1 : 6386 > XADD temperatures:us-ny: 10007 * temp_f 81.9 pressure 28.37 humidity 43.7 " 1678622071669-0 " 127.0 . 0.1 : 6386 > XRANGE temperatures:us-ny: 10007 1658354934941 - 0 + COUNT 2 [COUNT count] [root@machine138 redis -stack]# bin/redis-cli -p 6386 127.0 . 0.1 : 6386 > XRANGE temperatures:us-ny: 10007 1678622061283 - 0 + COUNT 2 1 ) 1 ) " 1678622061283-0 " 2 ) 1 ) " temp_f " 2 ) " 83.1 " 3 ) " pressure " 4 ) " 29.21 " 5 ) " humidity " 6 ) " 46.5 " 2 ) 1 ) " 1678622071669-0 " 2 ) 1 ) " temp_f " 2 ) " 81.9 " 3 ) " pressure " 4 ) " 28.37 " 5 ) " humidity " 6 ) " 43.7 "
。
。
XADD key [NOMKSTREAM] [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]] <* | id> field value [field value ...]
Appends the specified stream entry to the stream at the specified key. If the key does not exist, as a side effect of running this command the key is created with a stream value. The creation of stream's key can be disabled with the NOMKSTREAM option. 。
An entry is composed of a list of field-value pairs. The field-value pairs are stored in the same order they are given by the user. Commands that read the stream, such as XRANGE or XREAD , are guaranteed to return the fields and values exactly in the same order they were added by XADD . 。
XADD is the only Redis command that can add data to a stream, but there are other commands, such as XDEL and XTRIM , that are able to remove data from a stream. 。
Streams are an append-only data structure. The fundamental write command, called XADD , appends a new entry to the specified stream. 。
each stream entry consists of one or more field-value pairs, somewhat like a record or a Redis hash 。
XADD
command, and identifying univocally each entry inside a given stream, is composed of two parts: xadd命令可以创建一个stream 并把 键值对存入其中,顺序与用户输入的顺序相同,可以通过xread,xrange等命令读取,
每个stream entry 都由一个或多个key-value 组成,有点像hashes (HSET key value,HGET key value)
例如:XADD mystream * sensor-id 1234 temperature 19.8
mystream:stream key
*:自动生成 stream ID :<millisecondsTime>-<sequenceNumber> millisecondsTime:就是本地时间
sequenceNumber:就是同一个millisecondsTime之内产生的64位整数
sensor-id:key1
1234:vlaue1
temperature:key2
19.8 value2
。
另外,ID可以自定义,但是要遵循以下几个原则 : 1 、格式必须是 :number- seq ,其中 number可以是任何数字,但是要确保后面的ID 的number 不能比之前的ID 小,等于之前的ID 中number时,必须使seq大于前一个seq,否则会提示 ERR The ID specified in XADD is equal or smaller than the target stream top item,在redis 7 .0之后 ID 中seq 可以用* 代替 如: XADD somestream 0 -* baz qux 0 - 3 2 、-seq 可以省略,redis 自动补全 - 0 ,如 127.0 . 0.1 : 6386 > xadd ms1 20 key1 value1 " 20-0 " 正式上面的对ID的规则 ,才有后面的命令 XRANGE XRANGE key start end [COUNT count]
。
Now we are finally able to append entries in our stream via XADD . However, while appending data to a stream is quite obvious, the way streams can be queried in order to extract data is not so obvious. If we continue with the analogy of the log file, one obvious way is to mimic what we normally do with the Unix command tail -f , that is, we may start to listen in order to get the new messages that are appended to the stream. Note that unlike the blocking list operations of Redis, where a given element will reach a single client which is blocking in a pop style operation like BLPOP , with streams we want multiple consumers to see the new messages appended to the stream (the same way many tail -f processes can see what is added to a log). Using the traditional terminology we want the streams to be able to fan out messages to multiple clients. 。
However, this is just one potential access mode. We could also see a stream in quite a different way: not as a messaging system, but as a time series store . In this case, maybe it's also useful to get the new messages appended, but another natural query mode is to get messages by ranges of time, or alternatively to iterate the messages using a cursor to incrementally check all the history. This is definitely another useful access mode. 。
Finally, if we see a stream from the point of view of consumers, we may want to access the stream in yet another way, that is, as a stream of messages that can be partitioned to multiple consumers that are processing such messages, so that groups of consumers can only see a subset of the messages arriving in a single stream. In this way, it is possible to scale the message processing across different consumers, without single consumers having to process all the messages: each consumer will just get different messages to process. This is basically what Kafka (TM) does with consumer groups. Reading messages via consumer groups is yet another interesting mode of reading from a Redis Stream. 。
Redis Streams support all three of the query modes described above via different commands. The next sections will show them all, starting from the simplest and most direct to use: range queries. 。
这一段主要是stream 读取方式的由来,最后采取了类型Kafka类似的方式,做为stream 的读取方式。
。
。
To query the stream by range we are only required to specify two IDs, start and end . The range returned will include the elements having start or end as ID, so the range is inclusive. The two special IDs - and + respectively mean the smallest and the greatest ID possible. 。
127.0 . 0.1 : 6386 > xrange ms1 - + 1 ) 1 ) " 1-1 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 12-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 3 ) 1 ) " 13-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 4 ) 1 ) " 13-1 " 2 ) 1 ) " key1 " 2 ) " value1 " 5 ) 1 ) " 20-0 " 2 ) 1 ) " key1 " 2 ) " value1 "
- :表示当前stream (ms1)下最小ID 的entry 。
+: 表当前stream (ms1)下最大ID 的entry 。
后面的 count n可以限定获取多少条entry (范围内前n个entry) 。
127.0 . 0.1 : 6386 > xrange ms1 - + count 2 1 ) 1 ) " 1-1 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 12-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 127.0 . 0.1 : 6386 >
。
127.0 . 0.1 : 6386 > xrange ms1 1 13 - 1 1 ) 1 ) " 1-1 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 12-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 3 ) 1 ) " 13-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 4 ) 1 ) " 13-1 " 2 ) 1 ) " key1 " 2 ) " value1 "
上面的 1:表示从1-0 开始的ID 。
13-1:表示要获取的最大的ID 。
127.0 . 0.1 : 6386 > xrange ms1 1 13 - 1 count 2 1 ) 1 ) " 1-1 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 12-0 " 2 ) 1 ) " key1 " 2 ) " value1 "
在上面的命令中,如果 要完成后面的ENTRY的读取,需要借助 小括号 ( 后面跟已经读取到的最大的iD) 。
127.0 . 0.1 : 6386 > xrange ms1 ( 12 - 0 + count 2 1 ) 1 ) " 13-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 13-1 " 2 ) 1 ) " key1 " 2 ) " value1 "
也可以选择确定的结束 ID 。
127.0 . 0.1 : 6386 > xrange ms1 ( 12 - 0 13-1 count 2 1 ) 1 ) " 13-0 " 2 ) 1 ) " key1 " 2 ) " value1 " 2 ) 1 ) " 13-1 " 2 ) 1 ) " key1 " 2 ) " value1 "
。
。
上面是按照存入的顺序 获取的,如果 想按照存入的顺序相反的次序获取entry可以使用 xrevrange 。
XREVRANGE end start [count n] 注意 开始 和结束 id 与range 命令相比是 相反的。 reverse order!!.
127.0 . 0.1 : 6386 > xrevrange ms1 15 1 count 1 1 ) 1 ) " 13-1 " 2 ) 1 ) " key1 " 2 ) " value1 "
+ - 同样适用 。
127.0 . 0.1 : 6386 > xrevrange ms1 + - count 1 1 ) 1 ) " 20-0 " 2 ) 1 ) " key1 " 2 ) " value1 "
。
后面会学习 xread 命令。。。.
Redis Streams tutorial | Redis 。
。
最后此篇关于RedisStreamCommands命令学习-1XADDXRANGEXREVRANGE的文章就讲到这里了,如果你想了解更多关于RedisStreamCommands命令学习-1XADDXRANGEXREVRANGE的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一系列 SQL 命令,我想在大约 40 个不同的表上运行。必须有一种方法可以在不编写 40 条不同命令的情况下执行此操作... 我在 SQL Server 中运行它。所有表都有不同的名称,我要操作
我习惯在 PHP 中使用命令“mysql_insert_id()”来返回插入到我的数据库中的最后一行的 id。 在 C# 中的 SQLite 中是否有等效的命令? 谢谢! -阿德娜 最佳答案 选择 l
试图找出一种方法来回填 ds 分区 Hive 表的分区。 我知道如何从 CLI 运行 Hive 命令,例如 $HIVE_HOME/bin/hive -e 'select a.col from tab1
我有 .bat 文件。看起来像下一个 ....many commands1 ftp -i -s:copy.txt ...many commands2 copy.txt 包含下一个命令 open ...
基本上我想输入 show 并检查是否有 show 命令或别名已定义并触发它,如果未定义则触发 git show 。 例如 rm 应该执行 rm 但 checkout 应该执行 git checkout
我公司的主数据库是 iSeries 机器,我已经非常习惯使用 DB2 命令和结构。我现在正在尝试做一个小项目,更新一个包含超过 300 万条记录的表。我想出一种比较和“清理”数据的更快方法是使用 My
我想在带有 Node 的终端中制作一个简单的按钮板,并“blessed”用于连接或运行不同的命令。 ----------------------------------------------- _
我们有一个 selenium IDE 脚本,正在转换为 python webdriver。以下命令未转换: [openWindow | http://mywebsite.com/index.php |
我正在学习这个关于从 GIT HUB 下载和安装 Web 文件的在线教程。我进入主题:启动我们的静态网站,系统提示我输入命令以下载和安装 Web 文件。但是,当我输入命令 yarn install 时
我在 shell 脚本中使用 elif 命令时遇到问题,就像在 fortran 中一样。 我有 100 家公司的员工名单。我想屏蔽那些员工少于 500 人的公司。我的脚本是 rm -f categor
我有一些 Linux 命令可以生成 token 。我在 Linux 机器上使用操作系统库形式的 Python 自动化了这些命令。它工作正常。 但是,当我在 Windows 中尝试相同的代码时,它没有返
本文分享自华为云社区《Git你有可能不知道交互式暂存》,作者:龙哥手记。 本节中的几个交互式 Git 命令可以帮助你将文件的特定部分组合成提交。 当你在修改了大量文件后,希望这些改动能拆分为若干提交而
我想知道如何使用 IN 比较语法来做到这一点。 当前的 SQL 查询是: select * from employee where (employeeName = 'AJAY' and month(e
我在这个位置安装了 Hadoop /usr/local/hadoop$ 现在我想列出 dfs 中的文件。我使用的命令是: hduser@ubuntu:/usr/local/hadoop$ bin/ha
是否有一个单一的 docker 命令可用于清除所有内容?如果正在运行,请停止所有容器、删除所有图像、删除所有卷...等。 最佳答案 我认为没有一个命令可以做到这一点。您首先需要停止所有容器使用 $ d
我基本上是在 clojure/nrepl 模式中寻找与 C-u C-x C-e 或 C-c C-p 等效的 Scheme。 我想要一个 C-x C-e 将输出打印到缓冲区,而不是仅仅在 repl 中。
我可以在 vim 中使用 pudb(一个 ncurses Python 调试器),因为,例如,:!python %在实际的终端窗口中运行。我更喜欢使用 gvim,但 gvim 运行 :!python
我正在尝试编写一个 FFMPEG 命令: 取为 输入 一个视频 input.mp4 和一个图像 pic.jpg 作为 输出 将 input.mp4 拆分为 20 秒的视频,按顺序重命名;对于每个分割视
我想转储视频每帧的比特率。我正在尝试使用 -vstats 获取此信息命令。当我运行此命令时 - ffmpeg -i input.mp4 -vstats 它显示至少应该定义一个文件。 如果有人能建议我任
我是一名优秀的程序员,十分优秀!