Redis常用命令操作

Redis常用命令操作

1. 数据类型

  • string
  • hash
  • list
  • set
  • sortedset/zset

2. 操作命令

2.1 操作 string

2.1.1 string 基础操作

添加/修改数据

set key value
示例:
127.0.0.1:6379> set username zhangsan
OK

获取数据

get key
示例:
127.0.0.1:6379> get username
"zhangsan"    

删除数据

del key
示例:
127.0.0.1:6379> del username
(integer) 1

判定性添加数据

setnx key value
示例:
127.0.0.1:6379> setnx username zhangsan
(integer) 1
127.0.0.1:6379> setnx username lisi
(integer) 0

添加/修改多个数据

mset key1 value1 key2 value2 …
示例:
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK

获取多个数据

mget key1 key2 …
示例:
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

获取数据字符个数(字符串长度)

strlen key
示例:
127.0.0.1:6379> strlen username
(integer) 8

127.0.0.1:6379> strlen k1
(integer) 2

追加信息到原始信息后部(如果原始信息存在就追加,否则新建)

append key value
示例:
127.0.0.1:6379> append username 1
(integer) 9
127.0.0.1:6379> get username
"zhangsan1"

127.0.0.1:6379> append password 123
(integer) 3
127.0.0.1:6379> get password
"123"

2.1.2 string 扩展操作

设置整形数值数据自增(默认自增1)

incr key
示例:
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3

设置整形数值数据增加指定整数值

语法:
incrby key increment
示例:
127.0.0.1:6379> incrby num 10
(integer) 13

设置数据数据增加指定小数值

语法:
incrbyfloat key increment
示例:
127.0.0.1:6379> incrbyfloat num 1.5
"14.5"

设置整形数值数据自减(默认自减1)

语法:
decr key
示例:
127.0.0.1:6379> set num2 10
OK
127.0.0.1:6379> decr num2
(integer) 9

设置设置整形数值数据减小指定值

语法:
decrby key decrement
示例:
127.0.0.1:6379> decrby num2 2
(integer) 7

设置数据具有指定的生命周期(支持自动过期)

1.单位为秒
语法: 
setex key seconds value
示例:
127.0.0.1:6379> setex code 10 abcd
OK
10秒内获取
127.0.0.1:6379> get code
"abcd"
10秒后获取
127.0.0.1:6379> get code
(nil)

2.单位为毫秒秒
语法: 
psetex key milliseconds value
使用方式一致,不再演示

2.2 操作 hash

2.2.1 hash 基础操作

添加、修改数据

语法1-单值保存:
hset key field value
示例:
127.0.0.1:6379> hset user:001 name zhangsan
(integer) 1

语法2-批量保存:
hmset key field1 value1 field2 value2 …
示例:
127.0.0.1:6379> hmset user:001 password 123 age 18
OK

语法3-设置field的值,如果该field存在则不做任何操作:
hsetnx key field value
示例:
127.0.0.1:6379> hsetnx user:001 name lisi
(integer) 0

根据key和field获取单个vlaue

语法:
hget key field
示例:
127.0.0.1:6379> hget user:001 name
"zhangsan"

根据key获取所有的field和value

语法:
hgetall key
示例:
127.0.0.1:6379> hgetall user:001
1) "name"
2) "zhangsan"
3) "password"
4) "123"
5) "age"
6) "18"

删除数据

语法:
hdel key field1 [field2 field3...]
示例:
127.0.0.1:6379> hdel user:001 name
(integer) 1

127.0.0.1:6379> hdel user:001 password age
(integer) 2

根据key获取field的数量

语法:
hlen key
示例:
127.0.0.1:6379> hmset user:001 name zhangsan password 123 age 18
OK
127.0.0.1:6379> hlen user:001
(integer) 3

判断指定field是否存在

语法:
hexists key field
示例:
127.0.0.1:6379> hexists user:001 name
(integer) 1
127.0.0.1:6379> hexists user:001 name111
(integer) 0

2.2.2 hash 扩展操作

根据key获取所有的字段名field

语法:
hkeys key
示例:
127.0.0.1:6379> hkeys user:001
1) "name"
2) "password"
3) "age"

根据key获取所有的字段值value

语法:
hvals key
示例:
127.0.0.1:6379> hvals user:001
1) "zhangsan"
2) "123"
3) "18"

设置指定字段的数值数据增加指定范围的值

语法:
hincrby key field increment
hincrbyfloat key field increment
示例:
127.0.0.1:6379> hget user:001 age
"18"
127.0.0.1:6379> hincrby user:001 age 1
(integer) 19
127.0.0.1:6379> hincrby user:001 age -2
(integer) 17

2.3 操作list

2.3.1 list 基础操作

添加数据

  • 从左侧添加
语法:
lpush key value1 [value2 value3...]
示例:
127.0.0.1:6379> lpush list1 a b c
(integer) 3

当前数据为: c b a

  • 从右侧添加
语法:
rpush key value1 [value2 value3...]
示例:
127.0.0.1:6379> rpush list1 d e f
(integer) 6

当前数据为: c b a d e f

获取数据

  • 范围获取
语法:
lrange key start stop
示例1:
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
示例2:
127.0.0.1:6379> lrange list1 0 2
1) "c"
2) "b"
3) "a"
示例3:
127.0.0.1:6379> lrange list1 -3 -1
1) "d"
2) "e"
3) "f"

获取规则:

  1. 从左到右,索引分别为0、1、2、3、4...

    如:c(0) b(1) a(2) d(3) e(4) f(5)

  2. 从右到左,索引分别为 -1、-2、-3、-4...

    如:c(-6) b(-5) a(-4) d(-3) e(-2) f(-1)

  • 获取指定索引的value
语法:
lindex key index
示例:
127.0.0.1:6379> lindex list1 0
"c"
127.0.0.1:6379> lindex list1 1
"b"
127.0.0.1:6379> lindex list1 -1
"f"
  • 移除并返回最左侧或最右侧的元素
语法:
lpop key
rpop key
示例:
127.0.0.1:6379> lpop list1
"c"
127.0.0.1:6379> rpop list1
"f"
  • 根据key获取value的个数
语法:
llen key
示例:
127.0.0.1:6379> llen list1
(integer) 4

2.3.2 list 扩展操作

删除指定key中指定数量的field

语法:
lrem key count value
示例:
127.0.0.1:6379> rpush list2 a b b b b c d d d d
(integer) 10
127.0.0.1:6379> lrem list2 4 b
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"
3) "d"
4) "d"
5) "d"
6) "d"
127.0.0.1:6379> lrem list2 5 d
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"

规定时间内获取并移除数据

语法:
blpop key1 [key2 key3...] timeout
brpop key1 [key2 key3...] timeout
示例:
127.0.0.1:6379> lpush a a1
(integer) 1
127.0.0.1:6379> lpush b b1
(integer) 1
127.0.0.1:6379> lpush c c1
(integer) 1
127.0.0.1:6379> blpop a b c 5
1) "a"
2) "a1"
127.0.0.1:6379> blpop a b c 5
1) "b"
2) "b1"
127.0.0.1:6379> blpop a b c 5
1) "c"
2) "c1"
127.0.0.1:6379> blpop a b c 5
(nil)
(5.76s)

最后一次没有获取到数据,但是如果在等待的5秒中之内,另一个连接向 a b c 任意一个key中存入了value,则可以获取到数据,操作如下:

  1. 在当前连接窗口中执行指定时间内获取命令,命令会处于等待状态
127.0.0.1:6379> blpop a b c 20
|
  1. 打开一个新的连接,20秒之内在新连接窗口中向a或b或c中存入数据
127.0.0.1:6379> lpush a a1
(integer) 1
  1. 窗口1会立马获取到向a中存入的数据
127.0.0.1:6379> blpop a b c 20
1) "a"
2) "a1"
(3.05s)

规定时间内取出一个list的尾部元素并添加到另一个list的头部

语法:
brpoplpush source destination timeout
source:被移除的list
destination:要添加的list
示例:
127.0.0.1:6379> rpush list3 a b c
(integer) 3
127.0.0.1:6379> lrange list3 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpush list4 aa bb cc
(integer) 3
127.0.0.1:6379> lrange list4 0 -1
1) "aa"
2) "bb"
3) "cc"
127.0.0.1:6379> brpoplpush list3 list4 10
"c"
127.0.0.1:6379> lrange list3 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lrange list4 0 -1
1) "c"
2) "aa"
3) "bb"
4) "cc"

2.4 操作 set

2.4.1 set 基础操作

添加数据

语法:
sadd key member1 [member2]
示例:
127.0.0.1:6379> sadd set1 a a b c d
(integer) 4

获取全部数据

语法:
smembers key
示例:
127.0.0.1:6379> smembers set1
1) "a"
2) "d"
3) "c"
4) "b"

删除数据

语法:
srem key member1 [member2]
示例:
127.0.0.1:6379> srem set1 a b
(integer) 2
127.0.0.1:6379> smembers set1
1) "d"
2) "c"

获取集合数据member的个数

语法:
scard key
示例:
127.0.0.1:6379> scard set1
(integer) 2

判断集合中是否包含指定数据

语法:
sismember key member
示例:
127.0.0.1:6379> sismember set1 d
(integer) 1
127.0.0.1:6379> sismember set1 ddd
(integer) 0

随机获取集合中[指定数量]的数据

语法:
srandmember key [count]
示例:
127.0.0.1:6379> sadd set2 a b c d e f g h i
(integer) 9
127.0.0.1:6379> srandmember set2
"b"
127.0.0.1:6379> srandmember set2
"b"
127.0.0.1:6379> srandmember set2
"h"
127.0.0.1:6379> srandmember set2
"e"
127.0.0.1:6379>  
127.0.0.1:6379> srandmember set2 3
1) "f"
2) "e"
3) "h"
127.0.0.1:6379> srandmember set2 3
1) "d"
2) "c"
3) "i"
127.0.0.1:6379> srandmember set2 3
1) "e"
2) "h"
3) "g"

随机移除并返回集合中的某个数据

语法:
spop key
示例:
127.0.0.1:6379> spop set2
"i"
127.0.0.1:6379> spop set2
"d"
127.0.0.1:6379> smembers set2
1) "a"
2) "h"
3) "f"
4) "b"
5) "e"
6) "g"
7) "c"

2.4.1 set 扩展操作

求多个集合的交、并、差集

  • 交集
语法:
sinter key1 [key2 …]  
示例:
127.0.0.1:6379> sadd s1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd s2 a bb c dd e ff
(integer) 6
127.0.0.1:6379> sinter s1 s2
1) "c"
2) "a"
3) "e"
  • 并集
语法:
sunion key1 [key2 …]  
示例:
127.0.0.1:6379> sunion s1 s2
1) "f"
2) "dd"
3) "b"
4) "a"
5) "d"
6) "bb"
7) "e"
8) "c"
9) "ff"
  • 差集
语法:
sdiff key1 [key2 …]
示例:
127.0.0.1:6379> sdiff s1 s2
1) "f"
2) "d"
3) "b"
127.0.0.1:6379> sdiff s2 s1
1) "ff"
2) "dd"
3) "bb"

求多个集合的交、并、差集并存储到指定集合中

语法:
交集: sinterstore destination key1 [key2 …]  
并集: sunionstore destination key1 [key2 …]  
差集: sdiffstore destination key1 [key2 …]
示例(以交集为例):
127.0.0.1:6379> smembers s3
(empty list or set)
127.0.0.1:6379> sinter s1 s2
1) "a"
2) "e"
3) "c"
127.0.0.1:6379> sinterstore s3 s1 s2
(integer) 3
127.0.0.1:6379> smembers s3
1) "e"
2) "a"
3) "c"

将指定数据从原始集合中移动到目标集合中

语法:
smove source destination member
示例:
127.0.0.1:6379> smembers s4
(empty list or set)
127.0.0.1:6379> smove s1 s4 a
(integer) 1
127.0.0.1:6379> smembers s4
1) "a"
127.0.0.1:6379> smembers s1
1) "e"
2) "d"
3) "c"
4) "f"
5) "b"

2.5 key 的操作

2.5.1 key 的基本操作

删除指定key(根据key删除任意类型数据)

语法:
del key
示例1-删除string:
127.0.0.1:6379> set aa bb
OK
127.0.0.1:6379> get aa
"bb"
127.0.0.1:6379> del aa
(integer) 1
127.0.0.1:6379> get aa
(nil)
示例2-删除hash:
127.0.0.1:6379> hset hash1 k1 v1
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "k1"
2) "v1"
127.0.0.1:6379> del hash1
(integer) 1
127.0.0.1:6379> hgetall hash1
(empty list or set)

...其它数据类型同理...

判断key是否存在

语法:
exists key
示例:
127.0.0.1:6379> set aaa bbb
OK
127.0.0.1:6379> exists aaa
(integer) 1
127.0.0.1:6379> exists bbb
(integer) 0

获取key的类型

语法:
type key
示例:
127.0.0.1:6379> set mystring hellostring
OK
127.0.0.1:6379> hset myhash k1 v1
(integer) 1
127.0.0.1:6379> type mystring
string
127.0.0.1:6379> type myhash
hash

对list、set中的数值数据进行排序

语法:
sort key
sort key desc
示例:
127.0.0.1:6379> del list1
(integer) 0
127.0.0.1:6379> lpush list1 11 2 33 7 5 18
(integer) 6
127.0.0.1:6379> sort list1
1) "2"
2) "5"
3) "7"
4) "11"
5) "18"
6) "33"
127.0.0.1:6379> sort list1 desc
1) "33"
2) "18"
3) "11"
4) "7"
5) "5"
6) "2"

对list、set中的字符串数据进行排序

语法:
sort key alpha
sort key desc alpha
示例:
127.0.0.1:6379> del list2
(integer) 0
127.0.0.1:6379> lpush list2 a b c d
(integer) 4
127.0.0.1:6379> sort list2
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> sort list2 alpha
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> sort list2 desc alpha
1) "d"
2) "c"
3) "b"
4) "a"

重命名key

语法1-如果新的key已存在会先删除新key然后在重命名:
rename key newkey
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> set username2 lisi
OK
127.0.0.1:6379> rename username username2
OK
127.0.0.1:6379> get username
(nil)
127.0.0.1:6379> get username2
"zhangsan"

语法2-如果新的key不存在则重命名:
renamenx key newkey
示例:
127.0.0.1:6379> set username3 wangwu
OK
127.0.0.1:6379> renamenx username2 username3
(integer) 0
127.0.0.1:6379> renamenx username2 username4
(integer) 1
127.0.0.1:6379> get username4
"zhangsan"

2.5.2 key 的扩展操作

获取key的有效时间

语法1-获取秒为单位的时效:
ttl key
语法2-获取毫秒为单位的时效:
pttl key
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> ttl username
(integer) -1
127.0.0.1:6379> ttl username2
(integer) -2
127.0.0.1:6379> setex username3 30 wangwu
OK
127.0.0.1:6379> ttl username3
(integer) 21
127.0.0.1:6379> pttl username3
(integer) 15840

返回-1代表key没有设置有效时间,返回-2代表key不存在

为指定key设置有效期

语法:
expire key seconds
pexpire key milliseconds
示例:
127.0.0.1:6379> del hash1
(integer) 0
127.0.0.1:6379> hset hash1 k1 v1
(integer) 1
127.0.0.1:6379> ttl hash1
(integer) -1
127.0.0.1:6379> expire hash1 30
(integer) 1
127.0.0.1:6379> ttl hash1
(integer) 20

127.0.0.1:6379> del hash2
(integer) 1
127.0.0.1:6379> hset hash2 k2 v2
(integer) 1
127.0.0.1:6379> ttl hash2
(integer) -1
127.0.0.1:6379> pexpire hash2 30000
(integer) 1
127.0.0.1:6379> ttl hash2
(integer) 26
127.0.0.1:6379> pttl hash2
(integer) 21380

切换key从时效性转换为永久性

语法:
persist key
示例:
127.0.0.1:6379> del username
(integer) 0
127.0.0.1:6379> setex username 60 zhangsan
OK
127.0.0.1:6379> ttl username
(integer) 55
127.0.0.1:6379> persist username
(integer) 1
127.0.0.1:6379> ttl username
(integer) -1

查找key

语法:
keys pattern
示例:
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> set username1 zhangsan1
OK
127.0.0.1:6379> set username2 zhangsan2
OK
127.0.0.1:6379> set username3 zhangsan3
OK
127.0.0.1:6379> keys *
1) "username3"
2) "username1"
3) "username2"
127.0.0.1:6379> keys username*
1) "username3"
2) "username1"
3) "username2"
127.0.0.1:6379> keys *3
1) "username3"

2.6 db 常用指令

2.6.1 存在的问题

redis在使用过程中,伴随着操作数据量的增加,会出现大量的数据以及对应的key。这是key重名冲突的几率就比较高。要解决这个问题,除了我们在命名时尽量做到统一和规范以外,redis 自身也提供了一个解决机制。

2.6.2 解决方式

redis为每个服务提供有16个数据库,编号从0到15,每个数据库之间是相互独立的。如果没有进行过特殊设置,默认使用的是0号数据库。

2.6.3 db 基础操作

切换数据库

语法:
select index
示例:
select 1

2.6.4 db 扩展操作

数据移动

语法:
move key index
示例:
move username 1

统计当前db中key的数量

语法:
dbsize
示例:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 1

清除数据

语法1-清除当前db中所有数据:
flushdb
语法2-清除所有db中的数据:
flushall
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容