redis基础命令

redis数据类型

基础命令

String

redis中的数据是以键值对的形式存储的,然后存储是以二进制安全的形式进行存储

默认是不支持中文的,但连接的时候可以加上参数–raw,就是以原始的形式进行存储。这样就可以看到中文了

set:set key value 设置一个键值对

get:get key,返回的是值

1
2
3
4
5
127.0.0.1:6379> set name 你好
OK
127.0.0.1:6379> get name
"\xe4\xbd\xa0\xe5\xa5\xbd"
127.0.0.1:6379>
1
2
3
127.0.0.1:6379> get name
你好
127.0.0.1:6379>

del:del key,用来删除一个键

exists:exists key 用来看一个键是否存在

1
2
3
127.0.0.1:6379> exists name
1
127.0.0.1:6379>

返回1表明存在

keys:key * 用来查看所有的键,支持通配符

1
2
3
127.0.0.1:6379> keys *
name
127.0.0.1:6379>

flushall:flushall用来刷新所有的键

TTL:TTL key,用来查看一个键的过期时间

1
2
3
4
5
127.0.0.1:6379> ttl key
-2
127.0.0.1:6379> ttl name
-1
127.0.0.1:6379>

返回-1表示没有过期时间

返回-2表示已经过期

expire:expire key time 设置一个键的过期时间

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> expire name 99
1
127.0.0.1:6379> ttl name
95
127.0.0.1:6379> ttl name
93
127.0.0.1:6379> ttl name
93
127.0.0.1:6379>

setex:setex key time value,设置一个过期时间的键值

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> setex age 99 88
OK
127.0.0.1:6379> ttl age
92
127.0.0.1:6379> ttl age
91
127.0.0.1:6379> ttl age
90
127.0.0.1:6379>

setnx:setnx key value,只有当键不存在的时候才设置值

List

list是一个有序集合,可以重复

lpush:lpush Listname value,添加到头

rpush:rpush Listname value,添加到尾

lrange:lrange Listname start end,查看一个列表

这里index是从0开始的

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> lpush list 88
1
127.0.0.1:6379> lpush list 99
2
127.0.0.1:6379> lpush list 100
3
127.0.0.1:6379> lrange list 0 -1
100
99
88
127.0.0.1:6379>

lpop:lpop Listname,从头部弹出元素

rpop:rpop Listname,从尾部弹出元素

1
2
3
4
5
6
127.0.0.1:6379> lpop list
100
127.0.0.1:6379> lrange list 0 -1
99
88
127.0.0.1:6379>

也可以一次性删除多个元素,后面加上个数就可以了

llen: llen Listname,查看列表的长度

1
2
3
127.0.0.1:6379> llen list
2
127.0.0.1:6379>

ltrim:ltrim name start end,只保留start-end的元素

1
2
3
4
5
6
127.0.0.1:6379> ltrim list 0 -1
OK
127.0.0.1:6379> lrange list 0 -1
99
88
127.0.0.1:6379>

set

没有顺序,不能重复

sadd:sadd name value,添加元素

smembers:smembers name,查看元素

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> sadd class 1 2 3 4 5 8
6
127.0.0.1:6379> smembers
ERR wrong number of arguments for 'smembers' command

127.0.0.1:6379> smembers class
1
2
3
4
5
8
127.0.0.1:6379>

sismember:sismember name value,查看元素是否在set集合中

1
2
3
4
5
127.0.0.1:6379> sismember class 8
1
127.0.0.1:6379> sismember class 6
0
127.0.0.1:6379>

srem:srem name value,删除元素

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> srem class 8
1
127.0.0.1:6379> smembers class
1
2
3
4
5
127.0.0.1:6379>

sortedset

有序集合,每个集合中的元素,都会关联一个浮点类型的分数

按照这个分数进行排序,从小到大

元素是唯一的,但分数是可以重复的

zadd:zadd name score value,插入一个元素

zrange:zrange name start end withscore,查看集合中的元素

1
2
3
4
5
6
7
127.0.0.1:6379> zadd r 800 a 600 b 700 c
3
127.0.0.1:6379> zrange r 0 -1
b
c
a
127.0.0.1:6379>
1
2
3
4
5
6
7
8
127.0.0.1:6379> zrange r 0 -1 withscores
b
600
c
700
a
800
127.0.0.1:6379>

zscore:zscore name value,查看该元素的分数

zrank:zrank name value,查看排名

1
2
3
4
5
127.0.0.1:6379> zrank r b
0
127.0.0.1:6379> zscore r b
600
127.0.0.1:6379>

zrevrank:zrevrank name value,查看排名,从大到小

1
2
3
127.0.0.1:6379> zrevrank r b
2
127.0.0.1:6379>

zrem:zrem name value,删除集合中的元素

hash

hset:hset name key value,设置键值对

hget name key ,获取值

hegt:hgetall name,获取全部的键值对

hdel:hdel name key,删除键值对

hexists:hexists name key,键值对是否存在

hkeys:hkeys name,获取所有键

hlen:hlen name 获取数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> hset person name lihua age 100
2
127.0.0.1:6379> hkeys *

127.0.0.1:6379> hkeys name

127.0.0.1:6379> hkeys person
name
age
127.0.0.1:6379> hlen person
2
127.0.0.1:6379> hgetall person
name
lihua
age
100
127.0.0.1:6379>

发布订阅模式

subscribe:subscribe name,订阅频道

publish:publish name value,发布消息到name

1
2
3
4
5
6
7
8
127.0.0.1:6379> subscribe zhou
subscribe
zhou
1
message
zhou
你好啊

1
2
3
127.0.0.1:6379> publish zhou 你好啊
1
127.0.0.1:6379>

消息无法持久化,无法记录历史消息

stream

xadd name id key value,添加一条消息,id可以使用*自动生成id

xlen name,查看消息的数量

xrange name - +,查看所有的消息

**xdel name id,**删除一条消息

xtrim name maxlen 0,删除所有消息

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> xadd stram 1-0 man 1
1-0
127.0.0.1:6379> xadd stram 2-0 man 2
2-0
127.0.0.1:6379> xrange stram - +
1-0
man
1
2-0
man
2
127.0.0.1:6379> xlen stram
2
127.0.0.1:6379> xadd stram 3-0 man 8
3-0
127.0.0.1:6379> xrange stram 0 2
1-0
man
1
2-0
man
2
127.0.0.1:6379>

xread count 2 block 1000 streams name 0,一次读取两条消息,没有消息阻塞1s,从0开始读取

0可以改成$符号,代表最新的消息

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> xread count 2 block 1000 streams stram 0
stram
1-0
man
1
2-0
man
2
127.0.0.1:6379>

xgruop create name gname id,创建一个消费者组,在创建一个之前没存在的组的时候,需要参数mkstream

xinfo groups name ,查看一个组的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> xgroup create redis group1 0 mkstream
OK
127.0.0.1:6379> xinfo groups redis
name
group1
consumers
0
pending
0
last-delivered-id
0-0
entries-read

lag
0
127.0.0.1:6379>

xgroup createconsumer name group consumer,创建一个消费者

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> xgroup createconsumer redis group1 consumer1
1
127.0.0.1:6379> xgroup createconsumer redis group1 consumer2
1
127.0.0.1:6379> xgroup createconsumer redis group1 consumer3
1
127.0.0.1:6379> xinfo groups redis
name
group1
consumers
3
pending
0
last-delivered-id
0-0
entries-read

lag
0
127.0.0.1:6379>

xreadgroup group gname consumer count 2 block time streams name >,读取最新的消息

1
127.0.0.1:6379> xreadgroup group group1 consumer1 count 2 block 1000 streams redis >

geospatial

geoadd name 经纬度 name,添加一个经纬度

geopos name name,获取一个经纬度

geodist name A B ,计算两个地方的距离,默认是米,加上km为千米

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> geoadd city 116.41667 39.91668 beijing
1
127.0.0.1:6379> geoadd city 116.41667 39.91667 shanghai
1
127.0.0.1:6379> geopos shanghai

127.0.0.1:6379> geopos city beijing
116.41667157411575317
39.91668109162052502
127.0.0.1:6379> geopos city shanghai
116.41667157411575317
39.91667095273589183
127.0.0.1:6379> geodist city beijing shanghai KM
0.0011
127.0.0.1:6379>

geosearch name frommember A byradius 800 KM ,搜索A,⚪800千米以内的地方

1
2
3
4
5
127.0.0.1:6379> geodist city beijing shanghai KM
0.0011
127.0.0.1:6379> geosearch city frommember shanghai byradius 0.0011 KM
shanghai
127.0.0.1:6379>

bitmap

bitmap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。bitmap 支持的最大位数是 232 位,使用 512M 内存就可以存储多达 42.9 亿的字节信息。

1
SETBIT key offset value (offset位偏移量,从0开始)

很适合用于「签到」这类只有两种取值的场景。比如按月存储,一个月最多 31 天,那么我们一个用于再某一个月的签到缓存二进制就是:

1
00000 00000 00000 00000 00000 00000 0

当某天签到将 0 改成 1 即可。

setbit name 第几位bit 1,第几位bit改为1

get bit name bitnumber,获取第几位bit的值

1
2
3
4
5
6
127.0.0.1:6379> SETBIT key1 7 1
0
127.0.0.1:6379> getbit key1 7
1
127.0.0.1:6379> getbit key1 8
0

bitcount name start end,统计start到end1的数量

1
2
127.0.0.1:6379> bitcount key1 0 8
1

BITFIELD key
[GET type offset]
[SET type offset value]
[INCRBY type offset increment]
[OVERFLOW WRAP | SAT | FAIL]

type:字段类型,比如 i8u4,表示有符号/无符号整数,占几位

  • i8:8 位有符号整数(-128 到 127)
  • u4:4 位无符号整数(0 到 15)

offset:字段偏移位(第几个 bit)

  • 支持绝对偏移 05,或相对偏移(比如 #0

value / increment要设置的值或增加的值

1
2
3
4
5
6
7
8
127.0.0.1:6379> bitfield key1 set u8 0 100
1
127.0.0.1:6379> bitfield key1 get u4 0 get u4 4
6
4
127.0.0.1:6379> bitfield key1 get u8 0
100
127.0.0.1:6379>

BITFIELD mykey INCRBY i5 0 1

把从第 0 位开始的 5 位有符号整数加 1

BITFIELD mykey OVERFLOW SAT INCRBY u4 0 10

如果加法结果超出 u4(无符号 4 位整数最大 15),则使用 “饱和” 模式(最大值就是 15)

WRAP(默认):溢出后从头开始(环绕)

SAT:饱和到最大或最小值

FAIL:溢出时返回 null,不更新

签到系统模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 一个用于在 2021 年 8 月第一个签到了
SETBIT user:sign:5:202108 0 1

# 检查某个用户在 2021 年 8 月 3 号是否签到了
GETBIT user:sign:5:202108 2

# 统计某个用户在 2021 年 8 月签到了多少次
BITCOUNT user:sign:5:202108

# 获取某个用户在 2021 年 8 月首次签到
BITPOS user:sign:5:202108 1

# 获取某个用户在 2021 年 8 月首次漏签
BITPOS user:sign:5:202108 0

# 获取偏移量 0 的 3 位无符号整数
BITFIELD user:sign:5:202108 get u3 0