Redis基本指令操作

Redis基本指令操作

来源于网上 自己编写 做为记录 方便自己查看

key 操作

del

del key1 key2 ... Keyn
作用: 删除1个或多个键
返回值: 不存在的key忽略掉,返回真正删除的key的数量

rename

rename key newkey
作用: 给key赋一个新的key名
注:如果newkey已存在,则newkey的原值被覆盖

renamenx

renamenx key newkey  
作用: 把key改名为newkey
返回: 发生修改返回1,未发生修改返回0
注: nx--> not exists, 即, newkey不存在时,作改名动作

move

move key db 
作用: 移动key到库db
例子:
redis 127.0.0.1:6379[1]> select 2
OK
redis 127.0.0.1:6379[2]> keys *
(empty list or set)
redis 127.0.0.1:6379[2]> select 0
OK
redis 127.0.0.1:6379> keys *
1) "name"
2) "cc"
3) "a"
4) "b"
redis 127.0.0.1:6379> move cc 2
(integer) 1
redis 127.0.0.1:6379> select 2
OK
redis 127.0.0.1:6379[2]> keys *
1) "cc"
redis 127.0.0.1:6379[2]> get cc
"3"

(注意: 一个redis进程,打开了不止一个数据库, 默认打开16个数据库,从0到15编号,
如果想打开更多数据库,可以从配置文件修改)

keys pattern

查询相应的key
在redis里,允许模糊查询key
有3个通配符 *, ? ,[]
*: 通配任意多个字符
?: 通配单个字符
[]: 通配括号内的某1个字符
例子:
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4
OK
redis 127.0.0.1:6379> keys o*
1) "one"
redis 127.0.0.1:6379> key *o
(error) ERR unknown command 'key'
redis 127.0.0.1:6379> keys *o
1) "two"
redis 127.0.0.1:6379> keys ???
1) "one"
2) "two"
redis 127.0.0.1:6379> keys on?
1) "one"
redis 127.0.0.1:6379> set ons yes
OK
redis 127.0.0.1:6379> keys on[e]
1)"one"
redis 127.0.0.1:6379> keys [o]??
1) "one"

randomkey

随机返回一个key
redis 127.0.0.1:6379> randomkey
"one"

exists

exists key
判断key是否存在,返回1/0
redis 127.0.0.1:6379> exists one
(integer) 1

type

type key
返回key存储的值的类型
有string,link,set,order set, hash

ttl

ttl key
作用: 查询key的生命周期
返回: 秒数

注:对于不存在的key或已过期的key/不过期的key,都返回-1
Redis2.8以后的中,对于不存在的key,返回-2

expire

expire key 整型值
作用: 设置key的生命周期,以秒为单位

同理: pexpire key 秒, 设置生命周期 ,pttl key, 以毫秒返回生命周期

persist

persist key
作用: 把指定key置为永久有效

string

字符串

set

set key value [ex 秒数] / [px 毫秒数]  [nx] /[xx]

如: set a 1 ex 10 , 10秒有效 a=1
Set a 1 px 9000 , 9秒有效 a=1
注: 如果ex,px同时写,以后面的有效期为准
如 set a 1 ex 100 px 9000, 实际有效期是9000毫秒 a=1

nx: 表示key不存在时,执行操作
xx: 表示key存在时,执行操作

mset

mset  multi set , 一次性设置多个键值
例: mset key1 v1 key2 v2 ....

get

get key 
作用:获取key的值

mget

mget key1 key2 ..keyn
作用:获取多个key的值

setrange

setrange key offset value
作用:把字符串的offset偏移字节,改成value
redis 127.0.0.1:6379> set greet hello
OK
redis 127.0.0.1:6379> setrange greet 2 x
(integer) 5
redis 127.0.0.1:6379> get greet
"hexlo"

注意: 如果偏移量>字符长度, 该字符自动补0x00
127.0.0.1:6379> set k1 12345
OK
127.0.0.1:6379> setrange k1 8 6
(integer) 9
127.0.0.1:6379> get k1
"12345\x00\x00\x006"
127.0.0.1:6379>

append

append key value
作用: 把value追加到key的原值上

getrange

getrange key start stop
作用: 是获取字符串中 [start, stop]范围的值
注意: 对于字符串的下标,左数从0开始,右数从-1开始
redis 127.0.0.1:6379> set title 'chinese'
OK
redis 127.0.0.1:6379> getrange title 0 3
"chin"
redis 127.0.0.1:6379> getrange title 1 -2
"hines"

注意:

1: start>=length, 则返回空字符串

2: stop>=length,则截取至字符结尾

3: 如果start 所处位置在stop右边, 返回空字符串

getset

getset key newvalue
作用: 获取并返回旧值,设置新值
redis 127.0.0.1:6379> set cnt 0
OK
redis 127.0.0.1:6379> getset cnt 1
"0"
redis 127.0.0.1:6379> getset cnt 2
"1"

incr

incr key
作用: 指定的key的值加1,并返回加1后的值

注意:
1:不存在的key当成0,再incr操作
2: 范围为64有符号

incrby

incrby key number
作用: 指定的key的值加number,并返回加number后的值

127.0.0.1:6379> set v 2
OK
127.0.0.1:6379> incrby v 100
(integer) 102

incrbyfloat

incrbyfloat key floatnumber
作用: 指定的key的值加floatnumber,并返回加floatnumber后的值

127.0.0.1:6379> incrbyfloat v 3.5
"105.5"

decr

decr key
作用: 指定的key的值减1,并返回减1后的值

decrby

decrby key number
作用: 指定的key的值减number,并返回减number后的值

getbit

getbit key offset
作用:获取值的二进制表示,对应位上的值(从左,从0编号)

redis 127.0.0.1:6379> set char A
OK
redis 127.0.0.1:6379> getbit char 1
(integer) 1
redis 127.0.0.1:6379> getbit char 2
(integer) 0
redis 127.0.0.1:6379> getbit char 7
(integer) 1

setbit

setbit  key offset value
设置offset对应二进制位上的值
返回: 该位上的旧值

注意:
1:如果offset过大,则会在中间填充0,
2: offset最大大到多少
3:offset最大2^32-1,可推出最大的的字符串为512M

bitop

bitop operation destkey key1 [key2 ...]
对key1,key2..keyN作operation,并将结果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR

redis 127.0.0.1:6379> setbit lower 7 0
(integer) 0
redis 127.0.0.1:6379> setbit lower 2 1
(integer) 0
redis 127.0.0.1:6379> get lower
" "
redis 127.0.0.1:6379> set char Q
OK
redis 127.0.0.1:6379> get char
"Q"
redis 127.0.0.1:6379> bitop or char char lower
(integer) 1
redis 127.0.0.1:6379> get char
"q"

注意: 对于NOT操作, key不能多个

list

lpush

lpush key value 
作用: 把值插入到链接头部

lpop

rpop key
作用: 返回并删除链表头元素

rpush

lpush key value 
作用: 把值插入到链接尾部

rpop

rpop key
作用: 返回并删除链表尾元素

lrange

lrange key start stop
作用: 返回链表中[start ,stop]中的元素
规律: 左数从0开始,右数从-1开始

lrem

lrem key count value
作用: 从key链表中删除 value值
注: 删除count的绝对值个value后结束
Count>0 从表头删除
Count<0 从表尾删除

ltrim

ltrim key start stop
作用: 剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key

lindex

lindex key index
作用: 返回index索引上的值,
如 lindex key 2

llen

llen key
作用:计算链接表的元素个数
redis 127.0.0.1:6379> llen v
(integer) 3

linsert

linsert  key after|before search value
作用: 在key链表中寻找’search’,并在search值之前|之后,.插入value
注: 一旦找到一个search后,命令就结束了,因此不会插入多个value

rpoplpush

rpoplpush source dest
作用: 把source的尾部拿出,放在dest的头部,
并返回 该单元值

blpop

blpop key timeout
作用:等待弹出key的头元素,
Timeout为等待超时时间
如果timeout为0,则一直等待

brpop

brpop key timeout
作用:等待弹出key的头元素,
Timeout为等待超时时间
如果timeout为0,则一直等待

长轮询Ajax,在线聊天时,能够用到

set

集合的性质: 唯一性,无序性,确定性

注: 在string和list的命令中,可以通过range 来访问string中的某几个字符或某几个元素

但,因为集合的无序性,无法通过下标或范围来访问部分元素.

因此想看元素,要么随机先一个,要么全选

sadd

sadd key value1 value2
作用: 往集合key中增加元素

srem

srem value1 value2
作用: 删除集合中集为 value1 value2的元素
返回值: 忽略不存在的元素后,真正删除掉的元素的个数

spop

spop key
作用: 返回并删除集合中key中1个随机元素

srandmember

srandmember key
作用: 返回集合key中,随机的1个元素.

sismember

sismember key  value
作用: 判断value是否在key集合中
是返回1,否返回0

smembers

smembers key
作用: 返回集中中所有的元素

scard

scard key
作用: 返回集合中元素的个数

smove

smove source dest value
作用:把source中的value删除,并添加到dest集合中

sinter

sinter  key1 key2 key3
作用: 求出key1 key2 key3 三个集合中的交集,并返回

redis 127.0.0.1:6379> sadd s1 0 2 4 6
(integer) 4
redis 127.0.0.1:6379> sadd s2 1 2 3 4
(integer) 4
redis 127.0.0.1:6379> sadd s3 4 8 9 12
(integer) 4
redis 127.0.0.1:6379> sinter s1 s2 s3
1) "4"
redis 127.0.0.1:6379> sinter s3 s1 s2
1)"4"

sinterstore

sinterstore dest key1 key2 key3
作用: 求出key1 key2 key3 三个集合中的交集,并赋给dest

suion

suion key1 key2.. Keyn
作用: 求出key1 key2 keyn的并集,并返回

sdiff

sdiff key1 key2 key3 
作用: 求出key1与key2 key3的差集
即 key1 - key2 - key3
即 key1 - (key2 + key3)

zset

有序集合

zadd

zadd key score1 value1 score2 value2 ..
添加元素

redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei
(integer) 3

zrem

zrem key value1 value2 ..
作用: 删除集合中的元素

zremrangebyscore

zremrangebyscore key min max
作用: 按照socre来删除元素,删除score在[min,max]之间的

redis 127.0.0.1:6379> zremrangebyscore stu 4 10
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "f"

zremrangebyrank

zremrangebyrank key start end
作用: 按排名删除元素,删除名次在[start,end]之间的

redis 127.0.0.1:6379> zremrangebyrank stu 0 1
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "c"
2) "e"
3) "f"
4) "g"

zrank

zrank key member
查询member的排名(升续 0名开始)

zrevrank

zrevrank key memeber
查询 member的排名(降续 0名开始)

zrange

zrange key start stop [WITHSCORES]
把集合排序后,返回名次[start,stop]的元素
默认是升续排列
Withscores 是把score也打印出来

zrevrange

zrevrange key start stop
作用:把集合降序排列,取名字[start,stop]之间的元素

zrangebyscore

zrangebyscore  key min max [withscores] limit offset N
作用: 集合(升续)排序后,取score在[min,max]内的元素,
并跳过 offset个, 取出N个

redis 127.0.0.1:6379> zadd stu 1 a 3 b 4 c 9 e 12 f 15 g
(integer) 6
redis 127.0.0.1:6379> zrangebyscore stu 3 12 limit 1 2 withscores
1) "c"
2) "4"
3) "e"
4) "9"

zcard

zcard key
返回元素个数

zcount

zcount key min max
返回[min,max] 区间内元素的数量

zinterstore

zinterstore destination numkeys key1 [key2 ...]  [WEIGHTS weight [weight ...]]  [AGGREGATE SUM|MIN|MAX]

求key1,key2的交集,key1,key2的权重分别是 weight1,weight2
聚合方法用: sum |min|max
聚合的结果,保存在dest集合内

注意: weights ,aggregate如何理解?
答: 如果有交集, 交集元素又有socre,score怎么处理?
Aggregate sum->score相加 , min 求最小score, max 最大score

另: 可以通过weigth设置不同key的权重, 交集时,socre * weights

例子:
详见下例
redis 127.0.0.1:6379> zadd z1 2 a 3 b 4 c
(integer) 3
redis 127.0.0.1:6379> zadd z2 2.5 a 1 b 8 d
(integer) 3
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1
1) "b"
2) "a"
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate sum
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate min
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "1"
3) "a"
4) "2"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 weights 1 2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "5"
3) "a"
4) "7"

hash

哈希数据

hset

hset key field value
作用: 把key中 filed域的值设为value
注:如果没有field域,直接添加,如果有,则覆盖原field域的值

hmset

hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen]
作用: 设置field1->N 个域, 对应的值是value1->N

hget

hget key field
作用: 返回key中field域的值

hmget

hmget key field1 field2 fieldN
作用: 返回key中field1 field2 fieldN域的值

hgetall

hgetall key
作用:返回key中,所有域与其值

hdel

hdel key field
作用: 删除key中 field域

hlen

hlen key
作用: 返回key中元素的数量

hexists

hexists key field
作用: 判断key中有没有field域

hinrby

hinrby key field value
作用: 是把key中的field域的值增长整型值value

hinrby

hinrby float  key field value
作用: 是把key中的field域的值增长浮点值value

hkeys

hkeys key
作用: 返回key中所有的field

kvals

kvals key
作用: 返回key中所有的value

其他重要

rpoplpush 场景: task + bak 双链表完成安全队列

Task列表

a b c

bak列表

业务逻辑:

  1. Rpoplpush task bak

  2. 接收返回值,并做业务处理

  3. 如果成功,rpop bak 清除任务. 如不成功,下次从bak表里取任务

Redis中的事务

Redis支持简单的事务

Redis与 mysql事务的对比

Mysql Redis
开启 start transaction muitl
语句 普通sql 普通命令
失败 rollback 回滚 discard 取消
成功 commit exec

注: rollback与discard 的区别

如果已经成功执行了2条语句, 第3条语句出错.

Rollback后,前2条的语句影响消失.

Discard只是结束本次事务,前2条语句造成的影响仍然还在

例子:

我正在买票

Ticket -1 , money -100

而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了—即ticket变成0了.

我该如何观察这种情景,并不再提交

悲观的想法:

世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]

乐观的想法:

没有那么人和我抢,因此,我只需要注意,

–有没有人更改ticket的值就可以了 [乐观锁]

Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

具体的命令

watch
watch key1 key2 ... keyN
作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消

unwatch
unwatch key
作用: 取消所有watch监听

例:
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"

Redis消息订阅

使用办法:

订阅端: Subscribe 频道名称

发布端: publish 频道名称 发布内容

例子

客户端

redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"

服务器

redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1

订阅后只发一次 不能保证网络波动导致的信息丢失 别用了 了解就好

Redis服务器端命令

time
显示服务器时间 , 时间戳(秒), 微秒数
127.0.0.1:6379> time
1) "1614238268"
2) "900549"
dbsize
当前数据库的key的数量
127.0.0.1:6379> dbsize
(integer) 9
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> dbsize
(integer) 0
BGREWRITEAOF
后台进程重写AOF
BGSAVE
后台保存rdb快照
SAVE
保存rdb快照
LASTSAVE
上次保存时间
Slaveof master-Host port
把当前实例设为master的slave
Flushall
清空所有库所有键
Flushdb
清空当前库所有键
Showdown
Showdown [save/nosave]

注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器
然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
文章作者: 杨振宇
文章链接: https://www.yangzhenyu.com.cn/41316/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 杨振宇 个人经验
支付宝打赏
微信打赏