Redis *** 作数据常用命令详细注释

Redis *** 作数据常用命令详细注释,第1张

​ 使用help查询有哪些命令

​ 示例所有Key名都为bigkang为示例

​ 首先我们需要了解什么是Bit,其实所有的Bit *** 作都是在 *** 作字符串类型,我们设置了bit以后可以发现他的类型其实是一个String

​ 然后我们来获取这个bit的类型

​ 那么我们就会发现其实存储的数据是一个字符串,那么字符串和bit有什么关系呢,我们知道Redis中的字符串底层采用的SDS,实际上它存储的一个char数组,那么这个char数组,那么C语言中一个char等于1个byte,一个byte等于8个bit,我们可以知道一个char能够存储8个bit,那么Redis的String能够存储512MB,那么我们再来看一下最大能够存储多少个bit位:

​ 最大存储数量

​ 512 1024 1024 8 = 42 9496 7296 (大约43亿)

​ MB KB Byte BIit

​ 我们就能够存储大约43亿bit,每个bit的值只能是0 或者 1

​ 我们上访的 *** 作 setbit newbit 1 1 就是将bit位为1,也就是第二个bit设置为1,bit为数组

​ 大概的流程图如下:

​ 这样我们就可以知道bit位在 0 - 7的属于第一个字节,8 - 15属于第二个字节,那么我们现在来测试一下吧

​ 例如我们想要获取某个bit位的值,我们使用getbit

​ BitCount可以统计我们的Bit数组中的值为1的数据,例如我想要统计bit位的值的结果有多少。(!注意是根据一个char,也就是一个byte=8bit进行统计,每个值表示相应的8个bit)

​ 如下

​ 或者根据范围进行统计

​ Bit主要用来帮助我们对不同Bit进行 *** 作,和Set中的并集,并归等类似。

​ 现在我们来初始化两个bit数据

​ 目前两个Bit中的结构如下

​ 那么我们知道既然是二进制,那么肯定是有运算的,例如与,或等等

​ Redis提供了如下几种

​ AND

​ OR

​ NOT

​ XOR

​ Bit *** 作可以帮助我们存储大量的数据,以及状态,我们可以在多个场景下使用,例如用户的连续登录,以及活跃用户统计。

​ 例如如下 *** 作,我们的Key采用 login-年-月-日 ,bit位 使用用户ID,状态为1

在 redis 实际使用中,会遇到一个问题:如何从海量的 key 中找出满足特定前缀的 key 列表来?

redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。

这个指令有致命的弊端,在实际环境中最好不要使用:

我们可以通过配置设置禁用这些命令,在 redisconf 中,在 SECURITY 这一项中,我们新增以下命令:

另外,对于FLUSHALL命令,需要设置配置文件中appendonly no,否则服务器是无法启动。

Redis 为了解决这个问题,它在 28 版本中加入了 scan 。scan 相比 keys 具备有以下特点:

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

scan 参数提供了三个参数,第一个是 cursor 整数值 ,第二个是 key 的正则模式 ,第三个是 遍历的 limit hint 。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。

从上面的过程可以看到虽然提供的 limit 是 1000,但是返回的结果只有 10 个左右。因为这个 limit 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。

在 Redis 中所有的 key 都存储在一个很大的字典中,这个字典的结构和 Java 中的 HashMap 一样,是一维数组 + 二维链表结构,第一维数组的大小总是 2^n(n>=0),扩容一次数组大小空间加倍,也就是 n++。

scan 指令返回的游标就是第一维数组的位置索引,我们将这个位置索引称为槽 (slot)。如果不考虑字典的扩容缩容,直接按数组下标挨个遍历就行了。limit 参数就表示需要遍历的槽位数,之所以返回的结果可能多可能少,是因为不是所有的槽位上都会挂接链表,有些槽位可能是空的,还有些槽位上挂接的链表上的元素可能会有多个。每一次遍历都会将 limit 数量的槽位上挂接的所有链表元素进行模式匹配过滤后,一次性返回给客户端。

scan 的遍历顺序非常特别。它不是从第一维数组的第 0 位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。

高位进位法从左边加,进位往右边移动,同普通加法正好相反。但是最终它们都会遍历所有的槽位并且没有重复。

Java 中的 HashMap 有扩容的概念,当 loadFactor 达到阈值时,需要重新分配一个新的 2 倍大小的数组,然后将所有的元素全部 rehash 挂到新的数组下面。rehash 就是将元素的 hash 值对数组长度进行取模运算,因为长度变了,所以每个元素挂接的槽位可能也发生了变化。又因为数组的长度是 2^n 次方,所以取模运算等价于位与 *** 作。

这里的 7, 15, 31 称之为字典的 mask 值,mask 的作用就是保留 hash 值的低位,高位都被设置为 0。

接下来我们看看 rehash 前后元素槽位的变化。

假设当前的字典的数组长度由 8 位扩容到 16 位,那么 3 号槽位 011 将会被 rehash 到 3 号槽位和 11 号槽位,也就是说该槽位链表中大约有一半的元素还是 3 号槽位,其它的元素会放到 11 号槽位,11 这个数字的二进制是 1011,就是对 3 的二进制 011 增加了一个高位 1。

抽象一点说,假设开始槽位的二进制数是 xxx,那么该槽位中的元素将被 rehash 到 0xxx 和 1xxx(xxx+8) 中。 如果字典长度由 16 位扩容到 32 位,那么对于二进制槽位 xxxx 中的元素将被 rehash 到 0xxxx 和 1xxxx(xxxx+16) 中。

观察这张图,我们发现采用高位进位加法的遍历顺序,rehash 后的槽位在遍历顺序上是相邻的。

假设当前要即将遍历 110 这个位置 (橙色),那么扩容后,当前槽位上所有的元素对应的新槽位是 0110 和 1110(深绿色),也就是在槽位的二进制数增加一个高位 0 或 1。这时我们可以直接从 0110 这个槽位开始往后继续遍历,0110 槽位之前的所有槽位都是已经遍历过的,这样就可以避免扩容后对已经遍历过的槽位进行重复遍历。

再考虑缩容,假设当前即将遍历 110 这个位置 (橙色),那么缩容后,当前槽位所有的元素对应的新槽位是 10(深绿色),也就是去掉槽位二进制最高位。这时我们可以直接从 10 这个槽位继续往后遍历,10 槽位之前的所有槽位都是已经遍历过的,这样就可以避免缩容的重复遍历。不过缩容还是不太一样,它会对图中 010 这个槽位上的元素进行重复遍历,因为缩融后 10 槽位的元素是 010 和 110 上挂接的元素的融合。

Java 的 HashMap 在扩容时会一次性将旧数组下挂接的元素全部转移到新数组下面。如果 HashMap 中元素特别多,线程就会出现卡顿现象。Redis 为了解决这个问题,它采用渐进式 rehash。

它会同时保留旧数组和新数组,然后在定时任务中以及后续对 hash 的指令 *** 作中渐渐地将旧数组中挂接的元素迁移到新数组上。这意味着要 *** 作处于 rehash 中的字典,需要同时访问新旧两个数组结构。如果在旧数组下面找不到元素,还需要去新数组下面去寻找。

scan 也需要考虑这个问题,对与 rehash 中的字典,它需要同时扫描新旧槽位,然后将结果融合后返回给客户端。

redis 127001:6379> config get max--entries

1) "hash-max-zipmap-entries"

2) "512"

3) "list-max-ziplist-entries"

4) "512"

5) "set-max-intset-entries"

6) "512"

首先要链接redis客户端

redis-cli

然后要通过key来查找你存的数据,相当于一个数组,有key,有value,通过key来查看value的值。

keys 注:列出当前redis存储的全部key。

keys W 注:列出当前redis存储的key名里第一个是“W”的全部key。

找到key名字后,就可以查看key里存了什么值了。

get WXOX 注:WXOX是你查出来的key的名字。

然后就可以看到WXOX里存了什么东西了,可能存了一个字符串,也可能存了一个对象,要是空的话,就会输出nil,意思是啥也没有!

命令格式

中文

查看Redis里面有多少Key

命令格式

获取不存在的Key返回 nil

命令格式

创建redis客户连接

创建字符串

获得字符串的值

更新字符串的值,key存在则不覆盖

对字符串进行增加和减小

向列表中插入数据的命令为:

从列表左侧插入数据

“lpush”和“rpush”语法相同

命令格式

查看索引为6的数据

查看索引从2到5的数据,包含两端

命令格式

在数据d出的同时,被d的数据也会从列表中删除

修改命令

批量添加

Python中使用列表向Redis列表中批量添加数据

在Python中获取Redis列表的多个数据

使用for循环把数据展开

从左右侧d出数据

命令格式

命令格式

命令格式

smembers命令不会删除数据。如果集合里的数据量极大,谨慎使用,消耗系统I/O资源

如果数据存在,则返回“1”;如果数据不存在,则返回“0”

删除特定的数据

命令格式

命令格式

命令格式

求key1中有,在key2 key3没有的数据

“scard”查看集合中数据条数,“spop”从集合中获取一条数据,Python中无“count”参数

“smembers”读取集合全部数据

“srem”删除特定数据

1、redis安装 windows环境的redis下载、安装,请参见以下经验,redis下载:>

以上就是关于Redis *** 作数据常用命令详细注释全部的内容,包括:Redis *** 作数据常用命令详细注释、Redis 之用 scan 模糊匹配 key、redis 命令get什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10178148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存