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 的个数