Redis 附加功能(一) - 数据库

Redis的数据会被存储到一个名为数据库的容器中。一个Redis服务器可以包含多个数据库,默认情况下,会创建16个数据库。这些数据库用号码进行标志,第一个数据库为0号数据库。

|-----|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 数据库 | 切换到指定的数据库:SELECT index 获取所有与给定匹配符相匹配的键:KEYS pattern 以渐进方式迭代数据库中的键:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] 获取数据库包含的键值对数量:DBSIZE 将给定的键移动到另一个数据库:MOVE key db 清空当前数据库:FLUSHDB [async] 移除所有数据库:FLUSHALL [async] 互换数据库:SWAPDB dbX dbY |
| 键 | 随机返回一个键: RANDOMKEY 对键的值进行排序:SORT key [BY pattern] [LIMIT offset count] [GET pattern GET pattern ...] 检查给定的键是否存在:EXISTS key [key ...] 查看键的类型:TYPE key 修改键名:RENAME | RENAMENX origin new 移除指定的键:DEL key [key ...] 以异步方式移除指定的键:UNLINK |

表 数据库基础命令

1 重点功能

1.1 匹配符

KEYS、SCAN等命令接受一个全局匹配符作为参数,然后返回数据库中与这个匹配符相匹配的键作为结果。

|---------|----------------|
| * | 匹配零个或任意多个任意字符。 |
| ? | 匹配任意的单个字符。 |
| [] | 匹配给定字符串中的单个字符。 |
| [?-?] | 匹配给定范围中的单个字符。 |

表 全局匹配符的作用

1.2 SCAN 渐进方式迭代数据库中的键

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

cursor: 用于指定迭代时使用的游标,其记录了迭代的轨迹和进度。在开始一次新的迭代时,用户需要将游标设置为0。

count: 指定每次迭代期望获取的数量,其并不一定会严格指示返回结果。返回的结果可能大于或小于count 值。

type: 指定需要迭代键的类型。string、hash、list、set、zset、stream。

SCAN的迭代特征:

  1. 迭代会返回两个元素,下一次迭代所需的游标及查找到的键列表。只有当返回的迭代为0才代表迭代结束,否则就算迭代返回的键列表为空,也不一定表示迭代结束。
  2. 从迭代开始到迭代结束,一直存在于数据库中的键总会被返回。
  3. 如果一个键在迭代过程中被添加或删除,那么这个键是否会被返回是不确定的。

1.2.1 数据结构迭代命令

KEYS 会将符号条件的键全部返回给客户端,当数量比较大时,可能会导致服务器被阻塞。因此使用SCAN,逐进方式迭代符号条件的键。

在Redis的散列hash、集合set、及有序集合zset数据结构中,也存在一些可能导致服务器阻塞的命令,例如HKEYS、SMEMBERS、ZRANGE等。这些数据结构也提供了与SCAN命令类似的迭代命令:HSCAN、SSCAN及ZSCAN。

1.3 SORT 对键的值进行排序

SORT key [ALPHA] [BY pattern] [LIMIT offset count] [GET pattern GET pattern ...] [ASC | DESC]

SORT 命令可以对列表、集合或有序集合成员进行排序。

ALPHA:SORT 默认是进行数字值排序的,如果直接对字符串元素进行排序,那么将报错,ALPHA 指定通过字节进行排序。

1.3.1 获取外部键的值作为结果

SORT命令默认返回参与排序的元素值,而GET pattern来指示返回的值,其可以指定多个返回值。pattern参数的值可以是:

  1. 包含*符号的字符串:会把被排序的元素与*符号进行替换,构建出一个键名,然后使用GET命令去获取该键的值。

例:SORT fruits ALPHA GET *-price

图 集合fruits的元素

图 数据库中存储了不同水果价格的字符串键

图 SORT GET pattern 命令执行结果

  1. 包含*符号和->符号的字符串:获取散列中的键值。-> 左边的字符串为散列名(* 只能用在->左边),右边的字符串为字段名。调研HGET命令,从散列中获取指定字段的值。

图 数据库中存储水果信息的散列键

图 SORT 获取散列键值结果

执行步骤,a) 从fruits集合中获取了apple、mango等字符串,并对这些字符串进行字节排序,b)然后用这些字符串替代命令中的-> 左边的*号,构建出键名:apple-info、mango-info 等。 c)最后使用HGET命令获取这些被构建键名散列的inventory的字段值。

  1. 一个单独的#符号:返回被排序的元素本身。

SORT key 等效于 SORT key GET #。 如果单独使用是没意义的,一般只会在同时使用多个GET选项时,才使用GET #。

图 使用多个GET选项

1.3.2 使用外部键的值作为排序权重

在默认情况下,SORT命令将使用被排序元素本身作为排序权重,可以通过BY选项指定其他键的值作为排序的权重。BY 的pattern 与 GET pattern 的使用规则一样。

相关推荐
leegong231113 小时前
PostgreSQL 初中级认证可以一起学吗?
数据库
秋野酱5 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
weisian1515 小时前
Mysql--实战篇--@Transactional失效场景及避免策略(@Transactional实现原理,失效场景,内部调用问题等)
数据库·mysql
AI航海家(Ethan)5 小时前
PostgreSQL数据库的运行机制和架构体系
数据库·postgresql·架构
Kendra9198 小时前
数据库(MySQL)
数据库·mysql
时光书签9 小时前
Mongodb副本集群为什么选择3个节点不选择4个节点
数据库·mongodb·nosql
人才程序员11 小时前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
极客先躯11 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
指尖下的技术11 小时前
Mysql面试题----MyISAM和InnoDB的区别
数据库·mysql
永远是我的最爱11 小时前
数据库SQLite和SCADA DIAView应用教程
数据库·sqlite