提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [1. 类型补充](#1. 类型补充)
-
- [1.1 stream类型](#1.1 stream类型)
- [1.2 geospatial](#1.2 geospatial)
- [1.3 hyperloglog](#1.3 hyperloglog)
- [1.4 bitmaps位图](#1.4 bitmaps位图)
- [1.5 bitfields位域](#1.5 bitfields位域)
- [2. 渐进式遍历-scan](#2. 渐进式遍历-scan)
- [3. 数据库管理命令](#3. 数据库管理命令)
- [4. redis客户端](#4. redis客户端)
-
- [4.1 认识resp](#4.1 认识resp)
- [4.2 访问github技巧](#4.2 访问github技巧)
- 总结
前言
1. 类型补充
1.1 stream类型
sream类型可以用来模拟实现事件传播的机制,如果有事件产生,就把事件插入stream中,然后消费者监听stream,去消费事件
stream其实就是一个阻塞队列,这个就是作为一个消息队列的重要支撑,属于是list与blpop的升级版本
Basic commands
XADD adds a new entry to a stream.
XREAD reads one or more entries, starting at a given position and moving forward in time.
XRANGE returns a range of entries between two supplied entry IDs.
XLEN returns the length of a stream.
XDEL removes entries from a stream.
XTRIM trims a stream by removing older entries.
这是基本命令
1.2 geospatial
Basic commands
GEOADD adds a location to a given geospatial index (note that longitude comes before latitude with this command).
GEOSEARCH returns locations with a given radius or a bounding box.
See the complete list of geospatial index commands.
这个意思是地理空间,这个主要是用来存储坐标的(经纬度),存储一些点之后,就可以给定一个点,从存储中的点里面去查找(按照半径来查找),比如百度地图,高德地图
> GEOADD bikes:rentable -122.27652 37.805186 station:1
(integer) 1
> GEOADD bikes:rentable -122.2674626 37.8062344 station:2
(integer) 1
> GEOADD bikes:rentable -122.2469854 37.8104049 station:3
(integer) 1
> GEOSEARCH bikes:rentable FROMLONLAT -122.2612767 37.7936847 BYRADIUS 5 km WITHDIST
1) 1) "station:1"
2) "1.8523"
2) 1) "station:2"
2) "1.4979"
3) 1) "station:3"
2) "2.2441"
1.3 hyperloglog
应用场景:估算集合中的元素个数



1.4 bitmaps位图
使用比特位来表示整数
SETBIT sets a bit at the provided offset to 0 or 1.
GETBIT returns the value of a bit at a given offset.
> SETBIT pings:2024-01-01-00:00 123 1
(integer) 0
> GETBIT pings:2024-01-01-00:00 123
1
> GETBIT pings:2024-01-01-00:00 456
0


1.5 bitfields位域
位段:也叫做位域,和C语言中的结构体中的位域有点类似
BITFIELD atomically sets, increments and reads one or more values.
BITFIELD_RO is a read-only variant of BITFIELD.
> BITFIELD bike:1:stats SET u32 #0 1000
1) (integer) 0
> BITFIELD bike:1:stats INCRBY u32 #0 -50 INCRBY u32 #1 1
1) (integer) 950
2) (integer) 1
> BITFIELD bike:1:stats INCRBY u32 #0 500 INCRBY u32 #1 1
1) (integer) 1450
2) (integer) 2
> BITFIELD bike:1:stats GET u32 #0 GET u32 #1
1) (integer) 1450
2) (integer) 2



2. 渐进式遍历-scan
Redis 使⽤ scan 命令进⾏渐进式遍历键,进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历,需要执⾏多次 scan。不像keys *一下子就全部都来了
每次scan就是获取一小部分的key

cursor就是光标,下标,为0表示这次遍历从头开始
count表示遍历的个数
返回值的前半部分告诉的是拟下次继续遍历,光标要从哪里开始
后半部分就是真正遍历的key
注意这个光标并不是下标,并不是连续递增的,就是一个字符串,所以第二次返回的光标是7,只有redis服务器知道这个光标对应的元素位置了
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
时间复杂度:O(1)
返回值:下⼀次 scan 的游标(cursor)以及本次得到的键。
pattern其实和keys命令的pattern是一样的道理
count就是限制这次遍历的个数,这是一个提示,并不是一定返回count个个数
TYPE :表示获取指定类型的key
> flushall
OK
> set key1 111
OK
> mset key2 222 key3 333 key4 444 key5 555 key6 666 key7 777 key8 888 key9 999
OK
> scan 0
0
key5
key4
key9
key3
key1
key7
key8
key2
key6
返回0就表示遍历一次结束了
> scan 0 count 3
10
key5
key4
key9
> scan 10 count 3
14
key3
key1
key7
> scan 14 count 3
7
key8
key2
key6
> scan 7 count 3
0
count可以设置为不一样的
除了 scan 以外,Redis ⾯向哈希类型、集合类型、有序集合类型分别提供了 hscan、sscan、zscan 命令,它们的⽤法和 scan 基本类似
渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。
3. 数据库管理命令
一个mysql服务器上有很多的database,一个database上有很多的表
redis中的database是现成的,默认redis提供了16个数据库,数据库之间的数据是相互隔离的,默认使用的是0号数据库
切换数据库
select dbIndex
> select 1
OK
> get key1
null
> select 0
OK
> get key1
111
最大选择15数据库
Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令,
dbsize:获取当前数据库中key的个数
flushdb:删除当前数据库中所有的key
flushall :删除所有数据库中所有的key
4. redis客户端
更多的时候是使用redis的api,用程序来操作redis
4.1 认识resp
传输层有UDP,TCP这些协议,这些协议我们只能选择,不能修改
而在应用层我们可以自定义协议,比如redis就是自定义应用层协议的
作为redis第三方,我们要开发redis的客户端,就要知道redis的应用层协议才可以
redis的应用层协议---》官网上有
但是qq和王者这些并没有公开应用层协议,所以不能开发他们对应的客户端
redis本身是基于TCP了



按照上述格式构造出字符串,往tcp socket中写入
这个协议已经公开很久了---》很多人已经实现了这套协议的解析和构造了,我们只需要调用就可以了
4.2 访问github技巧
游戏加速器可以访问:比如steam++,改名为watt tools