redis-5-类型补充-Scan

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [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的应用层协议---》官网上有

resp

但是qq和王者这些并没有公开应用层协议,所以不能开发他们对应的客户端

redis本身是基于TCP了


按照上述格式构造出字符串,往tcp socket中写入

这个协议已经公开很久了---》很多人已经实现了这套协议的解析和构造了,我们只需要调用就可以了

4.2 访问github技巧

游戏加速器可以访问:比如steam++,改名为watt tools

总结

相关推荐
九章-4 小时前
一库平替,融合致胜:国产数据库的“统型”范式革命
数据库·融合数据库
2401_838472514 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
u0109272714 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
wengqidaifeng4 小时前
数据结构---顺序表的奥秘(下)
c语言·数据结构·数据库
what丶k4 小时前
SpringBoot3 配置文件使用全解析:从基础到实战,解锁灵活配置新姿势
java·数据库·spring boot·spring·spring cloud
Code blocks4 小时前
kingbase数据库集成Postgis扩展
数据库·后端
天下·第二4 小时前
达梦数据库适配
android·数据库·adb
Dxy12393102164 小时前
MySQL INSERT ... ON DUPLICATE KEY UPDATE 批量更新详解
数据库·mysql
定偶4 小时前
MySQL知识点
android·数据结构·数据库·mysql
醒过来摸鱼5 小时前
Redis 服务器线程与事件循环解析
服务器·数据库·redis