类型补充,scan 和数据库管理命令
Redis 数据类型
stream
stream 就是一个队列(阻塞队列)
Redis 作为一个消息队列的重要支撑,属于是 list 中 blpop 和 brpop 的升级版本
geospatial
主要用于存储地理位置信息,并对存储的信息进行操作
存储一些点后,通过给定的坐标,去存储的点里去查找(按照半径,矩形区域)
一般在“地图”中应用广泛
hyperloglog
应用场景只有一个,估算集合中的元素个数
set 存储 userId ,每个 userId 按照 8个字节计算
1 亿 UV ——> 8 亿字节 ——> 0.8 G
使用 set 非常消耗空间(set 需要存储每个元素)
hyperloglog 可以使用最多 12 kb 空间实现上述效果
hyperloglog 不存储元素的内容,但是记录“元素的特征”,从而在新增元素的时候,判断该元素是否已经添加了(位操作)
hyperloglog 简单来说就是用来记数的,但是不能返回具体的每个元素(准确的存在一定的误差)
bitmap
使用 bit 表示整数
位图本质上是一个集合,属于 set 类型针对整数的特化版本
节省空间,运算高效
bitfield
位域,可以理解成一串二进制序列(字节数组)
同时可以把这个字节数组中某几位,赋予特定的含义,并且可以进行读取/修改/算数运算 相关操作
相较于 string / hash ,目的仍然是节省空间
渐进式遍历 - scan
Redis 使用 scan 命令进行渐进式遍历,进而解决直接使用 keys 获取键时可能出现的阻塞问题
每次 scan 命令 O(1),但是要完整的遍历所有的 key ,需要执行多次 scan
scan cursor [match patter] [Count count] [Type type]
返回下一次 scan 的游标(cursor)以及本次获取到的键
1)首次 scan 从 0 开始
2)当 scan 返回的下次位置为 0 时,遍历结束
1)pattern 和 keys 命令一样,scan 命令也可以通过提供一个 glob 风格的模式参数, 让命 令只返回和给定模式相匹配的元素
2)count 限制本次返回的元素个数(与实际返回可能不同,相当于给服务器的一种“建议”)
3)type Redis 里的 key 都是 string,但是 value 的类型是不一样的
4)cursor 不能理解成“下标”,其不是一个连续自增的整数,只是一个“字符串”
cursor 程序员 \ 客户端是不认识的,Redis 服务器可以知道 cursor 对应的位置
count 的数字,不是每次遍历都必须一样
此处的渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息,是随时可以种植的,不会对服务器产生任何负面影响
渐进式遍历是一组命令,使用方法相同,包括 hscan sscan zscan ...
渐进式遍历 虽然解决了阻塞问题,但是如果在遍历期间键有所变化,可能会导致遍历键时,键的重复遍历或者遗漏
数据库管理命令
切换数据库
MySQL 中的一个重要概念 —— 数据库
一个 MySQL 服务器上可以有多个 database ,一个 database 上可以有多个表
Redis 中也有数据库类似的概念,但是 Redis 中的 database 是现成的,用户不能创建新的数据库,也不能删除数据库,只能在现有的数据库中切换
Redis 默认提供了 16 个数据库 0 —— 15(数据库之间相互隔离)默认使用 0 号
无论是否有多个数据库,Redis 都是使用单线程模型,所以彼此之间还是需要排队等待命令的执行select dbIndex
saync 异步 sync 同步
清空当前数据库中的所有 key
flush [async | sync]
返回 OK O(N)
返回当前数据库中 key 的数量
dbsize
返回当前数据库中 key 的数量