使用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什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)