0%

redis | 基本数据类型

这里讲一下 redis 的基本数据类型。

  • string
  • list
  • hash
  • set
  • zset

string

1
2
3
4
5
set name 111 # 将 111 赋值给 key == name
get name # 获取 key == name 值
type name # 获取 key == name 的类型
append name 111 # 向 key == name 的值后面追加 111,如果当前 key 不存在,则新建
strlen name # key == name 的长度

加一减一的操作

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> set a 0
OK
127.0.0.1:6379> get a
"0"
127.0.0.1:6379> incr a
(integer) 1
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> decr a
(integer) 1

比如,点赞等操作,热门文章不必每次都存到数据库,可以先到缓存中。

步长

1
2
3
4
5
6
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> incrby a 10
(integer) 11
127.0.0.1:6379> decrby a 9
(integer) 2

截取

1
2
3
4
5
6
127.0.0.1:6379> set a hello,world
OK
127.0.0.1:6379> getrange a 0 4
"hello"
127.0.0.1:6379> getrange a 0 -1
"hello,world"

替换

1
2
3
4
5
6
127.0.0.1:6379> get a
"hello,world"
127.0.0.1:6379> setrange a 1 ooo
(integer) 11
127.0.0.1:6379> get a
"hoooo,world"

设置过期时间

1
2
3
set name 111 # 将 111 赋值给 key == name
expire name 10 # key == name 的值,10秒钟过期
setex name 10 value # 直接设置 key == name 的值,10 秒后过期

使用如下

1
2
3
4
127.0.0.1:6379> setex a 3 "ii"
OK
127.0.0.1:6379> ttl a
(integer) -2

setnx

如果不存在就设置,如果存在就不设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setnx a 111
(integer) 1
127.0.0.1:6379> get a
"111"
127.0.0.1:6379> setnx a 222
(integer) 0
127.0.0.1:6379> get a
"111"
127.0.0.1:6379> set a 222
OK
127.0.0.1:6379> get a
"222"

批量设置

这是源自操作。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"

同样也存在 msetnx 这个,不再赘述。

key 的巧妙运用

redis 支持 name:{id}:{filed} 来设置。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set article:1:view 1
OK
127.0.0.1:6379> set article:2:view 2
OK
127.0.0.1:6379> get article:1
(nil)
127.0.0.1:6379> get article:1:view
"1"

解释一下,就是设置 第一篇文章的浏览量。 article:1:view

组合命令

先获取后设置,并返回前一个值,如果没有,返回 null

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> getset a 1
(nil)
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> getset a 2
"1"
127.0.0.1:6379> get a
"2"

list

1
2
3
4
5
6
7
8
9
10
11
lpush list one # 向 name = listlist 左插 one
rpush list onr # 向 name = listlist 右插 onr
lrange list 0 -1 # 获取 name = listlist 的值
lpop list # 移除 name = listlist 左边的值
rpop list # 移除 name = listlist 右边的值
lindex list 1 # 通过下标获得值
llen list # 返回 list 长度
lrem list 1 one # 移除 name = list 中 值为 one 的值,并且只移除 1
lrem list 2 one # 移除 name = list 中 值为 one 的值,并且只移除 2 个,多些移除数量不会报错
lrem list 0 one # 移除 name= list 中所有的 one 值
ltrim list 1 2 # ltrim 裁剪,将 name = listlist 下标 1 - 2 裁剪出来,直接影响原来的 list

组合命令

1
rpoplpush list list2 # 移除 list 右边最后一个值,并且放到 list2 中,可保持原子性

lset

设置固定下标的值为什么值

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> lset list 0 item # 没有 list ,数据库清空
(error) ERR no such key
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "1"
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 item2 # 数组越界
(error) ERR index out of range

插入值

  • before
  • after
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush list 1
(integer) 1
127.0.0.1:6379> rpush list 2
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
127.0.0.1:6379> linsert list before 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "3"
3) "2"

set

无序不重复

添加和获取

1
2
3
4
5
6
127.0.0.1:6379> sadd set 1
(integer) 1
127.0.0.1:6379> sadd set 1
(integer) 0
127.0.0.1:6379> smembers set
1) "1"

基础命令

1
2
3
4
5
sismember set 1 # set 是否存在 1
scard set # set 的元素数量
srem set 1 # 移除 set 中的 1
srandmember set 1 # 随机获取 set 中的 1 个元素
spop set # 随机移除一个元素

组合命令

1
smove set1 set2 1 # 将 set1 中的 1 移动到 set2

差集交集并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd set1 1
(integer) 1
127.0.0.1:6379> sadd set2 2
(integer) 1
127.0.0.1:6379> sadd set2 1
(integer) 1
127.0.0.1:6379> sdiff set1 set2 # 差集
(empty list or set)
127.0.0.1:6379> sinter set1 set2 # 交集
1) "1"
127.0.0.1:6379> sunion set1 set2 # 并集
1) "1"
2) "2"

hash

map 集合,有一个限制,key/value 都得是 str.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset hash key1 value1 # set hash
(integer) 1
127.0.0.1:6379> hget hash key1
"value1"
127.0.0.1:6379> hmset hash key2 value2 key3 value3 # set 多个 值
OK
127.0.0.1:6379> hmget hash key1 key2 # 获取多个值
1) "value1"
2) "value2"
127.0.0.1:6379> hgetall hash # 获取所有
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "value3"
127.0.0.1:6379> hdel hash key1 # 删除某一个 key
(integer) 1
127.0.0.1:6379> hgetall hash
1) "key2"
2) "value2"
3) "key3"
4) "value3"
127.0.0.1:6379> hlen hash # 获取长度
(integer) 2
127.0.0.1:6379> hexists hash key2 # 判断 key2 是否存在
(integer) 1
127.0.0.1:6379> hkeys hash # 只获取 key
1) "key2"
2) "key3"
127.0.0.1:6379> hvals hash # 只获取 value
1) "value2"
2) "value3"
127.0.0.1:6379> hset hash key3 5
(integer) 0
127.0.0.1:6379> hgetall hash
1) "key2"
2) "value2"
3) "key3"
4) "5"
127.0.0.1:6379> hincrby hash key3 1 # 自增某一个值,没有自减
(integer) 6
127.0.0.1:6379> hgetall hash
1) "key2"
2) "value2"
3) "key3"
4) "6"

zset

有序集合,这个用的时候再查资料吧,不想过多解释一些基础数据结构了。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd set1 1 one
(integer) 1
127.0.0.1:6379> zadd set1 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange set1 0 -1
1) "one"
2) "two"
3) "three"
请我喝杯咖啡吧~