Redis数据库

一、Redis数据库概览

无论是字符串键、散列键还是列表键,都会被存储到一个名为数据库的容器中。Redis是一个键值对数据库服务器,可以根据键的名字对数据库中的值进行索引。
一个Redis服务器可以包含多个数据库,在默认情况下,Redis服务器在启动时将会创建16个数据库,这些数据库使用数字标识,其中第一个数据库为0号数据库,第二个为1号数据库,以此类推。客户端默认使用0号数据库。
Redis不允许在同一数据库中使用两个同名的键,但是不同数据库拥有不同的命名空间,因此在不同数据库中使用同名的键是可以的。

二、关于Redis数据库的常用操作

  • 切换至指定的数据库
    通过使用SELECT命令,可以从当前正在使用的数据库切换到想要使用的数据库;
    语法格式:SELECT db,如
# 切换至3号数据库
SELECT 3
  • 以渐进方式迭代数据库中的键

使用KEYS命令获取数据库中的键时是一次性返回符合条件的所有键,所以当数据库包含的键数量较大时,可能会导致服务器阻塞。因此可使用SCAN命令以渐进方式迭代数据库中的键。该命令是一个迭代器,它每次被调用的时候都会从数据库中获取一部分键。

语法格式:SCAN cursor [MATCH pattern] [COUNT number]
其中,cursor参数用于指定迭代时使用的游标,游标记录了迭代的轨迹和进度,在开始一次新的迭代时,需要将游标设置为0。可选项MATCH可以让SCAN命令只返回与给定全局匹配符相匹配的键。可选项COUNT用于指明最多返回多少个键。

SCAN命令的执行结果由两个元素组成:
.第一个是进行下一次迭代所需的游标,如果这个游标为0,说明对所有键已完成迭代;
.第二个元素是一个列表,这个列表包含了本次迭代取得的数据库键;需要注意的是,SCAN命令可能会返回重复的键,如果不想在结果中包含重复的键,那么就需要自己在客户端中进行检测和过滤,并且SCAN命令返回的键数量是不确定的,有时甚至会不返回任何键,但只要命令返回的游标不为0,迭代就没有结束。
列如:
在这里插入图片描述
如果一个键在迭代的过程中被添加到数据库中,那么这个键是否会被返回是不确定的。

  • 以渐进方式迭代数据结构中的键值

与获取数据库键的KEYS命令一样,Redis的各个数据结构也存在一些可能导致服务器阻塞的命令,如散列的HKEYS命令、HVALS命令和HGETALL命令在处理包含键值对较多的散列时;集合的SMEMBERS命令在处理包含元素较多的集合时;有序集合的一些范围型获取命令,比如ZRANGE。

因此,Redis为散列、集合和有序集合也提供了与SCAN命令类似的游标迭代命令,分别是HSCAN命令、SSCAN命令和ZSCAN命令。

HSCAN命令可以以渐进的方式迭代给定散列包含的键值对;
语法格式:HSCAN hash cursor [MATCH pattern] [COUNT number]
除了需要指定被迭代的散列之外,HSCAN命令的其他参数与SCAN命令的参数保持一致,并且作用也一样。

SSCAN命令可以以渐进的方式迭代给定集合包含的元素;
语法格式:SSCAN set cursor [MATCH pattern] [COUNT number]
除了需要指定被迭代的集合之外,SSCAN命令的其他参数与SCAN命令的参数保持一致,并且作用也一样。

ZSCAN命令可以以渐进的方式迭代给定有序集合包含的成员和分值;
语法格式:ZSCAN sorted_set cursor [MATCH pattern] [COUNT number]
除了需要指定被迭代的有序集合之外,ZSCAN命令的其他参数与SCAN命令的参数保持一致,并且作用也一样。

  • 对键的值进行排序

可以通过SORT命令对列表元素、集合元素或者有序集合成员进行排序;
语法格式:SORT key ALPHA] [ASC|DESC] LIMIT offset count],如

# 对集合numbers中的元素排序查看
SORT numbers

SORT命令在默认情况下进行的是数字值排序,如果我们尝试直接使用SORT命令去对字符串元素进行排序,那么命令将产生一个错误。可以通过使用ALPHA选项来实现执行字符串排序操作而不是数字值排序操作。

在默认情况下,SORT命令将按照数字值从小到大的顺序依次返回排序后的各个值。可以通过使用可选的ASC选项或者DESC选项指定SORT命令的排序方式,其中ASC表示执行升序操作,而DESC则表示执行降序排序操作。

SORT命令在默认情况下将返回所有被排序的元素,但如果我们只需要其中一部分排序结果,那么可以使用可选的LIMIT选项,其中offset参数用于指定返回结果之前需要跳过的元素数量,offset参数的值是从0开始的,而count参数则用于指定需要获取的元素数量。

  • 检查数据库中是否存在指定的键

可通过EXISTS命令检查给定的一个或多个键是否存在于当前正在使用的数据库中;
语法格式:EXISTS key1 key2 …
EXISTS命令将返回存在的给定键数量作为返回值。

如果我们只想确认某个键是否存在,那么只需要将那个键传递给EXISTS命令即可:命令返回0表示该键不存在,返回1则表示该键存在。

  • 获取数据库包含的键值对数量

DBSIZE命令可用于获取当前使用的数据库包含了多少个键值对;
语法格式:DBSIZE

  • 查看键的类型

通过TYPE命令可用于查看给定键的类型;
语法格式:TYPE key
TYPE命令在面对不同类型的键时返回的各项结果:
在这里插入图片描述

  • 修改键名

可以通过使用RENAME命令或RENAMENX命令;
语法格式:RENAME origin new
其中,origin为原名,new为新名,RENAMENX命令和RENAME
命令一样,都可以对键进行改名,但RENAMENX命令只会在新键名尚未被占用的情况下进行改名,如果用户指定的新键名已经被占用,那么RENAMENX将放弃执行改名操作。

  • 将给定的键移动到另一个数据库

MOVE命令用于将一个键从当前数据库移动至目标数据库;
语法格式:MOVE key db

当MOVE命令成功将给定键从当前数据库移动至目标数据库时,命令返回1;如果给定键并不存在于当前数据库,或者目标数据库中存在与给定键同名的键,那么MOVE命令将不做动作,只返回0表示移动失败。当目标数据库存在与给定键同名的键时,MOVE命令将放弃执行移动操作。

  • 以异步方式移除指定的键

使用DEL命令来移除指定的键时,该命令是以同步方式执行移除操作,所以当待移除的键非常多时,就会阻塞。因此Redis从4.0版本开始提供了UNLINK命令,用于以异步的方式移除指定的键。

  • 清空数据库

FLUSH命令可清空当前正在使用的数据库,然后返回OK表示数据库已被清空。

与DEL命令一样,FLUSHDB命令也是一个同步移除命令,并且因为FLUSHDB移除的是整个数据库而不是单个键,所以它常常会引发比DEL命令更为严重的服务器阻塞现象。
为了解决这个问题,Redis 4.0给FLUSHDB命令新添加了一个async选项:FLUSHDB async,可用于异步清空数据库。

除此之外,FLUSHALL命令可以清空Redis服务器包含的所有数据库。与FLUSHDB命令一样,以同步方式执行的FLUSHALL命令也可能会导致服务器阻塞,因此Redis 4.0也给FLUSHALL命令添加了同样的async选项:FLUSHALL async

  • 数据库互换数据

SWAPDB命令接受两个数据库号码作为输入,然后对指定的两个数据库进行互换,最后返回OK作为结果:SWAPDB x y

互换数据库这一操作可以通过调整指向数据库的指针来实现,这个过程不需要移动数据库中的任何键值对,所以SWAPDB命令的复杂度是O(1)而不是O(N),并且执行这个命令也不会导致服务器阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值