redis 命令

Redis是用C语言实现的,一般来说C语言实现的程序”距离”操作系统更近,执行速度相对会更快。

Redis使用了单线程架构,预防了多线程可能产生的竞争问题。

作者对于Redis源代码可以说是精打细磨,曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。

本文比较详细且全面的梳理了Redis使用过程中涉及的全部增删改查!

1.字符串

1.设置键

<span class="hljs-keyword">set <span class="hljs-keyword">key <span class="hljs-keyword">value [ex seconds] [px milliseconds] [nx|xx]

setex <span class="hljs-keyword">key seconds <span class="hljs-keyword">value
setnx <span class="hljs-keyword">key <span class="hljs-keyword">value</span></span></span></span></span></span></span>
  • ex seconds:为键设置秒级过期时间。
  • px milliseconds:为键设置毫秒级过期时间。
  • nx:键必须不存在,才可以设置成功,用于添加。
  • xx:与nx相反,键必须存在,才可以设置成功,用于更新。

2.批量设置值

mset <span class="hljs-keyword">key value [<span class="hljs-keyword">key value ...]</span></span>

3.批量获取值

mget <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]</span></span>

4.计数

<span class="hljs-attribute">incr key</span>
  • 值不是整数,返回错误。
  • 值是整数,返回自增后的结果。
  • 键不存在,按照值为0自增,返回结果为1

decr(自减)、incrby(自增指定数字)、
decrby(自减指定数字)、incrbyfloat(自增浮点数)

4.追加值

<span class="hljs-built_in">append key value</span>

5.字符串长度

<span class="hljs-attribute">strlen key</span>

6.设置并返回原值

<span class="hljs-attribute">getset key value</span>

7.设置指定位置的字符

<span class="hljs-attribute">setrange key offeset value</span>

8.获取部分字符串

getrange <span class="hljs-keyword">key start <span class="hljs-keyword">end</span></span>

2.哈希

1.设置值

<span class="hljs-attribute">hset key field value</span>

2.获取值

<span class="hljs-attribute">hget key field</span>

3.删除filed

hdel key field [field <span class="hljs-keyword">...]</span>

4.计算field个数

<span class="hljs-attribute">hlen key</span>

5.批量设置或获取field-value

hmget key field [field <span class="hljs-keyword">...]
hmset key field value [field value <span class="hljs-keyword">...]</span></span>

6.判断field是否存在

<span class="hljs-attribute">hexists key field</span>

7.获取所有field

<span class="hljs-attribute">hkeys key</span>

8.获取所有value

<span class="hljs-attribute">hvals key</span>

9.获取所有的field-value

<span class="hljs-attribute">hgetall key</span>

10.hincrby hincrbyfloat

hincrby <span class="hljs-keyword">key field
hincrbyfloat <span class="hljs-keyword">key field</span></span>

11.计算value的字符串长度

<span class="hljs-attribute">hstrlen key field</span>

3.列表

1)添加

left/right

1.从右边插入元素

rpush key <span class="hljs-keyword">value [<span class="hljs-keyword">value ...]</span></span>

lrange listkey 0 -1 可以从左到右获取列表的所有元素

2.从左边插入元素

lpush key <span class="hljs-keyword">value [<span class="hljs-keyword">value ...]</span></span>

3.向某个元素前或者后插入元素

<span class="hljs-attribute">linsert key before|after pivot value</span>

2)查找

1.获取指定范围内的元素列表

lrange <span class="hljs-keyword">key start <span class="hljs-keyword">end</span></span>

2.获取列表指定索引下标的元素

<span class="hljs-attribute">lindex key index</span>

3.获取列表长度

<span class="hljs-attribute">llen key</span>

3)删除

1.从列表左侧弹出元素

<span class="hljs-attribute">lpop key</span>

2.从列表右侧弹出

<span class="hljs-attribute">rpop key</span>

3.删除指定元素

<span class="hljs-attribute">lrem key count value</span>
  • count>0,从左到右,删除最多count个元素。
  • count

4.按照索引范围修剪列表

<span class="hljs-built_in">ltrim key start <span class="hljs-keyword">end</span></span>

4)修改

修改指定索引下标的元素

<span class="hljs-attribute">lset key index newValue</span>

5)阻塞操作

blpop <span class="hljs-keyword">key [<span class="hljs-keyword">key ...] timeout
brpop <span class="hljs-keyword">key [<span class="hljs-keyword">key ...] timeout</span></span></span></span>
  • key[key…]:多个列表的键
  • timeout:阻塞时间(单位:秒)

开发技巧

  • lpush+lpop=Stack(栈)
  • lpush+rpop=Queue(队列)
  • lpsh+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息队列)

4.集合

集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中 不允许有重复元素,并且集合中的元素是 无序的,不能通过索引下标获取元素。

1.添加元素

sadd key element [element <span class="hljs-keyword">...]</span>

2.删除元素

srem key element [element <span class="hljs-keyword">...]</span>

3.计算元素个数

<span class="hljs-attribute">scard key</span>

4.判断元素是否在集合中

<span class="hljs-attribute">sismember key element</span>

5.随机从集合返回指定个数元素

<span class="hljs-selector-tag">srandmember <span class="hljs-selector-tag">key <span class="hljs-selector-attr">[count]</span></span></span>

6.从集合随机弹出元素

<span class="hljs-attribute">spop key</span>

7.获取所有元素

<span class="hljs-attribute">smembers key</span>

8.求多个集合的交集

sinter <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]</span></span>

9.求多个集合的并集

suinon <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]</span></span>

10.求多个集合的差集

sdiff <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]</span></span>

11.将交集、并集、差集的结果保存

sinterstore destination <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]
suionstore destination <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]
sdiffstore destination <span class="hljs-keyword">key [<span class="hljs-keyword">key ...]</span></span></span></span></span></span>

三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination中

5.有序集合

1.添加成员

zadd key score <span class="hljs-keyword">member [score <span class="hljs-keyword">member ...]</span></span>

Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:

  • nx:member必须不存在,才可以设置成功,用于添加。
  • xx:member必须存在,才可以设置成功,用于更新。
  • ch:返回此次操作后,有序集合元素和分数发生变化的个数。
  • incr:对score做增加,相当于后面介绍的zincrby。

2.计算成员个数

<span class="hljs-attribute">zcard key</span>

3.计算某个成员的分数

<span class="hljs-attribute">zscore key member</span>

4.计算成员的排名

zrank <span class="hljs-keyword">key member
zrevrank <span class="hljs-keyword">key member</span></span>

5.删除成员

zrem key <span class="hljs-keyword">member [<span class="hljs-keyword">member ...]</span></span>

6.增加成员的分数

<span class="hljs-selector-tag">zincrby <span class="hljs-selector-tag">key <span class="hljs-selector-tag">increment <span class="hljs-selector-tag">member
<span class="hljs-selector-tag">zincrby <span class="hljs-selector-tag">user<span class="hljs-selector-pseudo">:ranking <span class="hljs-selector-tag">9 <span class="hljs-selector-tag">tom</span></span></span></span></span></span></span></span></span>

7.返回指定排名范围的成员

zrange key <span class="hljs-keyword">start <span class="hljs-keyword">end [withscores]
zrevrange <span class="hljs-keyword">key <span class="hljs-keyword">start <span class="hljs-keyword">end [withscores]</span></span></span></span></span>

zrange是从低到高返回,zrevrange反之。

8.返回指定分数范围的成员

zrangebyscore key <span class="hljs-built_in">min <span class="hljs-built_in">max [withscores] [limit offset <span class="hljs-built_in">count]
zrevrangebyscore key <span class="hljs-built_in">max <span class="hljs-built_in">min [withscores] [limit offset <span class="hljs-built_in">count]</span></span></span></span></span></span>

其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。

同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大。

9.返回指定分数范围成员个数

zcount key <span class="hljs-built_in">min <span class="hljs-built_in">max</span></span>

10.删除指定排名内的升序元素

zremrangebyrank <span class="hljs-keyword">key start <span class="hljs-keyword">end</span></span>

11.删除指定分数范围的成员

zremrangebyscore key <span class="hljs-built_in">min <span class="hljs-built_in">max</span></span>

12.交集

<span class="hljs-selector-tag">zinterstore <span class="hljs-selector-tag">destination <span class="hljs-selector-tag">numkeys <span class="hljs-selector-tag">key <span class="hljs-selector-attr">[key ...] <span class="hljs-selector-attr">[weights weight [weight ...]]
<span class="hljs-selector-attr">[aggregate sum|min|max]</span></span></span></span></span></span></span>
  • destination:交集计算结果保存到这个键。
  • numkeys:需要做交集计算键的个数。
  • key[key…]:需要做交集计算的键。
  • weights weight[weight…]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
  • aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。
<span class="hljs-selector-tag">zinterstore <span class="hljs-selector-tag">user<span class="hljs-selector-pseudo">:ranking<span class="hljs-selector-pseudo">:1_inter_2 2 <span class="hljs-selector-tag">user<span class="hljs-selector-pseudo">:ranking<span class="hljs-selector-pseudo">:1
<span class="hljs-selector-tag">user<span class="hljs-selector-pseudo">:ranking<span class="hljs-selector-pseudo">:2 <span class="hljs-selector-tag">weights 1 0<span class="hljs-selector-class">.5 <span class="hljs-selector-tag">aggregate <span class="hljs-selector-tag">max</span></span></span></span></span></span></span></span></span></span></span></span></span></span>

13.并集

zunionstore destination numkeys key [<span class="hljs-string">key ...] [<span class="hljs-string">weights weight [weight ...]][aggregate sum|min|max]</span></span>

6.键管理

键重命名

<span class="hljs-keyword">rename <span class="hljs-keyword">key newkey</span></span>

随机返回一个键

randomkey

7.键过期

  • expire key seconds:键在seconds秒后过期。
  • expireat key timestamp:键在秒级时间戳timestamp后过期。
<span class="hljs-keyword">set hello world

<span class="hljs-keyword">expire hello <span class="hljs-number">10

ttl hello</span></span></span>

通过ttl观察它的过期剩余时间(s),返回结果为-2时,代表已被删除。

ttl 和 ptll都可以查询键的剩余时间,但是pttl的精度可以达到毫秒级别,有3种返回值:

  • 大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)
  • -1:键没有设置过期时间
  • -2:键不存在

expireat命令可以设置键的秒级过期时间戳,例如如果需要将键hello在2016-08-0100:00:00(秒级时间戳为1469980800)过期,可以执行如下操作:

<span class="hljs-attribute">expireat hello <span class="hljs-number">1469980800</span></span>

除此之外,Redis2.6版本后提供了毫秒级的过期方案:

  • pexpire key milliseconds:键在milliseconds毫秒后过期。
  • pexpireat key milliseconds-timestamp键在毫秒级时间戳timestamp后过
    期。

但无论是使用过期时间还是时间戳,秒级还是毫秒级,在Redis内部最终使用的都是pexpireat。

8.迁移键

1)move key db

仅限于内部数据库的迁移

2)dump+restore

dump key
<span class="hljs-keyword">restore <span class="hljs-keyword">key ttl <span class="hljs-keyword">value</span></span></span>

分为两步:

1.在源Redis上,dump命令会将键值序列化,格式采用的是RDB格式。

2.在目标Redis上,restore命令将上面序列化的值进行复原,其中ttl参数代表过期时间,如果ttl=0代表没有过期时间。

示例:

1在源Redis上执行dump:

127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379> <span class="hljs-selector-tag">set <span class="hljs-selector-tag">hello <span class="hljs-selector-tag">world
<span class="hljs-selector-tag">OK
127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379> <span class="hljs-selector-tag">dump <span class="hljs-selector-tag">hello
"\<span class="hljs-selector-tag">x00\<span class="hljs-selector-tag">x05world\<span class="hljs-selector-tag">b\<span class="hljs-selector-tag">x00\<span class="hljs-selector-tag">xa0\<span class="hljs-selector-tag">xfc\<span class="hljs-selector-tag">xd0;<span class="hljs-selector-tag">y\<span class="hljs-selector-tag">xb0\<span class="hljs-selector-tag">xf8\<span class="hljs-selector-tag">xfa"</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

2在目标Redis上执行restore

127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379> <span class="hljs-selector-tag">get <span class="hljs-selector-tag">hello
(<span class="hljs-selector-tag">nil)
127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379> <span class="hljs-selector-tag">restore <span class="hljs-selector-tag">hello 0 "\<span class="hljs-selector-tag">x00\<span class="hljs-selector-tag">x05world\<span class="hljs-selector-tag">b\<span class="hljs-selector-tag">x00\<span class="hljs-selector-tag">xa0\<span class="hljs-selector-tag">xfc\<span class="hljs-selector-tag">xd0;<span class="hljs-selector-tag">y\<span class="hljs-selector-tag">xb0\<span class="hljs-selector-tag">xf8\<span class="hljs-selector-tag">xfa"
<span class="hljs-selector-tag">OK
127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1<span class="hljs-selector-pseudo">:6379> <span class="hljs-selector-tag">get <span class="hljs-selector-tag">hello
"<span class="hljs-selector-tag">world"</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

上面两步对应的伪代码为

Redis sourceRedis = <span class="hljs-keyword">new Redis(<span class="hljs-string">"sourceMachine", <span class="hljs-number">6379);
Redis targetRedis = <span class="hljs-keyword">new Redis(<span class="hljs-string">"targetMachine", <span class="hljs-number">6379);
targetRedis.restore(<span class="hljs-string">"hello", <span class="hljs-number">0, sourceRedis.dump(<span class="hljs-keyword">key));</span></span></span></span></span></span></span></span></span>

3)migrate(推荐)

migrate host port key|<span class="hljs-string">"" destination-db timeout <span class="hljs-string">[copy] <span class="hljs-string">[replace] <span class="hljs-string">[keys key [key]]</span></span></span></span>

下面对migrate的参数进行逐个说明:

  • host:目标Redis的IP地址。
  • port:目标Redis的端口。
  • key|””:在Redis3.0.6版本之前,migrate只支持迁移一个键,所以此处是
    要迁移的键,但Redis3.0.6版本之后支持迁移多个键,如果当前需要迁移多个键,此处为空字符串””。
  • destination-db:目标Redis的数据库索引,例如要迁移到0号数据库,这里就写0。
  • timeout:迁移的超时时间(单位为毫秒)。
  • [copy]:如果添加此选项,迁移后并不删除源键。
  • [replace]:如果添加此选项,migrate不管目标Redis是否存在该键都会
    正常迁移进行数据覆盖。
  • [keys key[key…]]:迁移多个键,例如要迁移key1、key2、key3,此处填
    写”keys key1 key2 key3″。

第一,整个过程是原子执行的,不需要在多个Redis实例上开启客户端的,只需要在源Redis上执行migrate命令即可。

第二,migrate命令的数据传输直接在源Redis和目标Redis上完成的。

第三,目标Redis完成restore后会发送OK给源Redis,源Redis接收后会根据migrate对应的选项来决定是否在源Redis上删除对应的键。

示例:

1源Redis有,目标没有

<span class="hljs-selector-tag">migrate 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1 6380 <span class="hljs-selector-tag">hello 0 1000</span></span></span></span></span>

2源Redis和目标Redis都有键hello

<span class="hljs-selector-tag">migrate 127<span class="hljs-selector-class">.0<span class="hljs-selector-class">.0<span class="hljs-selector-class">.1 6379 <span class="hljs-selector-tag">hello 0 1000 <span class="hljs-selector-tag">replace</span></span></span></span></span></span>

源Redis批量添加多个键

<span class="hljs-attribute">mset key1 value1 key2 value2 key3 value3</span>

源Redis执行如下命令完成多个键的迁移

<span class="hljs-attribute">migrate <span class="hljs-number">127.0.0.1 <span class="hljs-number">6380 <span class="hljs-string">"" <span class="hljs-number">0 <span class="hljs-number">5000 keys key1 key2 key3</span></span></span></span></span></span>

9.遍历键

1)全量遍历键

<span class="hljs-attribute">keys pattern</span>

示例:

<span class="hljs-attribute">keys *</span>
  • *代表任意字符
  • ?代表一个字符
  • []代表匹配部分字符,例如[1,3]代表匹配1,3
  • \x用来做转义,例如要匹配星号、问号需要进行转义

如果Redis包含了大量的键,执行keys命令很可能会造成Redis阻塞,所以一般建议不要在生产环境下使用keys命令。

2)渐进式遍历

每次执行scan,可以想象成只扫描一个字典中的一部分键,直到将字典中的所有键遍历完毕。

scan <span class="hljs-attribute">cursor <span class="hljs-selector-attr">[match pattern] <span class="hljs-selector-attr">[count number]</span></span></span>
  • cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。
  • match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。
  • count number是可选参数,它的作用是表明每次要遍历的键个数,默认值是10,此参数可以适当增大。

10.数据库管理

1.切换数据库

<span class="hljs-keyword">select dbIndex</span>

默认有16个

2.flushdb/flushall

flushdb只清除当前数据库,flushall会清除所有数据库。

11.慢查询分析

所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。慢查询功能可以有效地帮助我们找到Redis可能存在的瓶颈.

12.Pipeline

Pipeline(流水线)机制它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。

13.事务

熟悉关系型数据库的读者应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,要么全部不执行。

Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之间。如果要停止事务的执行,可以使用discard命令代替exec命令即可。

14.关机

<span class="hljs-keyword">shutdown</span>

Redis关闭的过程:断开与客户端的连接、持久化文件生成,是一种相对优雅的关闭方式。

也可以kill掉,但不要kill -9,shutdown参数有nosave|save

15.安全

设置密码(“”:无)

<span class="hljs-built_in">config set requirepass <span class="hljs-string">"password"</span></span>
<span class="hljs-attribute">auth <span class="hljs-string">"password"</span></span>

获取密码

<span class="hljs-built_in">config get requirepass</span>

16.持久化

所有的数据都存在内存中,从内存当中同步到硬盘上,这个过程叫做持久化过程。
持久化操作,两种方式:rdb方式、aof方式,可以单独使用或者结合使用。

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

RDB配置

在redis.conf中的配置

save <span class="hljs-number">900 <span class="hljs-number">1
save <span class="hljs-number">300 <span class="hljs-number">10
save <span class="hljs-number">60 <span class="hljs-number">10000
dbfilename <span class="hljs-built_in">dump.rdb
dir ./</span></span></span></span></span></span></span>

意思是在900秒内有1个key发生变化,就写一次硬盘。

Linux保存在 redis.conf 同级目录

AOF配置

配置完记得重启!

Original: https://www.cnblogs.com/yelongsan/p/10319214.html
Author: 蒂其之死
Title: redis 命令

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529164/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 函数调用栈

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这个分栏我们开始学习PWN,当然PWN也是自己的兴趣爱好,所以可能博客更新…

    Linux 2023年6月13日
    0120
  • Spring Boot:使用Redis存储技术

    综合概述 Redis是一个开源免费的高性能key-value数据库,读取速度达110000次/s,写入速度达81000次/s。Redis支持丰富的数据类型,如Lists, Hash…

    Linux 2023年5月28日
    0103
  • shell加密

    如何保护自己编写的shell程序要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1、加密 2、设定过期时间,下面以shc工具为例说明: 一、下载安装shc工具s…

    Linux 2023年5月28日
    080
  • 关于如何在Idea下进行多子项目及引用内部子项目情况下打包项目的方法

    近期在开发Java的时候遇到了如下的打包上的问题 需要将一个工程下面的子工程分别打包 有的子工程还包含了另一个子工程 在这种情况下打包会出现找不到子模块的情况。 JDK:1.8 开…

    Linux 2023年6月14日
    095
  • JVM学习 运行时数据区 PC寄存器、本地方法栈、虚拟机栈

    2、运行时数据区 哔哩哔哩 尚硅谷视频 宋红康老师 2.1、程序计数器(PC寄存器) 作用 PC寄存器用来存储指向下一条指令的地址,也就是即将要执行指令的代码。由执行引擎读取下一条…

    Linux 2023年6月7日
    0104
  • Mybatis源码解读-插件

    注册 xml方式的注册,是在XMLConfigBuilder#pluginElement完成的。 不明觉厉的同学,请参考上一篇文章:Mybatis源码解读-配置加载和Mapper的…

    Linux 2023年6月7日
    095
  • Java基础系列–07_String、StringBuffer和StringBuilder

    String类(1)字符串:字符串是 常量;它们的值在 创建之后不能更改,存储在堆中。如果字符串多次赋值,其实是每次重新赋值的时候程序都先在内存中寻找已开辟的空间是否存在该值;如果…

    Linux 2023年6月7日
    076
  • Java实现链表

    3、链表 MyLinkedList 有一个头指针,一个尾指针,还有链表长度size 内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构…

    Linux 2023年6月14日
    091
  • Linux显示IP和主机名

    (1) ifconfig:Linux ifconfig命令用于显示或设置网络设备。 语法: ifconfig [网络设备][down up -allmulti -arp -prom…

    Linux 2023年6月8日
    0104
  • 灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场…

    Linux 2023年5月28日
    072
  • GT/s和Gbps的关系

    GT/s 和 Gbps 数据传输表示通过数字接口传递的数据量。 当用较多的数据位对原始数据进行编码时,有效数据传输量低于实际传输的数据位数。例如:PCIe串行总线采用10位数据对8…

    Linux 2023年6月7日
    093
  • 轻量级多级菜单控制框架程序(C语言)

    1、前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计;很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网…

    Linux 2023年6月7日
    0115
  • 那些技术实战中的架构设计方法

    上个月我写的一篇文章《关于技术能力的思考和总结》引起了大家的关注,好多读者的评论”以写代想、以想促真、以讲验真”,大家的感受很深刻,基于上次的文章,这篇文章…

    Linux 2023年6月8日
    084
  • phpcms安装

    【快速安装开始】 下载解压phpcms,复制安装文件到站点目录”/opt/html”里,给予权限(官网无法访问了,所以下载地址需自行寻找上传) cd /us…

    Linux 2023年6月6日
    070
  • 软件工程 结构化设计方法 第3篇随笔

    * 调用:模块间的一种关系,模块A为了完成其任务必须依赖其他模块 ​ ——————> Original: https://www.cnblogs.com/shuisanya/…

    Linux 2023年6月7日
    0138
  • Java 技术栈中间件优雅停机方案设计与实现全景图

    欢迎关注公众号:bin的技术小屋,阅读公众号原文 本系列 Netty 源码解析文章基于 4.1.56.Final 版本 本文概要 在上篇文章 我为 Netty 贡献源码 | 且看 …

    Linux 2023年6月6日
    0144
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球