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

相关推荐
沙白猿1 分钟前
Redis报错:A bean with that name has already been defined in class path resource
spring boot·redis·mybatis
IT 行者19 分钟前
Spring Security 7 OAuth2 授权码分布式存储之Redis存储方案
redis·分布式·spring
vyuvyucd22 分钟前
插件式开发:C++与C#实战指南
java·前端·数据库
少云清30 分钟前
【性能测试】3_性能测试基础 _指标
运维·服务器·数据库·性能测试·性能测试指标
+VX:Fegn089531 分钟前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
列御寇1 小时前
MongoDB分片集群——集群组件概述
数据库·mongodb
花~盗1 小时前
redis笔记
redis
七夜zippoe1 小时前
领域驱动设计在Python中的实现:从理论到生产级实践
数据库·python·sqlite·ddd·pydantic
小CC吃豆子1 小时前
Qt的信号与槽机制
开发语言·数据库·qt
·云扬·1 小时前
系统与MySQL核心监控指标及操作指南
android·数据库·mysql