RedisCommendStudy

Redis常用指令

1、字符串String

redis中是使用字符串保存数值的,所以可以将数字或者布尔值也设置为value,具体的键和值都是大小写敏感的

设置一个键值对
1
SET key value

input: set cqupt 3G
receive: OK

获取键对应的值
1
GET key

input: get cqupt
receive: “3G”

删除键值对
1
DEL key

input: del cqupt

receive: (integer) 1

在删除后再获取

input: get cqupt
receive: (nil)

判断一个键是否存在
1
EXISTS key

input: EXISTS cqupt

receive: (integer) 0 表示不存在

重新创建之后再exists就会发现返回(integer) 1

查看存在哪些键
1
KEYS pattern

pattern是一个模式,支持正则表达式

例如 keys * 表示查找所有的键

keys CQ* 表示所有以CQ开头的键

删除所有的键
1
FLUSHALL

删除之后再keys *

得到(empty list or set)的回显

CLI的中文显示设置

可以正常存储,但是直接打开redis-cli的话只能看到对应的十六进制数

1
redis-cli --raw
清空屏幕
1
clear
设置带有过期时间的键值对

TTL: Time To Live

查看过期时间
1
TTL key

input: TTL cqupt

receive: -1 说明没有设置过期时间

设置过期时间
1
TTL key duration

input: TTL cqupt 10 // 设置10秒后过期

receive: 1

最后TTL key,收到-2,说明键值对已经过期

最后再GET key ,没有输出,而且KEYS key也没有显示

使用SETEX设置带有过期时间的键值对
1
SETEX key duration value

input: setex name 5 你好

receive: OK

在键不存在时设置键的值
1
SETNX key value

2、列表List

将元素添加到列表的头部或尾部

1
2
LPUSH key value 
RPUSH key value

LPUSH letter a

LPUSH letter b

获取列表内容

1
LRANGE key start stop

LRANGE letter 0 -1 -1表示到最后一个元素

添加多个元素

1
LPUSH key element [element ...]

LPUSH letter c d e

> LRANGE letter 0 -1 1) “e” 2) “d” 3) “c” 4) “c” 5) “b” 6) “a”

可以看到顺序是反的

删除头部或尾部的元素

1
2
LPOP key [count]
RPOP key [count]

RPOP letter

一次删除多个元素

LPOP letter 2

查看列表的长度

1
LLEN key

RPOPLPUSH实现一个简单的消息队列

删除列表中指定范围以外的元素

1
LTRIM key start stop

意思是只保留start和stop之内的元素

LTRIM letter 1 3

3、集合Set

set和列表的区别

set是无序的,但是元素不能重复;list是有序的,元素可以重复

向set中添加元素

1
SADD key member [member ...]

例如:

SADD course Redis

或者:

SADD course Redis MySQL

查看集合中的元素

1
SMEMBERS key

> SMEMBERs course

1)”MySQL”

  1. “Redis”

判断一个元素是否在集合中

1
SISMEMBER key member

删除集合中的元素

1
SREM key member [member ...]

计算集合的交集

1
SINTER key [key ...]

计算集合的差集

1
SDIFF key [key ...]

计算集合的并集

1
SUNION key [key ...]

4、有序集合SortedSet

集合中的每个元素都会关联一个浮点类型的分数,根据这个分数从小到大排序

成员是唯一的,但是分数是可以重复的

向有序集合中添加元素

1
2
3
4
5
6
7
8
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

Required key
Optional [NX | XX]
Optional [GT | LT]
Optional [CH]
Optional [INCR]
Multiple score member

例如:

input: ZADD result 680 清华 660 北大 650 复旦 640 浙大

result: 4

查看有序集合中的元素

1
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

例如

127.0.0.1:6379> ZRANGE result 0 -1
浙大
复旦
北大
清华

在输出成员的时候输出分数

127.0.0.1:6379> ZRANGE result 0 -1 WITHSCORES
浙大
640
复旦
650
北大
660
清华
680

查看某个成员的值

1
ZSCORE key member

查看某个成员的排名

1
ZRANK key member [WITHSCORE]

查看从大到小的排名

1
ZREVRANK key member [WITHSCORE]

删除有序集合中的某个成员

1
ZREM key member [member ...]

5、哈希Hash

向hash中添加一个键值对

1
HSET key field value [field value ...]

input: HSET person name WCL

input: HSET person age 20

也可以是

intput: HSET person name WCL age 20

获取hash中的某个键值对

1
HGET key field

input: HGET person name

result: “WCL”

获取hash中的所有键值对

1
HGETALL key

input: HGETALL person

result: \1) “name” 2) “WCL” 3) “age” 4) “20”

删除hash中的某个键值对

1
HDEL key field [field ...]

input: HDEL person age

判断某个键值对是否存在

1
HEXISTS key field

input: HEXISTS person name

获取hash中的所有键

1
HKEYS key

input: HKEYS person

result: 1) “name”

获取所有键的数量

1
HLEN key

input: HLEN person

result: (integer) 1

6、发布订阅模式

可以有多个订阅,这样在一个频道发布消息的时候,所有的订阅频道就会收到消息

订阅一个频道

1
SUBSCRIBE channel [channel ...]

发布消息

1
PUBLISH channel message

7、消息队列Stream

向Stream中添加消息

1
XADD key [NOMKSTREAM] [MAXLEN | MINID [= | ~] threshold [LIMIT count]] * | id field value [field value ...]

input:

XADD geekhour * course redis // * 表示让redis自己指定id,同时保证id是自增的

result: (消息id)

“1693972260450-0”

XADD geekhour * course git

“1693972263302-0”

XADD geekhour * course docker

“1693972270408-0”

指定ID添加消息

id格式是:时间戳-序列号

XADD geekhour 1-0 course git

XADD geekhour 2-0 course docker

XADD geekhour 3-0 course docker

查看stream中消息的数量

1
XLEN key

input:

XLEN geekhour

result:

(integer) 3

查看消息的详细内容

1
XRANGE key start end [COUNT count]

可以用 - + 代表全体

XRANGE geekhour - +

image-20230906115452722

删除消息

1
XDEL key id [id ...]

image-20230906115634274

1
XTRIM key MAXLEN | MINID [= | ~] threshold [LIMIT count]

XTRIM geekhour MAXLEN 0 // 表示删除所有消息

image-20230906115847294

读取消息

1
2
3
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
// COUNT 是指定一次获取的消息数量
// BLOCK 是指定没有获取到消息时阻塞的时间,单位毫秒

XREAD COUNT 2 BLOCk 1000 STREAMS geekhour 0 // 0 表示从头读取

XREAD COUNT 2 BLOCk 1000 STREAMS geekhour 1 // 1 表示从第二条消息开始读取

XREAD COUNT 2 BLOCk 1000 STREAMS geekhour $ // $ 表示获取从现在开始最新的消息

同时这个消息可以重复读取

创建消费者组

1
XGROUP CREATE key group id | $ [MKSTREAM] [ENTRIESREAD entries-read]

XGROUP CREATE geekhour group1 0 // 创建一个名为group1的消费者组,0 是id

获取消费者组的信息

1
XINFO GROUPS key

image-20230906121200896

向消费者组中添加消费者

1
XGROUP CREATECONSUMER key group consumer

XGROUP CREATECONSUMER geekhour group1 consumer1

读取消息

1
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]

// > 表示获取最新的消息

XREADGROUP GROUP group1 consumer1 COUNT 2 BLOCK 3000 STREAMS geekhour >

8、地理空间Geospatial

添加地理位置信息

1
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]

GEOADD city 116.405285 39.904989 beijing

image-20230906194821964

一次添加多个地理位置信息

GEOADD city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen
37 23.125178 guangzhou 120.153576 30.287459 hangzhou

image-20230906195525624

获取某个地理位置的经纬度

1
GEOPOS key [member [member ...]]

GEOPOS city beijing

image-20230906195619750

计算两个地理位置之间的距离

1
GEODIST key member1 member2 [M | KM | FT | MI]

GEODIST city beijing shanghai

image-20230906195724372

默认返回的单位是M,如果要返回km的话就在最后加上km

GEODIST city beijing shanghai km

image-20230906195845016

搜索指定范围内的成员(需要redis版本 > 6.2)

这个范围可以是以一个指定的经纬度或者成员的位置为中心,以圆形或者矩形的范围搜索

1
GEOSEARCH key FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]

// BYRADIUS 表示一个圆形的范围

寻找

GEOSEARCH city FROMMEMBER shanghai BYRADIUS 300 km

image-20230906201117951

9、HyperLogLog

用于计算集合的基数

使用随机算法计算,通过牺牲一定的精确度来换取更小的内存消耗,适合用于计算基数大但是对精度要求不是很高的统计工作

添加一个元素

1
PFADD key [element [element ...]]

查看基数

1
PFCOUNT key [key ...]

image-20230907221102331

合并集合

1
PFMERGE destkey [sourcekey [sourcekey ...]]

将sourcekey的值合并放入destkey中

image-20230907221353718

10、位图 Bitmap

位图是字符串类型的扩展,可以用string数组模拟一个bit数组,数组的下标就是偏移量,值只有0和1,支持一些位运算

设置偏移量的值

1
SETBIT key offset value

image-20230907221833920

获取某个偏移量的值

1
GETBIT key offset

image-20230907221912538

但是这样一位一位的设置很麻烦,由于Bitmap实际上是字符串,所以可以直接使用字符串的命令尝试批量赋值

‘\xF0’表示的就是 1111 0000

image-20230907222537739

所以这个实际上就是设置一个bitmap的前四位为1,后四位为0

统计bitmap中有多少个1

1
BITCOUNT key

image-20230907222642998

获取某个位置第一个出现的0或者1的位置

1
BITPOS key bit [start [end [BYTE | BIT]]]

start和end可以指定一个区间,在这个区间范围内搜索

可以看到test第一个0出现在第一位,第一个1出现在第二位

image-20230907222825830

11、位域Bitfield

将很多小的整数存储到一个较大的位图中 -> 为了更高效的内存使用

1
BITFIELD key [GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment [GET encoding offset | [OVERFLOW WRAP | SAT | FAIL] SET encoding offset value | INCRBY encoding offset increment ...]]

新建一个位域-> set

BITFIELD player:1 set u8 #0 1

u8表示是无符号uint8,#0表示第一个位置

用GET key查看内存中的情况

image-20230909192621847

获取位域信息 -> get

BITFIELD player:1 get u8 #0

image-20230909193005187

继续新建

#1 表示第二个位置

BITFIELD player:1 set u32 #1 100

image-20230909193142016

增加对应的值

BITFIELD player:1 incrby u32 #1 100

image-20230909193449138

12、事务

MULTI 开启一个事务

EXEC 执行一个事务

事务并不能保证所有的命令都执行成功,执行结果取决于事务中的命令

image-20230909194400061

事务中任意一个任务执行失败都不会导致其他任务的执行

image-20230909194554484

13、持久化

redis实现持久化的方式有两种

1、RDB (Redis Database) 在指定时间内把redis的内存快照保存到磁盘中,更适合做备份

2、AOF (Append Only File)

RDB

RDB的参数在redis.conf文件中

image-20230909195223242

也可以用save命令直接触发快照

image-20230909195740647

bgsave

单独创建一个子进程,将内存中的数据写入到硬盘中

但是fork一个子进程也需要时间,在这段时间内redis不能进行其他操作

image-20230909200046470

AOF

image-20230909200357580

14、主从复制

指的是将一台redis服务器(主节点(master))的内容复制到其他redis服务器(从节点(slave))

主节点负责写操作,从节点负责读操作

主节点把数据变化通过异步的方式发送给从节点

image-20230909200922665

15、哨兵模式Sentinel

以一个独立的进程允许在redis中,用来监控redis集群中的各个节点是否允许正常

1、监控:

​ 通过不断地发送命令来检查redis节点是否正常

2、通知:

​ 如果某个redis节点异常了,哨兵就会通过发布订阅模式来通知其他节点

3、自动故障转移:
当主节点不能正常工作的时候,哨兵开始一个自动故障转移的操作,将一个从节点升级为新的主节点,然后再将其他的从节点指向新的主节点,

redis -sentinel sentinel.conf 启动哨兵节点

先新建一个配置文件 sentinel.conf

image-20230909202158333

master是主节点的名字,最后的1表示只需要一个哨兵节点同意就可以进行故障转移了


RedisCommendStudy
http://example.com/2023/09/04/RedisCommendStudy/
Author
Eutop1a
Posted on
September 4, 2023
Licensed under