👨🎓作者:Java学术趴
✏️博客:
CSDN
、
掘金
、
InfoQ
、
云+社区
💌公众号:Java学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号
Java学术趴
联系小编。
☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
2.2 Redis中针对key的操作
2.2.1 Redis中对于键(key)的操作
-
set key key值
:设置一条数据,key: 键名,key值:这个key对应的值
-
keys
:查看当前库下所有的key。 -
exists key
: 判断某个key是否存在。 -
type key
: 查看某个key是什么类型。 -
del key
: 删除指定的key数据。 -
unlink key
:根据value选择非阻塞删除,仅将 keys 从 keyspace 元数据中删除,真正的删除会在后续异步操作。 -
expire key 10
: 为指定的 key 设置过期时间,
10秒钟后删除
-
ttl key
: 查询还有多少秒过期,
-1代表永不删除,-2代表已过期。
-
select 数据库编号
:切换数据库。 -
dbsize :
查看当前数据库的 key 数量。 -
flushdb
: 清空当前数据库。 -
flushall
: 删除全部数据库中的数据。
2.3 Redis——String类型的数据
2.3.1 String类型简介
- String是Redis中最基本的数据类型,一个key对应一个value。
-
String类型是
二进制安全
的,意味着Redis的String可以包含任何数据。比如:jpg图片或者是序列化对象。 -
String类型是Redis中最基本的数据类型,一个Redis中字符串value最多可以是
512M
。
2.3.2 常用命令
-
set
: 添加键值对。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wjop5xwH-1664780407253)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/134cbf2ad50d4feb81da3cdc0ed7632e~tplv-k3u1fbpfcp-zoom-1.image)]
EX
: 当数据库中的 key 不存在时,可以将 key-value 添加数据库。
XX
: 当数据库中 key 存在时,可以将 key-value 添加数据库,与NX参数互斥。
EX
: key 的超时秒数。
PX
: key 的超时毫秒值,与 EX 互斥。
-
get
: 查询对应的键值。 -
append
: 将给定的追加到原值的末尾。 -
strlen
: 获取键值的长度。 -
setnx
: 只有在key不存在时,设置 key 的值。 -
mset
: 同时设置一个或者多个 key – value 对。 -
mget
: 同时获取一个或者多个 value。 -
msettnx
: 同时设置一个或多个 key-value,当且仅当
所有给定的key都不存在的时候,但凡有一个存在就不会进行创建(原子性)。
-
getrange<起始位置><结束位置>
: 获取值的范围,类似Java中的 substring ,
范围是闭区间,前后都包含。
-
setrange<起始位置>
: 从起始位置开始添加新的value到旧的value中,形成一个新的value。 -
setex<过期时间>
: 设置键值的同时,设置过期时间,
单位为:秒
-
getset
: 以旧换新,获取旧值的同时设置新值。
注意:以下四个命令只会对数字值进行生效。
-
incr
: 将key中存储的
数字值
增加1,如果为空,则新增值为 1。 -
decr
: 将key中存储的
数字值
减少1,如果为空,则新增值为 -1 -
incrby <步长>
: 将key中存储的数字值增加指定的长度,可以自定义步长。 -
decrby <步长>
: 将key中存储的数字值减少指定的长度,可以自定义步长。
2.3.3 String类型的底层数据结构
- String的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以修改的字符串,内部结构是实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。需要注意最大之呢个存储 512M 大小的字符串。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNGTuOMD-1664780407254)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a9b8c2a6c64f46cd8f56e0e6ba814454~tplv-k3u1fbpfcp-zoom-1.image)]
2.4 Redis——List列表类型的数据
2.4.1 简介
列表存储数据的模式:单键多值
- String类型中 value 只是一个字符串,叫做单值。List类型中的 value 是多个字符串组合成的一个列表。
-
Redis列表是简单的字符串列表,
按照插入的顺序排序存储
,你可以添加一个元素到列表的头部或者尾部。 -
它的底层其实是一个
双向链表
,对两端的操作性能很高,通过索引下标操作中间节点的效率会很低。
2.4.2 常用命令
-
lpush/rpush
: 从左边/右边插入一个或者多个值。 -
lpop/rpop
: 从左边/右边吐出一个值。
值在键在,值光键亡
-
rpoplpush
: 从 列表右边吐出一个值,插入到 列表左边。 -
lrange
: 按照索引下标获得元素,
从左到右,下标从0开始。
-
lrange 0 -1
: 0左边第一个,-1右边第一个,该命令可以获取全部数据。 -
lindex
: 按照下标获取指定的元素,从左到右。 -
llen
: 获取列表长度。 -
。insert before
: 在 的后面插入新的值。 -
lrem
:从左边删除 n 个value值(从左到右)。 -
lset
: 将列表 key 下表为 index 的值替换成value。
2.4.3 数据结构
List的数据结构为快速链表 quickList
- 首先在列表元素较少的情况下会使用一块链接的内存存储,这个结构是 ziplist ,也即使压缩列表。
- 它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
- 当数据量比较多的时候会改成 quicklist,以下就是一个 quicklist,它是由多个压缩列表 ziplist 构成的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHx97UsY-1664780407255)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/74c8b44f32bf458781d1eab534a311bd~tplv-k3u1fbpfcp-zoom-1.image)]
- Redis将链表和 ziplist 结合起来组成了quicklist。也就是将多个 ziplist 使用双向指针串起来。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
2.5 Redis——Set集合类型的数据
2.5.1 简介
-
Redis对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以
自动去重
的,当你需要存储一个列表数据,又不希望数据重复的时候,set是一个很好的选择,并且 set提供了判断某个成员是否在一个 set 集合内的重要接口,这个也就是 list 不能提供的。 -
Redis的 set 是String类型的无序集合。
它的底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是 o(1)。 - 一个算法,随着数据的增加,执行时间的长短是动态变化的。如果是o(1),数据增加,查找数据的时间不变。
2.5.2 常用命令
-
sadd
: 将一个或者多个元素添加到集合 key 中,已经存在的元素将被忽略。 -
smembers
: 获取到集合中所有的元素。 -
sismember
: 判断集合中是否含有该值,有返回1,没有返回0. -
scard
: 返回该集合的元素个数。 -
srem
: 删除 key 集合中的指定元素。 -
spop
: 随机从key集合中
吐出
一个值,
会从集合中删除
,如果全部取出,key消失。 -
srandmember
: 随机从key集合中
取出
n 个值,
不会从集合中删除
。默认是随机获取一个。 -
smove
: 把集合中一个值从一个集合移动到另一个集合中。 -
sinter
: 返回两个集合的
交集
元素。 -
sunion
: 返回两个集合的
并集
元素。 -
sdiff
: 返回两个集合的
差集
元素,
返回的是 key1中的,不包含key2中的元素
2.5.3 数据结构
- Set集合的数据结构是 dict 字典,字典是用哈希表实现的。
- Java中HashSet的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。
- Redis的 set 结构也是一样的,它们的内部也使用 hash 结构,所有的 value 都指向同一个内布置。
2.6 Redis—— Hash类型的数据
2.6.1 简介
- Redis中的 hash 是一个键值对集合。
- Redis hash 是一个 string 类型的 field 和 value 的映射表,hash特别适合用于存储对象。
- 类似Java里面的 Map<String,Object>
-
Hash类型最适合用于存储对象。
举个列子:
用户ID为查找的key,存储的value用户对象包含姓名、年龄、生日等信息,如果用普通的 key/value 结构来存储。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xt8q7lkH-1664780407255)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b0964dc54daf40b6b299e88f78e74ec6~tplv-k3u1fbpfcp-zoom-1.image)]
Hash主要存在以下三种方式:
第一种:JSON对象
user : {id=1,name=张三,age=20}
注意:这种是以JSON字符串的方式存储,在修改的时候需要获取全部的值然后进行修改。
第二种:对象
user : id 1
user : name 张三
user : age 20
注意:这种存储形式虽然说修改属性值的时候方便,但是会造成大量的数据存储。
第三种:Hash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WD25nKDX-1664780407256)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/60de9ea53c474deaafae21a6f467baee~tplv-k3u1fbpfcp-zoom-1.image)]
通过key(用户ID) + field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制问题。
2.6.2 常用命令
-
hset
: 给集合中的 键赋值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SU2xheIR-1664780407257)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8676e718f1a04722bea362cf1804cf3f~tplv-k3u1fbpfcp-zoom-1.image)]
-
hget
: 从集合中取出对应的值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8ykJUDa-1664780407258)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bee4f3a4331541d99efddf337e627bb0~tplv-k3u1fbpfcp-zoom-1.image)]
-
hmset
: 批量设置 hash 的值。 -
hexists
: 查看哈希表 key 中,给定的 field 是否存在。 -
hkeys
: 列出该 hash 集合的所有 field。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EAyHEnjn-1664780407259)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab9b78ac7d3a485c9a8605d407476061~tplv-k3u1fbpfcp-zoom-1.image)]
-
hvals
: 列出该 hash 集合中所有的 value。 -
hincrby
: 为哈希表 key 中的阈 field 的值加上增量 increment。只能给 Integer 类型的数据添加,就是做的简单的加减法运算。 -
hsetnx
: 将哈希表 key 中的阈 field 的值设置为 value,当且仅当阈 field不存在的时候才会设置,存在的话直接忽略。
2.6.3 数据结构
-
Hash类型对应的数据结构是两种:
ziplist(压缩列表),hashtable(哈希表)
。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
2.7 Redis—— zset类型的数据
2.7.1 简介
-
zset是一个有序的、没有重复元素的字符串集合。
-
在 zset 中每个成员都关联了一个
评分(score)
,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。
集合中饿成员是唯一的,但是评分是可以重复的。
- 因为元素是有序的,所以你可以很快的根据评分或者次序来获取一个范围的元素。
- 访问有序集合中的元素也是非常快的,因此你能够使用有序集合做一个没有重复成员的智能列表。
2.7.2 常用命令
-
zadd
: 将一个或者多个 member 元素及其 score 值加入到有序集合 key 中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsZsOA6B-1664780407259)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/50efb5a82d7641c59e43c5a657721ff3~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrange
[WITHSCORES]
: 返回有序集合中,下标在 与
之间的元素。
带有 WITHSCORES ,可以让分数和值返回到结果集中。
-
其中包含 与
,是一个闭区间,并且下标是从0开始的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmhytTqD-1664780407259)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f9932e7264c248dd92d75bb9d663f357~tplv-k3u1fbpfcp-zoom-1.image)]
- 如果想把 score 和 value 一起显示,添加 WITHSCORES 参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VwQpmRQi-1664780407260)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ee78a8c43cc44bb5a8def7ed30e7683f~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrange key 0 -1(查询全部的成员),并且根据 score 升序排序。
-
其中包含 与
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwzTUmhb-1664780407260)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18214413e8c640c5a758fd4b34c61fe4~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrangebyscore minmax [WITHSCORES]
: 返回集合 key 中,所有 score 值介于 min 和 max 之间(包含 min 、max) 的成员,从小到大排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3lk0CGM-1664780407261)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab2eb8f473434569867833c491df275c~tplv-k3u1fbpfcp-zoom-1.image)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQ6Lw4Br-1664780407261)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/af1c9fd31c7e411fb64fae71f38f4d62~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrevrangebyscore maxmin [WITHSCORES]
: 同上 ,改为从大到校排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37Du1cQ3-1664780407262)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/842cfbfa5fab43219a2a1c9682527a18~tplv-k3u1fbpfcp-zoom-1.image)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPmBxwKe-1664780407262)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9befc6f616954e71b1605ce54f54476e~tplv-k3u1fbpfcp-zoom-1.image)]
-
zincyby
: 为元素的 score 加上增量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPIkjlOU-1664780407262)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/894554d80c8540bf81f719ea9ae2cd37~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrem
: 删除该集合下,指定值的元素。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dgtc3mp7-1664780407263)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b20af77792ec47c6ae07747f86fca42f~tplv-k3u1fbpfcp-zoom-1.image)]
-
zcount
: 统计该集合,分数区间内的元素个数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEGEl3tv-1664780407263)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3fe8351968a74fde8081b15f2c3e96a6~tplv-k3u1fbpfcp-zoom-1.image)]
-
zrank
: 返回该值在集合中排名,从0开始。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thDeWWPk-1664780407264)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bcc1c1c5e11f4747ac79b32fa8c3b654~tplv-k3u1fbpfcp-zoom-1.image)]
案列:使用 zset 实现一个文章访问量的排序?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75QdYRBc-1664780407264)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e995b8f3c80f49688bed8b63ce637be0~tplv-k3u1fbpfcp-zoom-1.image)]
2.7.3 数据结构
- SortedSet(zset) : Redis提供的一个非常特别的数据结构,一方面它等价于 Java 的数据结构 Map<String,Double> ,可以给每一个元素 value 赋予一个权重 score,另一方面它又类似于 TreeSet,内部的元素会按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表。
zset 底层使用了两个数据结构:
- hash : hash的作用就是关联元素 value 和权重 score ,保障元素 value 的唯一性,可以通过元素 value 找到相应的 score 值。
- 跳跃表:跳跃表的目的在于给元素value 排序,根据 score 的范围获取元素列表。