Redis restudy 3 List Set Hash
uwupu 啦啦啦啦啦

List

列表。

应用场景

栈,队列,阻塞队列。

消息队列。

命令

lpush, rpush, lrange

lpush key value [value ...]:向key列表的头部插入值;

rpush key value [value ...]:向key列表的尾部插入值

lrange key a b:查询key列表a-b的值,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
127.0.0.1:6379> lpush l1 one #在列表头部插入值
(integer) 1
127.0.0.1:6379> lpush l1 two
(integer) 2
127.0.0.1:6379> lpush l1 three four
(integer) 4
127.0.0.1:6379> lrange l1 0 -1 #查询列表中所有值
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrange l1 0 1 # 查询列表中0-1的值
1) "four"
2) "three"
127.0.0.1:6379> rpush l1 five # 列表尾部插入值
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
5) "five"

lpop, rpop

lpop key:移除列表头部的元素

rpop key:移除列表尾部的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> lrange l1 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
5) "five"
127.0.0.1:6379> lpop l1
"four"
127.0.0.1:6379> rpop l1
"five"
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "two"
3) "one"

lindex, llen

lindex key index:获取key中index位置的值。

llen key:获取列表的长度。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lindex l1 2 # 获取index为2的值
"one"
127.0.0.1:6379> llen l1 # 获取列表长度
(integer) 3

lrem

lrem key count value :移除指定数量的value值。精确匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> lpush l1 one two three one one  # 向列表l1插入值
(integer) 5
127.0.0.1:6379> lrange l1 0 -1 # 获取值
1) "one"
2) "one"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> lrem l1 1 three #移除1个three
(integer) 1
127.0.0.1:6379> lrem l1 2 one # 移除2个one
(integer) 2
127.0.0.1:6379> lrange l1 0 -1
1) "two"
2) "one"

ltrim key start stop:裁剪列表,保留start-stop中的元素;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> lpush l1 one two three four five
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> ltrim l1 1 3 # 裁剪列表,留下index为1-3的元素
OK
127.0.0.1:6379> lrange l1 0 -1
1) "four"
2) "three"
3) "two"

rpoplpush

rpoplpush source destination:从列表source的尾部取出元素,插入到列表destination列表的尾部;

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> lrange l1 0 -1
1) "four"
2) "three"
3) "two"
127.0.0.1:6379> rpoplpush l1 l2
"two"
127.0.0.1:6379> lrange l1 0 -1
1) "four"
2) "three"
127.0.0.1:6379> lrange l2 0 -1
1) "two"

lset

lset key index value :设置index位置的值为value

  • 只能设置key存在的列表,若key不存在则报错
    • (error) ERR no such key
  • 不返回原值。
1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> lpush l1 one two three
(integer) 3
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lset l1 1 four # 设置index为1的值为four
OK
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "four"
3) "one"

linsert

linsert key BEFORE|AFTER pivot element

  • 向值为pivot的位置的前面或后面插入值element。
1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "four"
3) "one"
127.0.0.1:6379> linsert l1 before four other # 向four的前面插入other
(integer) 4
127.0.0.1:6379> lrange l1 0 -1
1) "three"
2) "other"
3) "four"
4) "one"

其他

  1. 本质为一个“链表”
  2. 在两边插入或改动值,效率最高!

Set

集合

set中的值不能重复。

sadd, smembers, sismember, scard

sadd key value [value ...]:向集合添加元素

smembers key:查看元素成员列表

sismember key value:查询value是否为key集合的成员

scard key:获取集合中成员数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> sadd s1 hello  # 向集合添加元素
(integer) 1
127.0.0.1:6379> sadd s1 yn
(integer) 1
127.0.0.1:6379> sadd s1 llllyn
(integer) 1
127.0.0.1:6379> smembers s1 # 查询集合成员
1) "yn"
2) "llllyn"
3) "hello"
127.0.0.1:6379> sismember s1 hello # 查看集合中是否存在某个值
(integer) 1
127.0.0.1:6379> sismember s1 word
(integer) 0
127.0.0.1:6379> scard s1 #获取s1集合中成员数量
(integer) 3

srem

srem key value:移除指定值

srandmember key count:随机取出集合中元素,count为数量,count默认为1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> smembers s1  #获取集合s1成员
1) "yn"
2) "llllyn"
3) "hello"
127.0.0.1:6379> srem s1 yn # 移除s1中值为yn的成员
(integer) 1
127.0.0.1:6379> smembers s1 #获取集合s1中成员
1) "llllyn"
2) "hello"
127.0.0.1:6379> SRANDMEMBER s1 # 在集合s1中随机取出元素
"llllyn"
127.0.0.1:6379> SRANDMEMBER s1
"llllyn"
127.0.0.1:6379> SRANDMEMBER s1
"hello"
127.0.0.1:6379> SRANDMEMBER s1 2
1) "llllyn"
2) "hello"

spop

spop key [count]:随机弹出元素,count为数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> smembers s1
1) "llllyn"
2) "one"
3) "hello"
4) "four"
5) "three"
6) "two"
127.0.0.1:6379> spop s1 # 随机删除元素
"hello"
127.0.0.1:6379> spop s1
"three"
127.0.0.1:6379> spop s1 2
1) "two"
2) "four"

smove

smove key1 key2 value:将一个集合中指定的值移动到另一个集合中。

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> smembers s1  # s1集合中
1) "one"
2) "two"
127.0.0.1:6379> smembers s2 # s2集合中
1) "three"
127.0.0.1:6379> smove s1 s2 two #将s1集合中two移动到s2集合中
(integer) 1
127.0.0.1:6379> smembers s1
1) "one"
127.0.0.1:6379> smembers s2
1) "two"
2) "three"

sdiff, sinter, sunion

sdiff set1 set2:获得set1与set2的差集

sinter s1 s2:查询s1和s2的交集

sunion s1 s2:查询s1和s2的并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> sadd s2 c d e
(integer) 3
127.0.0.1:6379> sdiff s1 s2 # 差集
1) "b"
2) "a"
127.0.0.1:6379> sinter s1 s2 # 交集
1) "c"
127.0.0.1:6379> sunion s1 s2 #并集
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"

Hash(哈希)

key-<key-value> key-Map

值为map集合;

hset, hget, hmget, hmset, hgetall

hset key field value:设置值

hget key field:获取值

hmset key field value [field value ...]:设置多个值

hmget key field [field...]:获取多个值

hgetall key:获取所有值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:6379> hset h1 f1 hello  #设置h1哈希的f1值为hello
(integer) 1
127.0.0.1:6379> hget h1 f1 #获取h1哈希的f1值
"hello"
127.0.0.1:6379> hmset h1 f2 world f3 one f4 two #设置多个值
OK
127.0.0.1:6379> hmget h1 f1 f2 f3 f4 #获取多个值
1) "hello"
2) "world"
3) "one"
4) "two"
127.0.0.1:6379> hgetall h1 #获取所有值
1) "f1"
2) "hello"
3) "f2"
4) "world"
5) "f3"
6) "one"
7) "f4"
8) "two"

hdel, hlen

hdel key field [field ...]:删除指定key的field,对应value同时会消失

hlen key:获取hash长度

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> hdel h1 f1 f2 f3  #删除h1的f1,f2,f3
(integer) 3
127.0.0.1:6379> hgetall h1 #获取h1的所有字段
1) "f4"
2) "two"
127.0.0.1:6379> hlen h1 #获取h1的长度
(integer) 1
127.0.0.1:6379> hset h1 f1 one f2 three #添加字段
(integer) 2
127.0.0.1:6379> hlen h1
(integer) 3

hexists key field:判断key的field是否存在

hkeys key:获取所有field

hvals key:获取所有values

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> hgetall h1
1) "f4"
2) "two"
3) "f1"
4) "one"
5) "f2"
6) "three"
127.0.0.1:6379> hexists h1 f1 #查看f1是否存在
(integer) 1
127.0.0.1:6379> hexists h1 f5 #查看f5是否存在
(integer) 0
127.0.0.1:6379> hkeys h1 #获取h1的所有field
1) "f4"
2) "f1"
3) "f2"
127.0.0.1:6379> hvals h1 #获取h1的所有value
1) "two"
2) "one"
3) "three"

hincrby, hsetnx

hincrby key field increment:执行自增,可以指定增量

hsetnx key field value:与set一致,不同的是仅用于“key值不存在”时,若存在则不进行

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> hset h2 f1 3  # 设置值
(integer) 1
127.0.0.1:6379> hincrby h2 f1 10 #值自增,指定增量为10
(integer) 13
127.0.0.1:6379> hget h2 f1 #获取值
"13"
127.0.0.1:6379> hsetnx h2 f2 4 #若f2不存在,则进行
(integer) 1 #进行成功
127.0.0.1:6379> hsetnx h2 f2 10 #上面有f2了
(integer) 0 #失败

技巧

对象存储

设置user的id为1的用户,name为ZhangSan,age为16。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hset user:1 name ZhangSan
(integer) 1
127.0.0.1:6379> hset user:1 age 16
(integer) 1
127.0.0.1:6379> hgetall user:1
1) "name"
2) "ZhangSan"
3) "age"
4) "16"
 评论