Skip to content

Commit 86a0551

Browse files
author
fupingstar
committed
Redis
1 parent 2eb6e17 commit 86a0551

File tree

1 file changed

+44
-43
lines changed

1 file changed

+44
-43
lines changed

docs/database/Redis/redis-collection/Redis(10)——Redis数据类型、编码、数据结构的关系.md

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Redis构建了自己的类型系统,主要包括
55
+ redisObject对象
66
+ 基于redisObject对象的类型检查
77
+ 基于redisObject对象的显示多态函数
8-
+ 对redisObject进行分配、共享和销毁的机智
8+
+ 对redisObject进行分配、共享和销毁的机制
99

1010
__C语言不是面向对象语言,这里将redisObject称呼为对象是为了讲述方便,让里面的内容更容易被理解,redisObject其实是一个结构体。__
1111

@@ -49,7 +49,7 @@ typedef struct redisObject{
4949

5050
### 命令的类型检查和多态
5151

52-
#### 命令分类
52+
#### Redis命令分类
5353

5454
+ 一种是只能用于对应数据类型的命令,例如LPUSH和LLEN只能用于列表键, SADD 和 SRANDMEMBER只能用于集合键。
5555
+ 另一种是可以用于任何类型键的命令。比如TTL。
@@ -76,22 +76,25 @@ __string 是最常用的一种数据类型,普通的key/value存储都可以
7676
+ embstr编码
7777
+ 保存长度小于44字节的字符串
7878

79-
<font color="red">int用来保存整数值,raw用来保存长字符串,embstr用来保存短字符串。embstr编码是用来专门保存短字符串的一种优化编码</font>
79+
<font color="red">int用来保存整数值,raw用来保存长字符串,embstr用来保存短字符串。embstr编码是用来专门保存短字符串的一种优化编码</font>
8080

8181
<font color="red">Redis中对于浮点型也是作为字符串保存的,在需要时再将其转换成浮点数类型</font>
82-
<font color="red">编码的转换:1.当 int 编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw 2.对于 embstr 编码,由于 Redis 没有对其编写任何的修改程序(embstr 是只读的),在对embstr对象进行修改时,都会先转化为raw再进行修改,因此,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。</font>
82+
83+
+ 编码的转换
84+
+ 当 int 编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw
85+
+ 对于 embstr 编码,由于 Redis 没有对其编写任何的修改程序(embstr 是只读的),在对embstr对象进行修改时,都会先转化为raw再进行修改,因此,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。
8386

8487
+ 常用命令
8588

8689
+ set/get
8790

88-
+ set:设置key对应的值为String类型的value (多次set name会覆盖)
91+
+ set:设置key对应的值为string类型的value (多次set name会覆盖)
8992
+ get:获取key对应的值
9093

9194
+ mset /mget
9295

9396
+ mset 批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
94-
+ mget批量获取多个key的值,如果可以不存在则返回null
97+
+ mget批量获取多个key的值,如果不存在则返回null
9598

9699
```shell
97100
127.0.0.1:6379> mset user1:name redis user1:age 22
@@ -123,7 +126,7 @@ __string 是最常用的一种数据类型,普通的key/value存储都可以
123126
+ setrange/getrange
124127

125128
+ setrange从指定位置替换字符串
126-
+ getrange获取key对应value子字符串
129+
+ getrange获取key对应value子字符串
127130

128131
+ 其他命令
129132

@@ -135,13 +138,13 @@ __string 是最常用的一种数据类型,普通的key/value存储都可以
135138
+ 应用场景
136139

137140
+ 因为string类型是二进制安全的,可以用来存放图片,视频等内容。
138-
+ 由于red is的高性能的读写功能,而string类型的value也可以是数字,可以用做计数器(使用INCR,DECR指令)。比如分布式环境中统计系统的在线人数,秒杀等。
141+
+ 由于redis的高性能的读写功能,而string类型的value也可以是数字,可以用做计数器(使用INCR,DECR指令)。比如分布式环境中统计系统的在线人数,秒杀等。
139142
+ 除了上面提到的,还有用于SpringSession实现分布式session
140143
+ 分布式系统全局序列号
141144

142145
### list
143146

144-
__list列表,它是简单的字符串列表,你可以添加一个元素到列表的头部,或者尾部,底层实际上是个链表结构__
147+
__list列表,它是简单的字符串列表,你可以添加一个元素到列表的头部,或者尾部__。
145148

146149
+ 编码
147150

@@ -154,7 +157,7 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
154157

155158
+ 常用命令
156159

157-
+ lpush 从头部加入元素
160+
+ lpush 从头部加入元素
158161

159162
```shell
160163
127.0.0.1:6379> lpush list1 hello
@@ -166,7 +169,7 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
166169
2) "hello"
167170
```
168171

169-
+ rpush从尾部加入元素
172+
+ rpush:从尾部加入元素
170173

171174
```shell
172175
127.0.0.1:6379> rpush list2 world
@@ -178,7 +181,7 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
178181
2) "hello"
179182
```
180183

181-
+ lpop 从list的头部删除元素,并返回删除的元素
184+
+ lpop 从list的头部删除元素,并返回删除的元素
182185

183186
```shell
184187
127.0.0.1:6379> lrange list1 0 -1
@@ -190,7 +193,7 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
190193
1) "hello"
191194
```
192195

193-
+ rpop从list的尾部删除元素,并删除指定的元素
196+
+ rpop:从list的尾部删除元素,并返回删除的元素
194197

195198
```shell
196199
127.0.0.1:6379> lrange list2 0 -1
@@ -240,8 +243,8 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
240243
2) "b"
241244
```
242245

243-
+ lindex 返回名称为key的list中指定位置的元素
244-
+ llen 返回list中的元素的个数
246+
+ lindex: 返回list中指定位置的元素
247+
+ llen 返回list中的元素的个数
245248
+ 实现数据结构
246249

247250
+ Stack(栈)
@@ -260,8 +263,6 @@ __list列表,它是简单的字符串列表,你可以添加一个元素到列
260263

261264
__集合对象set是string类型(整数也会转成string类型进行存储)的无序集合。注意集合和列表的区别:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。__
262265

263-
__Redis中集合SET相当于Java中的HashSet,内部的键值对是无序的,唯一的。内部实现相当于一个特殊的字典,字典中所有的value都是NULL。__
264-
265266
+ 编码
266267

267268
+ 集合对象的编码可以是intset或者hashtable
@@ -275,8 +276,8 @@ __Redis中集合SET相当于Java中的HashSet,内部的键值对是无序的
275276

276277
+ 常用命令
277278

278-
+ sadd 向集合中添加元素 (set不允许元素重复)
279-
+ smembers 查看集合中的元素
279+
+ sadd 向集合中添加元素 (set不允许元素重复)
280+
+ smembers 查看集合中的元素
280281

281282
```shell
282283
127.0.0.1:6379> sadd set1 aaa
@@ -291,10 +292,10 @@ __Redis中集合SET相当于Java中的HashSet,内部的键值对是无序的
291292
3) "bbb"
292293
```
293294

294-
+ srem 删除集合元素
295-
+ spop 随机返回删除的key
295+
+ srem 删除集合元素
296+
+ spop 随机返回删除的key
296297

297-
+ sdiff 返回两个集合的不同元素 (哪个集合在前就以哪个集合为标准)
298+
+ sdiff 返回两个集合的不同元素 (哪个集合在前就以哪个集合为标准)
298299

299300
```shell
300301
127.0.0.1:6379> smembers set1
@@ -311,8 +312,8 @@ __Redis中集合SET相当于Java中的HashSet,内部的键值对是无序的
311312
2) "rrr"
312313
```
313314

314-
+ sinter 返回两个集合的交集
315-
+ sinterstore 返回交集结果,存入目标集合
315+
+ sinter 返回两个集合的交集
316+
+ sinterstore 返回交集结果,存入目标集合
316317

317318
```shell
318319
127.0.0.1:6379> sinterstore set3 set1 set2
@@ -321,13 +322,13 @@ __Redis中集合SET相当于Java中的HashSet,内部的键值对是无序的
321322
1) "bbb"
322323
```
323324

324-
+ sunion 取两个集合的并集
325-
+ sunionstore 取两个集合的并集,并存入目标集合
325+
+ sunion 取两个集合的并集
326+
+ sunionstore 取两个集合的并集,并存入目标集合
326327

327-
+ smove 将一个集合中的元素移动到另一个集合中
328-
+ scard 返回集合中的元素个数
329-
+ sismember 判断某元素是否存在某集合中,0代表否 1代表是
330-
+ srandmember 随机返回一个元素
328+
+ smove 将一个集合中的元素移动到另一个集合中
329+
+ scard 返回集合中的元素个数
330+
+ sismember 判断某元素是否存在某集合中,0代表否 1代表是
331+
+ srandmember 随机返回一个元素
331332

332333
```shell
333334
127.0.0.1:6379> srandmember set1 1
@@ -359,21 +360,21 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
359360
//字典
360361
dict *dice;
361362
}zset
362-
字典的键保存元素的值,字典的值保存元素的分值,跳跃表节点的object属性保存元素的成员,跳跃表接待的score属性保存元素的分值。这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。编码转换
363+
字典的键保存元素的值,字典的值保存元素的分值,跳跃表节点的object属性保存元素的成员,跳跃表节点的score属性保存元素的分值。这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。
363364
```
364365

365366
+ 编码转换
366367

367-
+ 当有序结合对象同时满足以下两个条件时,对象使用ziplist编码,否则使用skiplist
368+
+ 当有序结合对象同时满足以下两个条件时,对象使用ziplist编码,否则使用skiplist编码
368369
+ 保存的元素数量小于128
369370
+ 保存的所有元素长度都小于64字节
370371

371372
+ 常用命令
372373

373-
+ zrem 删除集合中名称为key的元素member
374-
+ zincrby 以指定值去自动递增
375-
+ zcard 查看元素集合的个数
376-
+ zcount 返回score在给定区间中的数量
374+
+ zrem 删除集合中名称为key的元素member
375+
+ zincrby 以指定值去自动递增
376+
+ zcard 查看元素集合的个数
377+
+ zcount 返回score在给定区间中的数量
377378

378379
```shell
379380
127.0.0.1:6379> zrange zset 0 -1
@@ -389,7 +390,7 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
389390
(integer) 4
390391
```
391392

392-
+ zrangebyscore 找到指定区间范围的数据进行返回
393+
+ zrangebyscore 找到指定区间范围的数据进行返回
393394

394395
```shell
395396
127.0.0.1:6379> zrangebyscore zset 0 4 withscores
@@ -403,7 +404,7 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
403404
8) "4"
404405
```
405406

406-
+ zremrangebyrank zset from to 删除索引
407+
+ zremrangebyrank zset from to 删除索引
407408

408409
```shell
409410
127.0.0.1:6379> zrange zset 0 -1
@@ -422,7 +423,7 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
422423
423424
```
424425

425-
+ zremrangebyscore zset from to 删除指定序号
426+
+ zremrangebyscore zset from to 删除指定序号
426427

427428
```shell
428429
127.0.0.1:6379> zrange zset 0 -1 withscores
@@ -439,8 +440,8 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
439440
2) "1"
440441
```
441442

442-
+ zrank 返回排序索引 (升序之后再找索引)
443-
+ zrevrank 返回排序索引 (降序之后再找索引)
443+
+ zrank 返回排序索引 (升序之后再找索引)
444+
+ zrevrank 返回排序索引 (降序之后再找索引)
444445

445446
+ 应用场景
446447

@@ -450,14 +451,14 @@ __和集合对象相比,有序集合对象是有序的。与列表使用索引
450451

451452
__hash对象的键是一个字符串类型,值是一个键值对集合__
452453

453-
+ ENCODING
454+
+ 编码
454455

455456
+ hash对象的编码可以是ziplist或者hashtable
456457
+ 当使用ziplist,也就是压缩列表作为底层实现时,新增的键值是保存到压缩列表的表尾。
457458
+ hashtable 编码的hash表对象底层使用字典数据结构,哈希对象中的每个键值对都使用一个字典键值对。__Redis中的字典相当于Java里面的HashMap,内部实现也差不多类似,都是通过“数组+链表”的链地址法来解决哈希冲突的,这样的结构吸收了两种不同数据结构的优点。__
458459

459460
+ 编码转换
460-
+ 当同时满足下面两个条件使用ziplist,否则使用hashtable
461+
+ 当同时满足下面两个条件使用ziplist编码,否则使用hashtable编码
461462
+ 列表保存元素个数小于512个
462463
+ 每个元素长度小于64字节
463464

0 commit comments

Comments
 (0)