Redis —— (四)

6. 其他数据类型

6.1 Stream

用来模拟事务的传播机制,redis 作消息队列的重要支持,list blpop/brpop 升级版

6.2 Geospatial

用来存储坐标(经纬度)

存储一些坐标后,可以给定一个坐标,在存储的这些坐标中查找(按半径,矩形区域......)

该功能在地图app 中很常用,类如地图找到 半径多大范围内的饭店有哪些

6.3 HyperLoglog

应用场景只有一个------估算集合中元素个数

如 set 的一个应用场景,是统计服务器 UV(用户访问次数,同一用户算一个),假设一个 userId 8个字节大小,存储一个字节就要 8亿字节 约 0.8 G,而使用 HyperLoglog 最多只要 12kb,即可。

原因:set 中存了整个元素,而 HyperLoglog 中不存元素内容,只记录元素特征,能判断新增元素是已有的还是全新的。

因为只记特征,所以无法从 HyperLoglog 中得知元素具体内容。

HyperLoglog 存在一定的误差(可能会错判元素的存在与否),误差为 0.81% (官方数据)

6.4 Bitmaps

用 bit 位来表示整数,例如存 100,就将从右向左下标为 10(从0 开始)的 bit 位置为 1

其本质,就是 set 类型对整数的特化版本,更节省空间。

与 HyperLoglog 比较,HyperLoglog 虽然更省空间,且出数字外,还可以存字符串,但只有计数效果;而 Bitmaps 能存内容

6.5 Bitfields

位域,可以理解位一串二进制序列(字节数组),同时可以将该字节数组中的某几位,赋特定含义,且可以进行 读取/修改/算术相关操作

相比前的 String /Hash 来说,目的仍是节省空间

7. 渐进式遍历

之前,讲到使用 keys 命令可以遍历所有的键。但是使用 keys 会存在卡死 redis 服务器的风险。这里引入渐进式遍历,分多次遍历完所有的键,保障一次操作不会太卡,想得到所有的 key,多执行几次即可。

渐进式遍历是一组命令,但使用方法一致,里面的代表命令就是 scan

bash 复制代码
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

cursor 为 0,意味从头遍历
pattern 找出长什么样的 key,不填则默认为 ** * **
count 一次多少个。注:这里只是建议程序一次多少,具体多少看程序想拿多少了
type 指定数据类型,string,hash,stream 等

返:下次光标应指向的位置 及 元素列表

代码示例:

bash 复制代码
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> mset key3 33 key4 4 key5 5 key6 6 key7 7 key8 8 key9 9 key10 10
OK
127.0.0.1:6379> KEYS *
1) "key10"
2) "key5"
3) "key6"
4) "key9"
5) "key8"
6) "key4"
7) "key7"
8) "key3"
127.0.0.1:6379> SCAN 0
1) "0"
2) 1) "key9"
   2) "key8"
   3) "key4"
   4) "key7"
   5) "key10"
   6) "key5"
   7) "key6"
   8) "key3"
127.0.0.1:6379> MSET key1 1 key2 2 key0 0
OK
127.0.0.1:6379> KEYS *
 1) "key6"
 2) "key7"
 3) "key4"
 4) "key3"
 5) "key10"
 6) "key1"
 7) "key5"
 8) "key8"
 9) "key9"
10) "key0"
11) "key2"
127.0.0.1:6379> SCAN 0
1) "0"
2)  1) "key7"
    2) "key4"
    3) "key8"
    4) "key9"
    5) "key10"
    6) "key1"
    7) "key6"
    8) "key5"
    9) "key3"
   10) "key0"
   11) "key2"
127.0.0.1:6379> SCAN 0
1) "0"
2)  1) "key7"
    2) "key4"
    3) "key8"
    4) "key9"
    5) "key10"
    6) "key1"
    7) "key6"
    8) "key5"
    9) "key3"
   10) "key0"
   11) "key2"
127.0.0.1:6379> SCAN 0
1) "0"
2)  1) "key7"
    2) "key4"
    3) "key8"
    4) "key9"
    5) "key10"
    6) "key1"
    7) "key6"
    8) "key5"
    9) "key3"
   10) "key0"
   11) "key2"
127.0.0.1:6379> SCAN 0
1) "0"
2)  1) "key7"
    2) "key4"
    3) "key8"
    4) "key9"
    5) "key10"
    6) "key1"
    7) "key6"
    8) "key5"
    9) "key3"
   10) "key0"
   11) "key2"
127.0.0.1:6379> scan 0 count 3
1) "2"
2) 1) "key7"
   2) "key4"
   3) "key8"
   4) "key9"
127.0.0.1:6379> scan 2 count 3
1) "11"
2) 1) "key10"
   2) "key1"
   3) "key6"
127.0.0.1:6379> scan 11 count 3
1) "0"
2) 1) "key5"
   2) "key3"
   3) "key0"
   4) "key2"
127.0.0.1:6379> 

渐进式遍历,不会在服务器处存储任何状态信息,因此渐进式遍历式可以随时终止的,且不会对服务器产生副作用。

渐进式遍历,虽解决了阻塞问题,但禁忌遍历的时候,有改动键的操作(增删该),这会导致重复遍历或遗漏。

8. 数据库管理

redis 中也有数据库的概念,但是不想 MySQL 那样能随意创建删除。

redis 中的 database 是现成的,不能创建新的,也不能删。

redis 中默认提供了 16 个数据库,编号为 0 - 15,默认使用 0 号数据库,这 16 个数据库之间是相互隔离的,互不影响。

8.1 改变使用的数据库

bash 复制代码
select dbIndex

例如:select 1, 即使用 1 号数据库

8.2 删除库中的内容

bash 复制代码
FLUSHDB [ASYNC|SYNC]

SYNC :同步删除
ASYNC:异步删除

该命令是删除当前所使用的数据库的内容

bash 复制代码
FLUSHALL

该命令为删除所有库中的所有内容

8.3 获取当前库中 key 个数

bash 复制代码
DBSIZE

获取当前数据库中 key 的个数

相关推荐
星哥说事2 小时前
告警通知方式:邮件、短信、Slack、钉钉等告警通知方式的配置
数据库·钉钉
张人玉2 小时前
c#常用的类
服务器·数据库·c#
IT 行者2 小时前
Spring Security 7.0 迁移指南
java·数据库·spring
zhengfei6113 小时前
漏洞情报聚合与分析工具——TL-ICScan
数据库·oracle
专注API从业者3 小时前
构建企业级 1688 数据管道:商品详情 API 的分布式采集与容错设计
大数据·开发语言·数据结构·数据库·分布式
2501_924064113 小时前
2025年数据库性能压测工具对比与重点测试方案选型指南
数据库·oracle
ttthe_MOon3 小时前
Redis Cluster集群模式和各种常见问题
数据库·redis·缓存
小鸡脚来咯3 小时前
MySQL InnoDB内存结构,增删改查时怎么运行的
数据库·mysql
杨了个杨89823 小时前
PostgreSQL(pgSQL)常用操作
数据库·postgresql·oracle