RedisCommendStudy
Redis常用指令
1、字符串String
redis中是使用字符串保存数值的,所以可以将数字或者布尔值也设置为value,具体的键和值都是大小写敏感的
设置一个键值对
1 |
|
input: set cqupt 3G
receive: OK
获取键对应的值
1 |
|
input: get cqupt
receive: “3G”
删除键值对
1 |
|
input: del cqupt
receive: (integer) 1
在删除后再获取
input: get cqupt
receive: (nil)
判断一个键是否存在
1 |
|
input: EXISTS cqupt
receive: (integer) 0 表示不存在
重新创建之后再exists就会发现返回(integer) 1
查看存在哪些键
1 |
|
pattern是一个模式,支持正则表达式
例如 keys * 表示查找所有的键
keys CQ* 表示所有以CQ开头的键
删除所有的键
1 |
|
删除之后再keys *
得到(empty list or set)的回显
CLI的中文显示设置
可以正常存储,但是直接打开redis-cli的话只能看到对应的十六进制数
1 |
|
清空屏幕
1 |
|
设置带有过期时间的键值对
TTL: Time To Live
查看过期时间
1 |
|
input: TTL cqupt
receive: -1 说明没有设置过期时间
设置过期时间
1 |
|
input: TTL cqupt 10 // 设置10秒后过期
receive: 1
最后TTL key,收到-2,说明键值对已经过期
最后再GET key ,没有输出,而且KEYS key也没有显示
使用SETEX设置带有过期时间的键值对
1 |
|
input: setex name 5 你好
receive: OK
在键不存在时设置键的值
1 |
|
2、列表List
将元素添加到列表的头部或尾部
1 |
|
LPUSH letter a
LPUSH letter b
获取列表内容
1 |
|
LRANGE letter 0 -1 -1表示到最后一个元素
添加多个元素
1 |
|
LPUSH letter c d e
> LRANGE letter 0 -1 1) “e” 2) “d” 3) “c” 4) “c” 5) “b” 6) “a”
可以看到顺序是反的
删除头部或尾部的元素
1 |
|
RPOP letter
一次删除多个元素
LPOP letter 2
查看列表的长度
1 |
|
RPOPLPUSH实现一个简单的消息队列
删除列表中指定范围以外的元素
1 |
|
意思是只保留start和stop之内的元素
LTRIM letter 1 3
3、集合Set
set和列表的区别
set是无序的,但是元素不能重复;list是有序的,元素可以重复
向set中添加元素
1 |
|
例如:
SADD course Redis
或者:
SADD course Redis MySQL
查看集合中的元素
1 |
|
> SMEMBERs course
1)”MySQL”
- “Redis”
判断一个元素是否在集合中
1 |
|
删除集合中的元素
1 |
|
计算集合的交集
1 |
|
计算集合的差集
1 |
|
计算集合的并集
1 |
|
4、有序集合SortedSet
集合中的每个元素都会关联一个浮点类型的分数,根据这个分数从小到大排序
成员是唯一的,但是分数是可以重复的
向有序集合中添加元素
1 |
|
例如:
input: ZADD result 680 清华 660 北大 650 复旦 640 浙大
result: 4
查看有序集合中的元素
1 |
|
例如
127.0.0.1:6379> ZRANGE result 0 -1
浙大
复旦
北大
清华
在输出成员的时候输出分数
127.0.0.1:6379> ZRANGE result 0 -1 WITHSCORES
浙大
640
复旦
650
北大
660
清华
680
查看某个成员的值
1 |
|
查看某个成员的排名
1 |
|
查看从大到小的排名
1 |
|
删除有序集合中的某个成员
1 |
|
5、哈希Hash
向hash中添加一个键值对
1 |
|
input: HSET person name WCL
input: HSET person age 20
也可以是
intput: HSET person name WCL age 20
获取hash中的某个键值对
1 |
|
input: HGET person name
result: “WCL”
获取hash中的所有键值对
1 |
|
input: HGETALL person
result: \1) “name” 2) “WCL” 3) “age” 4) “20”
删除hash中的某个键值对
1 |
|
input: HDEL person age
判断某个键值对是否存在
1 |
|
input: HEXISTS person name
获取hash中的所有键
1 |
|
input: HKEYS person
result: 1) “name”
获取所有键的数量
1 |
|
input: HLEN person
result: (integer) 1
6、发布订阅模式
可以有多个订阅,这样在一个频道发布消息的时候,所有的订阅频道就会收到消息
订阅一个频道
1 |
|
发布消息
1 |
|
7、消息队列Stream
向Stream中添加消息
1 |
|
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 |
|
input:
XLEN geekhour
result:
(integer) 3
查看消息的详细内容
1 |
|
可以用 - + 代表全体
XRANGE geekhour - +
删除消息
1 |
|
1 |
|
XTRIM geekhour MAXLEN 0 // 表示删除所有消息
读取消息
1 |
|
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 geekhour group1 0 // 创建一个名为group1的消费者组,0 是id
获取消费者组的信息
1 |
|
向消费者组中添加消费者
1 |
|
XGROUP CREATECONSUMER geekhour group1 consumer1
读取消息
1 |
|
// > 表示获取最新的消息
XREADGROUP GROUP group1 consumer1 COUNT 2 BLOCK 3000 STREAMS geekhour >
8、地理空间Geospatial
添加地理位置信息
1 |
|
GEOADD city 116.405285 39.904989 beijing
一次添加多个地理位置信息
GEOADD city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen
37 23.125178 guangzhou 120.153576 30.287459 hangzhou
获取某个地理位置的经纬度
1 |
|
GEOPOS city beijing
计算两个地理位置之间的距离
1 |
|
GEODIST city beijing shanghai
默认返回的单位是M,如果要返回km的话就在最后加上km
GEODIST city beijing shanghai km
搜索指定范围内的成员(需要redis版本 > 6.2)
这个范围可以是以一个指定的经纬度或者成员的位置为中心,以圆形或者矩形的范围搜索
1 |
|
// BYRADIUS 表示一个圆形的范围
寻找
GEOSEARCH city FROMMEMBER shanghai BYRADIUS 300 km
9、HyperLogLog
用于计算集合的基数
使用随机算法计算,通过牺牲一定的精确度来换取更小的内存消耗,适合用于计算基数大但是对精度要求不是很高的统计工作
添加一个元素
1 |
|
查看基数
1 |
|
合并集合
1 |
|
将sourcekey的值合并放入destkey中
10、位图 Bitmap
位图是字符串类型的扩展,可以用string数组模拟一个bit数组,数组的下标就是偏移量,值只有0和1,支持一些位运算
设置偏移量的值
1 |
|
获取某个偏移量的值
1 |
|
但是这样一位一位的设置很麻烦,由于Bitmap实际上是字符串,所以可以直接使用字符串的命令尝试批量赋值
‘\xF0’表示的就是 1111 0000
所以这个实际上就是设置一个bitmap的前四位为1,后四位为0
统计bitmap中有多少个1
1 |
|
获取某个位置第一个出现的0或者1的位置
1 |
|
start和end可以指定一个区间,在这个区间范围内搜索
可以看到test第一个0出现在第一位,第一个1出现在第二位
11、位域Bitfield
将很多小的整数存储到一个较大的位图中 -> 为了更高效的内存使用
1 |
|
新建一个位域-> set
BITFIELD player:1 set u8 #0 1
u8表示是无符号uint8,#0表示第一个位置
用GET key查看内存中的情况
获取位域信息 -> get
BITFIELD player:1 get u8 #0
继续新建
#1 表示第二个位置
BITFIELD player:1 set u32 #1 100
增加对应的值
BITFIELD player:1 incrby u32 #1 100
12、事务
MULTI 开启一个事务
EXEC 执行一个事务
事务并不能保证所有的命令都执行成功,执行结果取决于事务中的命令
事务中任意一个任务执行失败都不会导致其他任务的执行
13、持久化
redis实现持久化的方式有两种
1、RDB (Redis Database) 在指定时间内把redis的内存快照保存到磁盘中,更适合做备份
2、AOF (Append Only File)
RDB
RDB的参数在redis.conf文件中
也可以用save命令直接触发快照
bgsave
单独创建一个子进程,将内存中的数据写入到硬盘中
但是fork一个子进程也需要时间,在这段时间内redis不能进行其他操作
AOF
14、主从复制
指的是将一台redis服务器(主节点(master))的内容复制到其他redis服务器(从节点(slave))
主节点负责写操作,从节点负责读操作
主节点把数据变化通过异步的方式发送给从节点
15、哨兵模式Sentinel
以一个独立的进程允许在redis中,用来监控redis集群中的各个节点是否允许正常
1、监控:
通过不断地发送命令来检查redis节点是否正常
2、通知:
如果某个redis节点异常了,哨兵就会通过发布订阅模式来通知其他节点
3、自动故障转移:
当主节点不能正常工作的时候,哨兵开始一个自动故障转移的操作,将一个从节点升级为新的主节点,然后再将其他的从节点指向新的主节点,
redis -sentinel sentinel.conf 启动哨兵节点
先新建一个配置文件 sentinel.conf
master是主节点的名字,最后的1表示只需要一个哨兵节点同意就可以进行故障转移了