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

相关推荐
醉颜凉6 小时前
Redis网络层解析:高性能服务器架构设计与实现
redis·epoll·网络架构·i/o多路复用·事件驱动
醉颜凉6 小时前
Redis 与 Pika 对比:大容量冷热数据落盘方案与混合存储架构
redis·pika·混合存储·存储架构·冷热数据分离
SkyWalking中文站6 小时前
BanyanDB 0.11.0:新特性与升级指南
数据库
₍˄·͈༝·͈˄*₎◞ ̑̑码8 小时前
MyBatis操作数据库
数据库·mybatis
刃神太酷啦10 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
三84410 小时前
SSRF 打内网 Redis:gopher 原理与实操
redis·web安全·bootstrap·ssrf
丁丁点灯o10 小时前
Oracle中使用外键的场景及不适用外键的情况
数据库·oracle
天天进步201510 小时前
Pixelle-Video 源码解析 #18:声音克隆功能:参考音频如何影响解说效果?
数据库·音视频
youm200310 小时前
认识Redis
redis·笔记·学习
不懂的浪漫11 小时前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库