高可用Redis(四):列表,集合与有序集合
1.列表类型
1.1 列表数据结构
左边为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 集合类型数据结构
左边为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 有序集合的数据结构
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 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...
- Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...
- redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...
- Redis数据类型使用场景及有序集合SortedSet底层实现详解
Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...
- Redis操作集合,有序集合
Set操作,Set集合就是不允许重复的列表 sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 sdiff(keys ...
- 如何搭建高可用redis架构?
如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...
- python对redis的常用操作 下 (无序集合,有序集合)
无序集合: 首先介绍增加,删除和获得所有元素的方法.我将会用第二部分来讨论集合的特殊操作: In [136]: x.sadd("challenge", 1,2,3,4,5,6,7, ...
- Redis从出门到高可用--Redis复制原理与优化
Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...
- 高可用Redis服务架构分析与搭建
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...
随机推荐
- Python——pyqt5——消息框(QMessageBox)
一.提供的类型 QMessageBox.information 信息框 QMessageBox.question 问答框 QMessageBox.warning 警告 QMessageBox.ctit ...
- SQL SERVER2000将多行查询结果拼接到一行数据及函数的创建
处理前的查询结果如上图: 通过借助SQL变量的定义 ) DECLARE @Num int SET @Scope='' ), ' ' GROUP BY ContractID 实现了一下效果: //创建拼 ...
- Java单例模式的实现
单例的实现 单例设计模式的问题 1. 线程安全问题用synchronized修饰实例化部分代码 2. 性能问题–采用懒汉式实例化 3. 指令重排序问题–用volatile ...
- 《玩转spring全家桶》学习笔记-------------丁雪丰
一.spring 课程介绍 1.初识spring 2.数据操作 3.web开发 4.spring boot 5.spring cloud 二.初识spring Spring Boot.Spring C ...
- Mac OSX下安装dlib (Python)
1.在安装Dlib库之前需要安装的库:opencv,numpy 2.安装Xquartz2.7.11 Xquartz是执行Unix程序的图形窗口环境,为了兼容Unix和Linux下移植过来的程序就需要安 ...
- eclipse 包 取消代码第一行package包名 自动补全时取消自动引入包名 修改名字 取消引用 自动导入publilc static void main(String[] args) {}
--项目 --包 包是为了管理类文件,同个包下不允许同名类文件,但不同包就可以,把类放在包里是规范 (https://zhidao.baidu.com/question/239471930532952 ...
- Zabbix 监控触发器设置
简述 在生产环境中,有一台mysql的备份服务器,上面运行着三个数据库实例的从库,也在做日志的同步工作,为了实现对该备份服务器的监控,当出现从库实例不为3或者日志同步进程不为3的时候,产生告警通知,生 ...
- SpringCloud笔记六:Hystrix
目录 Hystrix是什么? Hystrix服务熔断 新建Hystrix项目 修改yml Maven的pom.xml添加hystrix引用 修改Controller Hystrix服务降级 修改api ...
- chrome浏览器默认打开网址并全屏
1.创建chrome快捷方式. 2.右击快捷方式点击属性. 3.属性面板快捷方式下目标的默认内容后添加“ 页面地址 --kiosk”.[注意网页地址和--kiosk之前各有一个英文的空格] 4.点击确 ...
- js 时间格式化 兼容safari 苹果手机
export function formatTime (fmt, date) { date = new Date(date + '+08:00') // 兼容safari var o = { 'M+' ...