高可用Redis(四):列表,集合与有序集合

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 1.列表类型1.1 列表数据结构左边为key,是字符串类型右边为value,是一个有序的队列,与python的列表结构相同可以在Redis中对列表的value进行如下操作 从左边添加元素 从右边添加元素 从左边删除元素 从右边删除元素 计算列表长度 删除列表中指定元素 从列表中获取子列表元素 可以按照索引来获取指定元素1.

1.列表类型

1.1 列表数据结构

img_dd96d872af6933a7ef375b8041cd1bb7.png

左边为key,是字符串类型
右边为value,是一个有序的队列,与python的列表结构相同
可以在Redis中对列表的value进行如下操作
    从左边添加元素
    从右边添加元素
    从左边删除元素
    从右边删除元素
    计算列表长度
    删除列表中指定元素
    从列表中获取子列表元素
    可以按照索引来获取指定元素

1.2 列表类型的特点

有序
可以重复
左右两边插入弹出

1.3 列表类型常用的方法

rpush key value1 value2 ... valueN          从列表右端插入值(1-N个)
lpush key value1 value2 ... valueN          从列表左端插入值(1-N个)
linsert key before value newValue           在list指定的值前插入newValue
linsert key after value newValue            在list指定的值后插入newValue
lpop key                                    从列表左侧弹出一个item
rpop key                                    从列表右侧弹出一个item
lrem key count value                        根据count值,从列表中删除所有value相等的项
    count > 0,从左到右,删除最多count个value相等的项
    count < 0,从右到左,删除最多Math.abs(count)个value相等的项
    count = 0,删除所有value相等的项
ltrim key start end                         按照索引范围修剪列表
lrange key start end(包含end)               获取列表指定索引范围所有item
lindex key index                            获取列表指定索引的item
llen key                                    获取列表长度
lset key index newValue                     设置列表指定索引值为newValue
blpop key timeout                           lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时
brpop key timeout                           rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时

例子:

127.0.0.1:6379> rpush mylist a b c d
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lpush mylist 0
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
5) "d"
127.0.0.1:6379> rpop mylist
"d"
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> 

说明:

lpush加lpop的操作相当于Stack
lpush加rpop的操作相当于Queue
lpush加ltrim的操作相当于Capped Collection
lpush加brpop的操作相当于Message Queue

列表类型API的时间复杂度说明

rpush,lpush命令的时间复杂度为O(1)到O(N),由从列表中获取元素的个数来决定
linsert after/before,lrem,ltrim,lrange,lindex,lset命令的时间复杂度为O(N)
lpop,rpop,llen,blpop,brpop命令的时间复杂度都是O(1)

2.集合类型

2.1 集合类型数据结构

img_08fbbf3edbcaea15360d99bfaf1cce88.png

左边为key,是字符串类型
右边为value,可以将一些字符串进行一些组合,是集合类型
可以向value中添加或者删除一个元素
Redis中的集合类型还支持集合之间的操作,这与Redis中的其他数据结构是不同的
Redis可以对两个集合进行操作,取两个集合的交集,并集,差集以及对称差集等等

2.2 集合类型的特点

无序
无重复
支持集合间操作
 

2.3 集合类型常用的方法

sadd key element                向集合key添加element(如果element已经存在,添加失败)
srem key element                将集合key中的element移除掉
scard user:1:follow             计算集合大小
sismember user:1:follow it      判断it是否在集合中
srandmember user:1:follow count 从集合中随机挑count个元素,不破坏集合的结构
spop user:1:follow              从集合中随机弹出一个元素,弹出后集合中没有这个元素了          
smembers user:1:follow          获取集合所有元素,无序,小心使用

时间复杂度说明:

sadd,srem,scard,sismember,srandmember,spop,smember命令的时间复杂度都是O(1)

例子:

127.0.0.1:6379> sadd user:1:follow it news his sports
(integer) 4
127.0.0.1:6379> smembers user:1:follow
1) "news"
2) "sports"
3) "his"
4) "it"
127.0.0.1:6379> spop user:1:follow
"sports"
127.0.0.1:6379> smembers user:1:follow
1) "news"
2) "his"
3) "it"
127.0.0.1:6379> scard user:1:follow
(integer) 3
127.0.0.1:6379> sismember user:1:follow entertainment
(integer) 0

2.4 集合间API

sdiff                                   差集
sinter                                  交集
sunion                                  并集
sdiff|sinter|sunion + store destkey     将差集,交集,并集结果保存在destkey中

2.5 实战

在一些抽奖活动中,就可以用Redis的集合来实现,使用spop把已经中奖的用户弹出
在社交网络中,常用的如点赞,踩等功能也可以用集合来实现
社交网络中,共同关注的好友可以用集合的交集实现

3.有序集合类型

3.1 有序集合的数据结构

img_408e12e5ae6babeb8c8e54eb7ef05069.png

key-value结构
左边为key,是字符串类型,右边为value,由两部分组成:score和value
score表示分值,表示value在有序集合中的位置

3.2 有序集合类型常用的方法

zadd key score element(可以是多对)           添加score和element
zrem key element(可以是多个)                 删除元素                        
zscore key element                          返回元素的分数         
zincrby key increScore element              增加或减少元素的分数       
zcard key                                   返回元素的总个数
zrange key start end [withscores]           返回指定索引范围内的升序元素[分值]
zrangebyscore key minScore maxScore         返回指定分数范围内的长序元素[分值]
zcount len minScore maxScore                返回有序集合内在指定分数范围内的个数
zremrangebyrank key start end               删除指定排名内的升序元素        
zremrangebyscore key minScore maxScore      删除指定分数内的升序元素
zrevrank                获取有序集合中从高到低的排名 
zrevrange               从高到低排名后获取一定范围的值
zrevrangebyscore        按score从高到低排名的结果
zinterstore             对两个有序集合的交集进行运算,并保存
zunionstore             对两个有序集合的并集进行运算,并保存

3.3 有序集合常用方法的时间复杂度

zadd命令的时间复杂度为log(N),n是有序集合中元素的个数
zrem,zscore,zincrby,zcard命令的时间复杂度为O(1)
zrange,zremrangebyrank,zrangebyscore,zcount,zremrangebyscore命令的时间复杂度为log(N) + m,n为有序集合元素的个数,m为有序集合中被操作元素的个数

例子:

127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql
(integer) 4
127.0.0.1:6379> zscore player:rank php
"800"
127.0.0.1:6379> zcard player:rank
(integer) 4
127.0.0.1:6379> zrank player:rank python
(integer) 3
127.0.0.1:6379> zrem player:rank java
(integer) 1
127.0.0.1:6379> zrange player:rank 0 -1 withscores
1) "sql"
2) "600"
3) "php"
4) "800"
5) "python"
6) "1000"

127.0.0.1:6379> zadd player:rank 1000 python 900 java 800 php 600 sql
(integer) 1
127.0.0.1:6379> zrange player:rank 0 -1
1) "sql"
2) "php"
3) "java"
4) "python"
127.0.0.1:6379> zcount player:rank 700 901
(integer) 2
127.0.0.1:6379> zrangebyscore player:rank 700 901
1) "php"
2) "java"
127.0.0.1:6379> zremrangebyrank player:rank 0 1
(integer) 2
127.0.0.1:6379> zrange player:rank 0 -1
1) "java"
2) "python"
127.0.0.1:6379> zrange player:rank 0 -1 withscores
1) "java"
2) "900"
3) "python"
4) "1000"

3.4 有序集合实战

排行榜

4. 集合与有序集合的区别

都没有重复元素
集合无序,有序集合是有序的
集合中只有element,有序集合中有element+score

5. 列表与有序集合的区别

列表可以有重复元素,有序集合没有重复元素
列表有序,有序集合有序
列表中只有element,有序集合中有element+score
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
29天前
|
存储 NoSQL Java
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
面试官问:那有序集合为什么要同时使用字典和跳跃表来实现?我:这个设计主要是考虑了性能因素。1. 如果单纯使用字典,查询的效率很高是O(1),但执行类似ZRANGE、ZRNK时,排序性能低。每次排序需要在内存上对字典进行排序一次,同时消耗了额外的O(n)内存空间
28 1
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis高可用之主从复制架构(第一部分)
Redis高可用之主从复制架构(第一部分)
|
3月前
|
存储 监控 NoSQL
Redis 高可用之主从模式
上一节RDB和AOF持久化机制提到了 Redis 的持久性,也就是在服务器实例宕机或故障时,拥有再恢复的能力。但是在这个服务器实例宕机恢复期间,是无法接受新的数据请求。对于整体服务而言这是无法容忍的,因此我们可以使用多个服务器实例,在一个实例宕机中断时,另外的服务器实例可以继续对外提供服务,从而不中断业务。Redis 是如何做的呢?Redis 做法是**增加冗余副本**,**将一份数据同时保存在多个实例**上。那么如何保存各个实例之间的数据一致性呢?
45 0
Redis 高可用之主从模式
|
3月前
|
机器学习/深度学习 NoSQL Redis
Redis高可用之集群架构(第三部分)
Redis高可用之集群架构(第三部分)
|
3月前
|
消息中间件 NoSQL Redis
Redis高可用之哨兵模式(第二部分)
Redis高可用之哨兵模式(第二部分)
|
3月前
|
存储 监控 NoSQL
|
4月前
|
NoSQL Java Redis
SpringBoot2.0整合Redis高可用之Sentinel哨兵
本篇博文分享的是一主二从三哨兵模式。至于为什么用三个哨兵,同第一段。本文是模拟环境,都是一个服务器上面。
68 0
|
4月前
|
监控 NoSQL Redis
Redis - 主从复制那些事与高可用sentinel
Redis - 主从复制那些事与高可用sentinel
37 0
|
2月前
|
存储 NoSQL Java
面试官:Redis如何保证高可用?
面试官:Redis如何保证高可用?
76 2
面试官:Redis如何保证高可用?
|
3月前
|
监控 NoSQL 程序员
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
77 5