诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!

文章图片

诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!



集合:集合 (set)类型还用于保存多个字符串元素 , 但与列表类型不同的是 , 在集合中不允许存在重复元素 , 且集合中的元素是无序的 , 无法通过索引下标获得元素 。 如图显示了集合user:1:follow包含4个元素:\"it\"、\"music\"、\"his\"、\"sports\" , 一个集合可以存储最多232-1个元素 。 除了支持对集合进行增删改查外 , Redis还支持多个集合取交集 , 并集 , 差集 , 合理使用好的集合类型 , 可以解决实际开发中的许多实际问题 。命令:
一、集合内操作:
1、添加元素:
sadd key element [element ...



2、删除元素:
srem key element [element ...

返回结果为成功删除元素个数


3、计算元素个数:

4、判断元素是否在集合中
sismember key element

如果给定元素element在集合内返回1 , 反之返回0


5、随机从集合返回指定个数元素

srandmember key [count

[count
是可选参数 , 如果不写默认为1


6、从集合随机弹出元素
spop key
spop操作可以从集合中随机弹出一个元素 , 例如下面代码是一次spop后 , 集合元素变为\"d b a\"


7、获取所有元素
smembers key
获取集合myset所有元素 , 并且返回结果是无序的


二、集合间操作:
现在有两个集合 , 它们分别是user:1:follow和user:2:follow


1、求多个集合的交集
sinter key [key ...

例如下面代码是求user:1:follow和user:2:follow两个集合的交集 , 返回结果是sports、it


2、求多个集合的并集
suinon key [key ...

如下代码是求user:1:follow和user:2:follow两个集合的并集 , 返回结果是sports、it、his、news、music、ent


3、求多个集合的差集
sdiff key [key ...

如下代码是求user:1:follow和user:2:follow两个集合的差集 , 返回结果是music和his


4、将交集、并集、差集的结果保存
sinterstore destination key [key ...

suionstore destination key [key ...

sdiffstore destination key [key ...



有序集合:

有序集合相对于哈希、列表、集合相比略有异同 , 但既然称之为有序集合 , 它与集合必然有联系 , 它保留了集合不能有重复成员的特征 , 但不同之处在于 , 有序集合中的元素可以排序 。 但它与列表使用索引下标作为排序依据不同的是 , 它为每个元素设置了一个分数(score)作为排序依据 。 这个有序集合由krismikefranktimmartintom组成 , 其分数分别为191200220250251组成 , 这个有序集合提供了获取指定分数和元素范围查询 , 计算成员排名等功能 , 合理地使用这个有序集合 , 可以帮助我们解决实际开发中的许多问题 。

注:顺序集中的元素不能重复 , 但 score可以重复 , 就像班上的同学不能重复学号一样 , 但考试成绩可以一样 。

列表、集合、有序集合三者的异同点

命令:
一、集合内:
1、添加成员:
zadd key score member [score member ...

向有序集合user:ranking添加用户tom和他的分数251


2、计算成员个数


3、计算某个成员的分数
zscore key member
tom的分数为251 , 如果成员不存在则返回nil


4、计算成员的排名:
zrank key member
zrevrank key member
zrank是从分数从低到高返回排名 , zrevrank反之 。 例如下面操作中 , tom在zrank和zrevrank分别排名第5和第0(排名从0开始计算)
【诺基亚|关于redis数据面试指南1.0——Redis的数据类型[二]!】

5、删除成员
zrem key member [member ...

将成员mike从有序集合user:ranking中删除


返回结果为成功删除的个数 。
6、增加成员的分数
zincrby key increment member
下面操作给tom增加了9分 , 分数变为了260分


7、返回指定排名范围的成员
zrange    key start end [withscores

zrevrange key start end [withscores

注意:start end可以使用0 -1代指全部
有序集合是按照分值排名的 , zrange是从低到高返回 , zrevrange反之 。 下面代码返回排名最低的是三个成员 , 如果加上withscores选项 , 同时会返回成员的分数 。


8、返回指定分数范围成员个数
zcount key min max
返回200到221分的成员的个数


二、集合间操作:
将两个有序集合导入到Redis中



1、交集:
zinterstore destination numkeys key [key ...
[weights weight [weight ...

 [aggregate sum|min|max

解释:
destination:交集计算结果保存到这个键 。
numkeys:需要做交集计算键的个数 。
key[key...
:需要做交集计算的键 。
weights weight[weight...
:每个键的权重 , 在做交集计算时 , 每个键中的每个member会将自己分数乘以这个权重 , 每个键的权重默认是1 。
aggregate sum|min|max:计算成员交集后 , 分值可以按照sum(和)、min(最小值)、max(最大值)做汇总 , 默认值是sum 。
对user:ranking:1和user:ranking:2做交集 , weights和aggregate使用了默认配置 , 可以看到目标键user:ranking:1_inter_2对分值做了sum操作:


如果想让user:ranking:2的权重变为0.5 , 并且聚合效果使用max , 可以执行如下操作:


并集:
zunionstore destination numkeys key [key ...
[weights weight [weight ...

   [aggregate sum|min|max

命令的所有参数和zinterstore是一致的 , 只不过是做并集计算 , 例如下面操作是计算user:ranking:1和user:ranking:2的并集 , weights和aggregate使用了默认配置 , 可以看到目标键user:ranking:1_union_2对分值做了sum操作:

键管理:
一、单个键管理
针对单个键的命令 , 前面几节已经介绍过一部分了 , 例如type、del、object、exists、expire等 , 下面将介绍剩余的几个重要命令 。
1、键重命名
rename key newkey
现有一个键值对 , 键为python , 值为jedis


将键python重命名为java


如果在rename之前 , 键java已经存在 , 那么它的值也将被覆盖 , 如下所示

2、随机返回一个键
randomkey
当前数据库有1000个键值对 , randomkey命令会随机从中挑选一个键


3、键过期
它可以自动将带有过期时间的键删除 , 在许多应用场景都非常有帮助 。
expire key seconds:键在seconds秒后过期 。
expireat key timestamp:键在秒级时间戳timestamp后过期 。
为键hello设置了10秒的过期时间 , 然后通过ttl观察它的过期剩余时间(单位:秒) , 随着时间的推移 , ttl逐渐变小 , 最终变为-2


ttl命令和pttl都可以查询键的剩余过期时间 , 但是pttl精度更高可以达到毫秒级别 , 有3种返回值:
大于等于0的整数:键剩余的过期时间(ttl是秒 , pttl是毫秒) 。
-1:键没有设置过期时间 。
-2:键不存在 。
pexpire key milliseconds:键在milliseconds毫秒后过期 。
4、Redis过期命令注意事项
4.1、如果expire key 的键不存在 , 返回结果0

4.2、如果过期时间为负值 , 键立即被删除 , 犹如del命令一样

4.3、persist可以将键的过期时间清除

4.4、对于字符串类型键 , 执行set命令会去掉过期时间 。

4.5、redis不支持二级数据结构(哈希 , 列表)内部元素的过期功能 , 例如不能对列表类型的一个元素做过期时间设置 。
4.6、setex命令作为set+expire的组合 , 不但是原子执行
二、遍历键
Redis提供了两个命令遍历所有的键 , 分别是keys和scan
1、全量遍历键:
keys pattern
keys命令是支持pattern匹配的 , 例如向一个空的Redis插入4个字符串类型的键值对 。


要获取所有的键 , 可以使用keys pattern命令:


为了遍历所有的键 , pattern直接使用星号 , 这是因为pattern使用的是glob风格的通配符:
*代表匹配任意字符 。
.?代表匹配一个字符 。
[
代表匹配部分字符 , 例如[1 , 3
代表匹配1 , 3 , [1-10
代表匹配1到10的任意数字 。
\\x用来做转义 , 例如要匹配星号、问号需要进行转义 。
匹配以j , r开头 , 紧跟edis字符串的所有键:

匹配到hello和hill这两个键


三、数据库管理
Redis提供了几个面向Redis数据库的操作 , 它们分别是dbsize、select、flushdb/flushall命令 。
1、切换数据库
select dbIndex
很多关系型数据库 , 比如 MySQL支持在一个实例下存在多个数据 , 但 Redis仅仅使用数字实现了多个数据库 , 而关系型数据库使用字符区分不同的数据库名 。 在 Redis默认配置中有16个数据库:databases 16

假定 databases=16select0操作将切换到第一个数据库 , select15将选择最后一个 , 但数据库0和15之间的数据不相关 , 甚至可能有相同的键



在 Redis3.0中 , 这种功能已经被逐渐削弱了 , 比如 Redis的分布式实现 Redis Cluster只允许使用0号数据库 , 只是为了向下兼容老版本的数据库功能 , 而这个功能并没有被完全抛弃 。

第一: Redis是单线程 。 即使有多个数据库被使用 , 这些数据库仍然使用一个 CPU , 并且彼此之间仍会受到影响 。

第二:多数据库的使用方式 , 会使数据库的调试和运行变得很困难 , 即使有一个较慢的查询存在 , 仍然会影响到其他数据库 , 这会使其他业务方很难找到问题所在 。

第三:部分 Redis客户机完全不支持这种方法 。 即便有了这种支持 , 在开发过程中数字数据库也很容易被搞乱 。

2、flushdb/flushall
使用 flushdb/flushall命令清除数据库 , 其区别在于 flushdb只清除当前数据库 ,flushall将清除所有数据库 。

当前0号数据库有四个键值对、1号数据库有三个键值对:


如果在0号数据库执行flushdb , 1号数据库的数据依然还在:


在任意数据库执行flushall会将所有数据库清除:


使用 flushdb/flushall命令可以很方便地清除数据 , 但有两个问题:

一: flushdb/flushall命令清除了所有的数据 , 一旦错误操作的结果令人难以置信 ,
二:如果当前数据库有更多的键值 , 则 flushdb/flushall可能会阻塞 Redis
因此 , 使用 flushdb/flushall时必须非常小心


如果觉得对你有所帮助 。 记得收藏和关注呦!(每日更新各种大数据框架)
如需转载请注明出处(创作不易请见谅)
和巨婴程序猿一起成长 。 让自己变得更优秀
想了解更多精彩内容 , 快来关注跟着巨婴去逆袭
我最近一直在思考(大数据通俗讲解)的问题 , 你的看法是什么呢?关注我快说出来一起交流一下吧~


    推荐阅读