Linux——Redis五种数据类型

一、基础

1、全局命令

查看所有的键

192.168.1.20:6379> keys *
1) "boot"
2) "hello"

1.1 返回键对应的值

192.168.1.20:6379> set a b 
OK
192.168.1.20:6379> get a
"b"
192.168.1.20:6379> keys *
1) "boot"
2) "a"
3) "hello"

1.2 统计键的总和

192.168.1.20:6379> rpush  mylist a b c d e f g
(integer) 7
192.168.1.20:6379> dbsize    #统计
(integer) 4
192.168.1.20:6379> keys *
1) "boot"
2) "mylist"
3) "a"
4) "hello"

1.3 检查键是否存在

PS:存在返回1,不存在返回0

192.168.1.20:6379> exists java
(integer) 0
192.168.1.20:6379> exists hello
(integer) 1

1.4 删除键

PS:不管什么数据类型都可以删除,返回1是成功,0则是没有删除。

192.168.1.20:6379> set java redis
OK
192.168.1.20:6379> get java
"redis" 
192.168.1.20:6379> del java    #删除
(integer) 1
192.168.1.20:6379> exists java
(integer) 0

也可以一下删除多个

192.168.1.20:6379> set  a 1
OK
192.168.1.20:6379> set b 2
OK
192.168.1.20:6379> MGET  a b
1) "1"
2) "2"
192.168.1.20:6379> exists a b
(integer) 2
192.168.1.20:6379> del a b   #删除
(integer) 2
192.168.1.20:6379> exists a b
(integer) 0

1.5 键过期

大于等于0的整数:键剩余的过期时间

  • ttl:返回键的剩余时间

  • -1:键没设置过期时间

  • -2:键不存在

  • expire test 10 :指定键的过期时间,在超过过期时间后,会自动删除键。

192.168.1.20:6379> set test world
OK
192.168.1.20:6379> get test
"world"
192.168.1.20:6379> expire test 10 
(integer) 1
192.168.1.20:6379> ttl test
(integer) 7
192.168.1.20:6379> ttl test
(integer) 6
192.168.1.20:6379> ttl test
(integer) 4
192.168.1.20:6379> ttl test
(integer) 1
192.168.1.20:6379> ttl test
(integer) -2
192.168.1.20:6379> get test
(nil)

2、数据结构和内部编码

​ type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),但这些只是redis对外的数据结构。
​ 实际上每种数据结构都会有自己底层的内部编码实现,而且是多种实现,这样redis会在合适的场景选择合适的内部编码。

类型有几种
string(字符串)raw 、int 、embstr
hash(哈希)hashtable 、ziplist
list(列表)linkedlist 、ziplist
set(集合)hashtable、 intest
zset(有序集合)skiplist 、ziplist

键的数据结构类型

PS:可以通过object encoding命令查询内部编码

192.168.1.20:6379> set test redis
OK
192.168.1.20:6379> type test
string
192.168.1.20:6379> rpush test1 a b c d e f g
(integer) 7
192.168.1.20:6379> type test1
list
192.168.1.20:6379> object encoding test
"embstr"

内部编码好处:

  • 可以改进内部编码,而对外的数据结构和命令没有影响,这样在开发出更优秀的内部编码,不需要改变外部数据结构和命令;
  • 多种内部编码实现不同场景下发挥各自的优势;

3、单线程架构

Redis使用了单线程架构和I/O多录复用模型来实现高性能的内存数据库服务。

3.1 为什么单线程快

  • Redis将所有的数据放在内存当中,内存的相应时长大约为100纳秒,这是Redis到达每秒万级别访问的重要基础;
  • 非阻塞型I/O线程,Redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为时间,不在网络I/O上浪费过多的时间;
  • 单线程避免了因线程切换和产生的消耗;

3.2 单线程的好处

  • 单线程可以简化数据结构和算法的实现;
  • 单线程避免了线程切换和静态产生的消耗;

3.3 单线的缺点

  • 当某一条命令执行时间过长,其他命令等待时间过长,造成阻塞。

二、数据类型

1、字符串(string)

1.1 string类型

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型;
  • 存储数据的格式:一个存储空间保存一个数据;
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用;
  • expiration EX seconds:设置秒级别的过期时间

  • PX milliseconds:设置毫秒级别的过期时间

  • NX:键必须不存在,才可以设置成功(用于添加)

  • XX:键必须存在,才可以设置成功(用于更新)

  • setex——设置生命周期

#EX
192.168.1.20:6379> expire a 10
(integer) 1
192.168.1.20:6379> ttl a
(integer) 1
192.168.1.20:6379> get a
(nil)

192.168.1.20:6379> setex a 10 10086
OK
192.168.1.20:6379> ttl a
(integer) 7
192.168.1.20:6379> get a 
"10086"
192.168.1.20:6379> get a 
"10086"
192.168.1.20:6379> get a 
(nil)


#NX

192.168.1.20:6379> setnx name tom
(integer) 1
192.168.1.20:6379> get name
"tom"

#XX
192.168.1.20:6379> set hello world
OK
192.168.1.20:6379> set hello redis xx
OK
192.168.1.20:6379> get hello
"redis"

批量设置值

192.168.1.20:6379> mset t1 a  t2 b  t3 c t4 d
OK
192.168.1.20:6379> mget t1 t2 t3 t4
1) "a"
2) "b"
3) "c"
4) "d"

1.2 操作string类型数据

PS:若对值为字符串的进行自增,则会报错(error) ERR value is not an integer or out of range。若键不存在,按0开始自增。

192.168.1.20:6379> set a 1
OK
192.168.1.20:6379> incr a
(integer) 2
192.168.1.20:6379> incr a
(integer) 3
192.168.1.20:6379> get a
"3"
  • incrby——自增指定数字
192.168.1.20:6379> incrby a 5
(integer) 8
192.168.1.20:6379> incrby a 5
(integer) 13
192.168.1.20:6379> get a
"13"
  • decr——自减
192.168.1.20:6379> decr a
(integer) 12
192.168.1.20:6379> decr a
(integer) 11
192.168.1.20:6379> decr a
(integer) 10
192.168.1.20:6379> get a
"10"
  • decrby——自减指定数值
192.168.1.20:6379> decrby a 2
(integer) 8
192.168.1.20:6379> decrby a 2
(integer) 6
192.168.1.20:6379> get a
"6"
  • incrbyfloat——自增浮点数
192.168.1.20:6379> incrbyfloat a 1.1
"7.1"
192.168.1.20:6379> incrbyfloat a 1.1
"8.2"
192.168.1.20:6379> get a
"8.2"
  • append——追加值

PS:相当于把追加的值合并在原有值后面。若键不存在或没有值,则会生成新的值。

192.168.1.20:6379> set a redis
OK
192.168.1.20:6379> get a
"redis"
192.168.1.20:6379> append a world
(integer) 10
192.168.1.20:6379> get a
"redisworld"
  • strlen——统计值的长度
192.168.1.20:6379> get a
"redisworld"
192.168.1.20:6379> strlen a
(integer) 10
  • 每个中文占3个字节
192.168.1.20:6379> set ss '中国'
OK
192.168.1.20:6379> strlen ss
(integer) 6
  • getset—设置返回原值
192.168.1.20:6379> exists hello
(integer) 0
192.168.1.20:6379> getset hello world
(nil)
192.168.1.20:6379> getset hello redis
"world"
192.168.1.20:6379> get hello
"redis"
  • setrange——设置指定位置的字符

PS:pest第一个字母是0,把位置0的p改成b,结果就是best

192.168.1.20:6379> set redis pest
OK
192.168.1.20:6379> setrange redis 0 b
(integer) 4
192.168.1.20:6379> get redis
"best"
  • getrange——获取部分字符串
192.168.1.20:6379> get redis
"best"
192.168.1.20:6379> getrange redis 0 1
"be"

1.3 使用场景

  • 缓存功能
  • 计数
  • 共享session
  • 限速

2.哈希(hash)

2.1 hash类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息;
  • 需要的存储结构:一个存储空间保存多个键值对数据;
  • hash类型:底层使用哈希表结构实现数据存储;
  • 哈希类型中的映射关系叫做:field-value,这里的value是指field对应的值,不是键对应的值

2.2 操作hash类型数据

192.168.1.20:6379> hset user name tom 			#创建hash类型的数据
(integer) 1  		 #返回1表示成功
192.168.1.20:6379> hget user name 				#获取hash类型的数据
"tom"
192.168.1.20:6379> hdel user name 				#删除hash类型的数据
(integer) 1
192.168.1.20:6379> hget user name
(nil)
192.168.1.20:6379> hmset user name zhangsan age 19 hobby play city beijing 		#添加多个数据
OK
192.168.1.20:6379> hmget user name age hobby age city   		#获取多个数据
1) "zhangsan"
2) "19"
3) "play"
4) "19"
5) "beijing"
192.168.1.20:6379> hexists user name  			#判断是否存在
(integer) 1  #存在为1,不存在为0
192.168.1.20:6379> hkeys user    				#获取所有的字段名
1) "name"
2) "age"
3) "hobby"
4) "city"
192.168.1.20:6379> hvals user   				#获取所有字段对应的值
1) "zhangsan"
2) "19"
3) "play"
4) "beijing"
192.168.1.20:6379> hgetall user  				 #获取所有的字段及字段对应的值
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "hobby"
6) "play"
7) "city"
8) "beijing"
192.168.1.20:6379> hincrby user age 2  			#指定字段对应的值增加的数字
(integer) 21
192.168.1.20:6379> hget user age
"21"
192.168.1.20:6379> hget user name
"zhangsan"
192.168.1.20:6379> hstrlen user name  			#计算字段对应值的长度
(integer) 8 

2.3 注意事项

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil);
  • 每个 hash 可以存储 2的32次方 - 1 个键值对;
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用;
  • hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈;

哈希的内部变量

Ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有的值都小于hash-max-ziplist-value配置(默认64字节),Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

192.168.1.20:6379> hmset hashkey f1 v1 f2 v2
OK
192.168.1.20:6379> object encoding hashkey
"ziplist"

2.4 使用场景

  • 哈希表可以记录数据

3.列表(list)

3.1 list类型

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分;
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序;
  • list类型:保存多个数据,底层使用双向链表存储结构实现;

3.2 操作list类型数据

192.168.1.20:6379> rpush   list  c b a  		 # rpush表示右(right),从右面开始插入
(integer) 3
192.168.1.20:6379> lpush list d e f   			 # lpush表示左(left),从左面开始插入
(integer) 6  
192.168.1.20:6379> lrange list  0 -1   			 # 从左到右查看第一个到最后一个所有的元素
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
192.168.1.20:6379> linsert list before b redis  	# 向b后面插入redis
(integer) 7
192.168.1.20:6379> linsert list after b python  	# 向b前面插入python
(integer) 8
192.168.1.20:6379> lrange list 0 -1   				# 查看确认
1) "f"
2) "e"
3) "d"
4) "c"
5) "redis"
6) "b"
7) "python"
8) "a"
192.168.1.20:6379> lrange list 0 -3					  #查看指定范围的值
1) "f"
2) "e"
3) "d"
4) "c"
5) "redis"
6) "b"

192.168.1.20:6379> lindex list 0   					#获取列表指定索引下标的数据
"f"
192.168.1.20:6379> lindex list -3
"b"
192.168.1.20:6379> lindex list -2
"python"

#0表示第一个下标,-1表示最后一个下标
192.168.1.20:6379> llen list  			#获取列表的长度
(integer) 8
192.168.1.20:6379> lpop list  			# 从左起,删除一个
"f"
192.168.1.20:6379> rpop list  			 # 从右起,删除一个
"a"
192.168.1.20:6379> lrange list 0 -1 		 # 最后查看数据
1) "e"
2) "d"
3) "c"
4) "redis"
5) "b"
6) "python"
192.168.1.20:6379> lrem list 4 a 			 # 从左往右删4个元素,如果这4个元素中没有a,则不删
(integer) 0  			 #0表示没有删除
192.168.1.20:6379> lrange list 0 -1  			# 因为从左往右,4个元素内没有a,所以不执行删除
1) "e"
2) "d"
3) "c"
4) "redis"
5) "b"
6) "python"
192.168.1.20:6379> lrem list 4 d   		# 换个条件
(integer) 1  			 #1表示已经进行删除操作
192.168.1.20:6379> lrange list 0 -1  	# 因为从左往右,4个元素内有d,所以执行删除操作
1) "e"
2) "c"
3) "redis"
4) "b"
5) "python"

#count表示列表名称后的那个数据
#count > 0:从左往右删,删多少看count的值,如果指定的count范围内没有指定的值,则不删;
#count < 0:从右往左删,其余同上;

192.168.1.20:6379> ltrim list 1 3  			# 保留下标1到3的值
OK
192.168.1.20:6379> lrange list 0 -1 	    # 只剩下原来下标1到3的值了
1) "c"
2) "redis"
3) "b"
192.168.1.20:6379> lset list 2 python       # 修改下标为2的值为python
OK
192.168.1.20:6379> lrange list 0 -1
1) "c"
2) "redis"
3) "python"

#阻塞并发量,缓解压力
192.168.1.20:6379> brpop list:test  3	#从右开始
(nil)
(3.01s)
192.168.1.20:6379> blpop list:test 3    #从左开始
(nil)
(3.07s)

3.3 注意事项

  • list中保存的数据都是string类型的,数据总容量是有限的,最多2的32次方- 1 个元素 (4294967295);
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作;
  • 获取全部数据操作结束索引设置为-1;
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载;

内部编码:

列表类型的内部编码有两种:

  • Ziplist(压缩列表):当列表元素个数小于hash-max-ziplist-entries配置(默认512个)、同时列表中每个元素的值都小于hash-max-ziplist-value配置(默认64字节),Redis会使用ziplist作为表的内部实现来减少内存的使用。
  • Linkedist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

3.4 使用场景

  • 消息列队
  • 文章列表

4.集合(set)

4.1 set类型

set类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素,一个集合最多可以存储2的32次方-1个元素,Redis除了支持集合内的增删改查,同时还支持多个集合去交集、并集、差集。

4.2操作set类型数据

单集合内的操作

#添加数据元素

192.168.1.20:6379> sadd myset a b c d
(integer) 4

#删除数据元素

192.168.1.20:6379> srem myset d
(integer) 1
192.168.1.20:6379> srem myset test    #如果有数据删除发聩值为1,无删除的元素反馈值为0
(integer) 0

#计算元素个数

192.168.1.20:6379> scard myset
(integer) 3

#查看元素是否在这个表中

192.168.1.20:6379> sismember myset c
(integer) 1
192.168.1.20:6379> sismember myset a
(integer) 
192.168.1.20:6379> sismember myset b
(integer) 1

#随机从集合中返回或指定个数的元素

192.168.1.20:6379> srandmember myset   #随机返回
"b"
192.168.1.20:6379> srandmember myset
"c"
192.168.1.20:6379> srandmember myset
"a"
192.168.1.20:6379> srandmember myset 1   #指定值返回
1) "a"
192.168.1.20:6379> srandmember myset 2
1) "a"
2) "b"
192.168.1.20:6379> srandmember myset 3
1) "a"
2) "b"
3) "c"

#随机删除集合中的元素(默认为1)

192.168.1.20:6379> spop myset    #随机删除
"b"
192.168.1.20:6379> spop myset 1   #指定值删除
1) "a"

#查看集合内所有的元素

192.168.1.20:6379> smembers myset
1) "c"

多集合内的操作

#添加元素

192.168.1.20:6379> sadd test1 it music his sports
(integer) 4
192.168.1.20:6379> sadd test2 it news ent sports
(integer) 4

#求多个集合交集(求相同的数据)

192.168.1.20:6379> sinter test1 test2
1) "sports"
2) "it"

#求多个集合差集 (求不相同的数据)

192.168.1.20:6379> sdiff test1 test2
1) "his"
2) "music"
192.168.1.20:6379> sdiff test2 test1
1) "news"
2) "ent"

#求多个集合之间的并集 (两个表里边的东西都加起来,然后相同的就只记录一遍)

192.168.1.20:6379> sunion test1 test2 
1) "ent"
2) "sports"
3) "music"
4) "news"
5) "his"
6) "it"

#差集、并集、交集的结果保存

192.168.1.20:6379> sinterstore test1_2 test1 test2   #交集保存
(integer) 2
192.168.1.20:6379> type test1_2
set
192.168.1.20:6379> smembers test1_2
1) "sports"
2) "it"

192.168.1.20:6379> sunionstore test1:2 test1 test2   #并集保存
(integer) 6
192.168.1.20:6379> type test1:2
set
192.168.1.20:6379> smembers test1:2
1) "ent"
2) "sports"
3) "music"
4) "news"
5) "his"
6) "it"

#差集保存
#test1和test2的差集
192.168.1.20:6379> sdiffstore test1-2 test1 test2	
(integer) 2
192.168.1.20:6379> type test1-2
set
192.168.1.20:6379> smembers test1-2
1) "his"
2) "music"

#test2和test1的差集
192.168.1.20:6379> sdiffstore test1--2 test2 test1
(integer) 2
192.168.1.20:6379> smembers test1--2
1) "news"
2) "ent"

4.3 集合的内部编码

集合类型的内部编码分为两种:

  • intset(整数集合):当集合中的元素都是证书且元素个数小于set-max-intest-entries配置(默认512)时,Redis会选用inset来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。
192.168.1.20:6379> sadd name 1 2 3 4
(integer) 4
192.168.1.20:6379> object encoding name
"intset"
192.168.1.20:6379> sadd setkey a
(integer) 0
192.168.1.20:6379> object encoding setkey
"hashtable"

4.4 使用场景

集合类型比较典型的使用场景是标签(ag),比如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趨,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。例如一个电子商务的网站会对不同标签的用户不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推存最新的数码产品,通常会为网站带来很多的利益。

5、有序集合(zset)

5.1 zset类型

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么他和集合必然有着联系,他保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。那么它和列表使用索引下标作为排序,依据不同的是,他给每个元素设置一个分数(score)作为排序的依据。

数据结构是否允许重复元素是否有序有序实现方式应用场景
列表索引下标时间轴、消息队列
集合标签、社交
有序集合分值排行榜系统、社交

5.2 操作zset类型数据

单集合内

#添加数据

192.168.1.20:6379> zadd user1 251 tom
(integer) 1
192.168.1.20:6379> zadd user1 1 kris 91 mike 200 frank 220 tim 250 martin
(integer) 5

#计算数据个数

192.168.1.20:6379> zcard user1
(integer) 6

#计算某个数据的数值

192.168.1.20:6379> zscore user1 tom
"251"
192.168.1.20:6379> zscore user1 mike
"91"

#排序
#1.由低到高

192.168.1.20:6379> zrank user1  tom   #以tom的数值开始由低到高排序
(integer) 5

#2.由高到低
192.168.1.20:6379> zrevrank user1 kris
(integer) 5

#删除数据
192.168.1.20:6379> zrem user1 mike
(integer) 1


#增加数据
192.168.1.20:6379> zincrby user1 9 tim
"229"
192.168.1.20:6379> zincrby user1 9 mike		#若没有数据,则会自动添加该数据
"9"


#指定数据范围的排序
#1.由低到高
192.168.1.20:6379> zrange user1 0 2 withscores
1) "kris"
2) "1"
3) "mike"
4) "9"
5) "frank"
6) "200"

#2.由高到低
192.168.1.20:6379> zrevrange user1 0 2 withscores
1) "tom"
2) "251"
3) "martin"
4) "250"
5) "tim"
6) "229"

#指定数据内数值的排序 
#1.由低到高
192.168.1.20:6379> zrangebyscore user1 200 260 withscores
1) "frank"
2) "200"
3) "tim"
4) "229"
5) "martin"
6) "250"
7) "tom"
8) "251"


#2.由高到低
192.168.1.20:6379> zrevrangebyscore user1  221 1 withscores
1) "frank"
2) "200"
3) "mike"
4) "9"
5) "kris"
6) "1"
#设置无限小和无限大
#小
192.168.1.20:6379> zrangebyscore user1   -inf (200 withscores  #数值200之前无限小
1) "kris"
2) "1"
3) "mike"
4) "9"

#大
192.168.1.20:6379> zrangebyscore user1 (200 +inf withscores   #数值200之后无限大
1) "tim"
2) "229"
3) "martin"
4) "250"
5) "tom"
6) "251"

#指定数值中的数据的个数
192.168.1.20:6379> zcount user1 200 211
(integer) 1

#删除指定排序中的升序元素
192.168.1.20:6379> zremrangebyrank user1 0 2
(integer) 3

#删除指定数值范围的数据
192.168.1.20:6379> zremrangebyscore user1 (250 +inf
(integer) 1

多集合总

#创建数据
192.168.1.20:6379> zadd user2 1 wkis 91 mike 200 frank 220 tim 250 marrin
(integer) 5
192.168.1.20:6379> zadd user3 8 james 77 mike 625 marrin 88 tom
(integer) 4

#交集
#1和2做交集(默认为1.默认分数乘以权重得到的数)
192.168.1.20:6379> zinterstore user2-3 2 user2 user3
(integer) 2
192.168.1.20:6379> zrange user2-3 0 -1 withscores
1) "mike"
2) "168"
3) "marrin"
4) "875"

#1和2交集,2个权重边0.5(分数乘以权重得到的数)求max
192.168.1.20:6379> zinterstore user2:3 2 user2 user3 weights 1 0.5 aggregate max
(integer) 2
192.168.1.20:6379> zrange user2:3 0 -1 withscores
1) "mike"
2) "91"
3) "marrin"
4) "312.5"

#并集
192.168.1.20:6379> zunionstore user2--3 2 user2 user3
(integer) 7
192.168.1.20:6379> zrange user2--3 0 -1 withscores
 1) "wkis"
 2) "1"
 3) "james"
 4) "8"
 5) "tom"
 6) "88"
 7) "mike"
 8) "168"
 9) "frank"
10) "200"
11) "tim"
12) "220"
13) "marrin"
14) "875"

5.3 有序集合的内部编码

有序集合类型的内部编码有两种

  • Ziplist(压缩列表):当有序集合的元素个数个数小于 zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于 zset-max-ziplist-value配置(默认64字节)时,Reds会用 ziplist来作为有序集合的内部实现ziplist可以有效减少内存的使用。
  • Skiplist(跳跃表):当 zionists条件不满足时,有序集合会使用 skiplist作为内部实现,因此此时 ziplist的读写效率会降低。
192.168.1.20:6379> zadd zsetkey 50 e1 60 e2 70 e3
(integer) 3
192.168.1.20:6379> object encoding zsetkey
"ziplist"

5.4 使用场景

有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。可以使用赞数这个维度,记录每天用户上传视频的排行榜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值