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/
转载文章受原作者版权保护。转载请注明原作者出处!