昨日回顾

# 1 redis介绍
-特性
# 速度快:10w ops(每秒10w读写),数据存在内存中,c语言实现,单线程模型
# 持久化:rdb和aof
# 多种数据结构:
5大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合
# 支持多种编程语言:基于tcp通信协议,各大编程语言都支持
# 功能丰富:发布订阅(消息) Lua脚本,事务(pipeline)
# 简单:源代码几万行,不依赖外部库
# 主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
# 高可用和分布式:
2.8版本以后使用redis-sentinel支持高可用
3.0版本以后支持分布式 # 2 redis 在linux上安装
-wget 源代码下载
-make
-make install
-src:可执行文件 # 3 三种启动方式
-redis-server
-动态参数 --xx xx
-配置文件启动(常用) # 4 客户端连接,关闭服务端,查看配置项,查看redis进程
redis-cli -h 127.0.0.1 -p 6379
# 5 应用场景 # 6 通用命令
# 7 5大数据类型
-跳跃表是啥 # 8 字符串操作

今日内容

1 哈希类型


###1---hget,hset,hdel
hget key field #获取hash key对应的field的value 时间复杂度为 o(1)
hset key field value # 设置hash key对应的field的value值 时间复杂度为 o(1)
# field相同则修改(会返回0,但还是修改成功) 不相同则新增
hdel key field #删除hash key对应的field的值 时间复杂度为 o(1)
#测试
hset user:1:info age 23
hget user:1:info ag
hset user:1:info name lqz
hgetall user:1:info
hdel user:1:info age
###2---hexists,hlen
hexists key field #判断hash key 是否存在field 时间复杂度为 o(1)
hlen key #获取hash key field的数量 时间复杂度为 o(1)
hexists user:1:info name
hlen user:1:info #返回数量 ###3---hmget,hmset
hmget key field1 field2 ...fieldN #批量获取hash key 的一批field对应的值 时间复杂度是o(n)
hmset key field1 value1 field2 value2 #批量设置hash key的一批field value 时间复杂度是o(n) ###4--hgetall,hvals,hkeys
hgetall key #返回hash key 对应的所有field和value 时间复杂度是o(n)
hvals key #返回hash key 对应的所有field的value 时间复杂度是o(n)
hkeys key #返回hash key对应的所有field 时间复杂度是o(n)
###小心使用hgetall
##1 计算网站每个用户主页的访问量
hincrby user:1:info pageview count
##2 缓存mysql的信息,直接设置hash格式 ##其他操作 hsetnx,hincrby,hincrbyfloat
hsetnx key field value #设置hash key对应field的value(如果field已存在,则失败,返回了0),时间复杂度o(1)
hincrby key field intCounter #hash key 对应的field的value自增intCounter 时间复杂度o(1)
hincrbyfloat key field floatCounter #hincrby 浮点数 时间复杂度o(1)
# 浮点自增示例
hincrbyfloat numbers num1 3.5

使用hincrby做自增计数:

浮点数自增示例:

2 列表类型

# 插入操作

#rpush 从右侧插入
rpush key value1 value2 ...valueN #时间复杂度为o(1~n)
#lpush 从左侧插入 #linsert
linsert key before|after value newValue #从元素value的前或后插入newValue 时间复杂度o(n) ,需要遍历列表
linsert listkey before b java
linsert listkey after b php # 删除操作 lpop key #从列表左侧弹出一个item 时间复杂度o(1) rpop key #从列表右侧弹出一个item 时间复杂度o(1) lrem key count value
#根据count值,从列表中删除所有value相同的项 时间复杂度o(n)
1 count>0 从左到右,删除最多count个value相等的项
2 count<0 从右向左,删除最多 Math.abs(count)个value相等的项
3 count=0 删除所有value相等的项
lrem listkey 0 a #删除列表中所有值a
lrem listkey -1 c #从右侧删除1个c ltrim key start end #按照索引范围修剪列表 o(n)
ltrim listkey 1 4 #只保留下表1--4的元素 # 查询操作
lrange key start end #包含end获取列表指定索引范围所有item o(n)
lrange listkey 0 2
lrange listkey 1 -1 #获取第一个位置到倒数第一个位置的元素 lindex key index #获取列表指定索引的item o(n)
lindex listkey 0
lindex listkey -1 llen key #获取列表长度 # 修改操作
lset key index newValue #设置列表指定索引值为newValue o(n)
lset listkey 2 ppp #把第二个位置设为ppp # 实战
实现timeLine功能,时间轴,微博关注的人,按时间轴排列,在列表中放入关注人的微博的即可 # 其他操作
blpop key timeout #lpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1)
brpop key timeout #rpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1)
'''它可以从多个列表中移出并获取第一个元素,如果列表没有元素,它会阻塞列表直到等待超时或发现可弹出元素为止。''' #要实现栈的功能
lpush+lpop
#实现队列功能
lpush+rpop
#固定大小的列表
lpush+ltrim
#消息队列
lpush+brpop timeLine 先后顺序 10个人发送的状态,发送在我的列表内
公司内部项目 ---> 任务 ---> 我的任务列表
不需要去过滤任务查看哪些是我的,而是之间放入我的任务列表。
审核请假,只放入我的部门列表,列表里面存放的是id号,查询快。
关注的人:按照时间排列,将关注的明星放入列表。
redis做消息队列不够专业,没有确认机制
虽然并发量较高但是吞吐量较低。

blpop如果列表没有元素,会阻塞程序,并且等待timeout时间结束:

这里已经等待了20s。

如果在等待期间,有其他的客户端往这个列表放值,blpop会将其立即弹出,结束阻塞:

可见只阻塞了4s,而不是20s。

3 集合类型

sadd key element #向集合key添加element(如果element存在,添加失败) o(1)
srem key element #从集合中的element移除掉 o(1)
scard key #计算集合大小
sismember key element #判断element是否在集合中
srandmember key count #从集合中随机取出count个元素,不会破坏集合中的元素
spop key #从集合中随机弹出一个元素
smembers key #获取集合中所有元素 ,无序,小心使用,会阻塞住 sdiff user:1:follow user:2:follow #计算user:1:follow和user:2:follow的差集
sinter user:1:follow user:2:follow #计算user:1:follow和user:2:follow的交集
sunion user:1:follow user:2:follow #计算user:1:follow和user:2:follow的并集 sdiff|sinter|suion + store destkey... #将差集,交集,并集结果保存在destkey集合中
sinterstore destkey set1 set2
命令 新集合 集合1 集合2 # 将set1 set2取交集 存储到新集合destkey
# 更多示例:
sdiffstore destkey set1 set2 # 应用场景
去重场景
抽奖系统 :通过spop来弹出用户的id,活动取消,直接删除
点赞,点踩,喜欢等,用户如果点了赞,就把用户id放到该条记录的集合中
标签:给用户/文章等添加标签,sadd user:1:tags 标签1 标签2 标签3
给标签添加用户,关注该标签的人有哪些
共同好友:集合间的操作

集合放值:

判断集合里是否存在某值:

随机取出O(n)(抽奖功能):

随机弹出:

两个集合:

求差集(去掉交集的部分):

求交集、并集:

卖课网站:实现推荐的功能、去重

4 有序集合(zset)

# 特点:不能重复 有一个分值字段,来保证顺序
key score value
user:ranking 1 lqz
user:ranking 99 lqz2
user:ranking 88 lqz3
#集合有序集合
集合:无重复元素,无序,element
有序集合:无重复元素,有序,element+score
#列表和有序集合
列表:可以重复,有序,element
有序集合:无重复元素,有序,element+score # API使用
zadd key score element #score可以重复,可以多个同时添加,element不能重复 o(logN)
zrem key element #删除元素,可以多个同时删除 o(1)
zscore key element #获取元素的分数 o(1)
zincrby key increScore element #增加或减少元素的分数 o(1)
zcard key #返回元素总个数 o(1)
zrank key element #返回element元素的排名(从小到大排) zrange key 0 -1 #返回排名,不带分数 o(log(n)+m) n是元素个数,m是要获取的值
zrange player:rank 0 -1 withscores #返回排名,带分数 zrangebyscore key minScore maxScore #返回指定分数范围内的升序元素 o(log(n)+m) n是元素个数,m是要获取的值
zrangebyscore user:1:ranking 90 210 withscores #获取90分到210分的元素 zcount key minScore maxScore #返回有序集合内在指定分数范围内的个数 o(log(n)+m) zremrangebyrank key start end #删除指定排名内的升序元素 o(log(n)+m)
zremrangebyrank user:1:rangking 1 2 #删除升序排名中1到2的元素 zremrangebyscore key minScore maxScore #删除指定分数内的升序元素 o(log(n)+m)
zremrangebyscore user:1:ranking 90 210 #删除分数90到210之间的元素 # 实战
排行榜:音乐排行榜,销售榜,关注榜,游戏排行榜 #其他操作
zrevrank #返回某个元素从高到低排序的顺序
#zrevrank girls dlrb 返回迪丽热巴 按分数降序排的排名
zrevrange #从高到低排序取一定范围
zrevrangebyscore #返回指定分数范围内的降序元素 zinterstore #对两个有序集合交集
zunionstore #对两个有序集合求并集

重复的值放不进去,但是这个分数会放进去,会覆盖原来的分数:

5 慢查询

# 单线程架构,命令一个个执行,会有长慢命令,造成整个redis的阻塞

# redis提供一种方式,可以记录长慢命令【放到慢查询队列中】,用于后续的排查修改工作

# 配置慢查询
-slowlog-max-len :慢查询队列的长度
-slowly-log-slower-than :超过多少微妙,就算慢命令,就会记录到慢查询队列中 # 实战
config set slowlog-log-slower-than 0
config set slowlog-max-len 100
config rewrite # 写了永久生效,如果不写,只是暂时生效 # 查看慢查询队列
slowlog len #获取慢查询队列长度
slowlog reset #清空慢查询队列
slowlog get # 获取慢查询队列的所有命令

所以命令都会进行记录包括slowlog len

6 pipeline与事务

Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现(Redis模块)

将一批命令,批量打包,在redis服务端批量计算(执行),然后把结果批量返回

1次pipeline(n条命令)=1次网络时间+n次命令时间

# python实现pipline
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
#创建pipeline
pipe = r.pipeline(transaction=True)
#开启事务
pipe.multi()
pipe.set('name', 'lqz')
#其他代码,可能出异常
pipe.set('role', 'nb') pipe.execute() # redis原生实现事务 实现事务mutil
# 1 mutil 开启事务,放到管道中一次性执行
multi # 开启事务
set name lqz
set age 18
exec # 2 模拟实现乐观锁 watch+multi实现乐观锁
# 在开启事务之前,先watch
watch age
multi
decr age
exec # 另一台机器
multi
decr age
exec # 先执行,上面的执行就会失败(乐观锁,被wathc的事务不会执行成功)

通过pineple可以实现事务,但是redis没有隔离级别。
关系型数据库才有隔离级别,redis相当于可重复读。
watch+multi实现乐观锁。
multi模仿事务实际上就是Pipeline。 mysql实现乐观锁:
查数字 减数字 修改数字的时候,jinzhi mysql实现悲观锁:
就是for updata ---》 锁住这一行

7 发布订阅

# 发布订阅是 观察者模式 :只要订阅了某个东西,这个东西发送变化,我们就能收到
发布者发布了消息,所有的订阅者都可以收到,就是生产者消费者模型(后订阅了,无法获取历史消息) # 一个客户端发送消息
publish lqz hello # 只要有订阅者,客户端发送消息,所有订阅者都能收到 # 另外两个客户端,订阅频道,等待接收消息
subscribe lqz # 查看某个频道有几个订阅者
pubsub numsub lqz # 列出活跃的频道
pubsub channels # 发布订阅和消息队列
发布订阅数全收到,消息队列有个抢的过程,只有一个抢到
而发布-订阅模式是发布一个消息,所有的订阅者都受到这个消息。
django信号是发布-订阅模式

8 Bitmap位图

Bitmap位图:是字符串类型,但是以二进制形式存储的,获取,设置某个二进制位的

# set hello big
# getbit hello 0/1/2 返回比特位是0或1 # setbit hello 7 1 把第7,也就是8个比特位设置为1
# big就变成了cit
# bitcount hello 0 1 字节数 返回8 # 独立用户统计
-假设:1亿用户,5千万活跃用户 统计今天活跃用户是多选 用户iduserid是整形,32位整型
-int32 类型 4个字节表示一个数字---》 正负 2的31次方-1 的范围
1 4个字节
1001 4个字节
-方式一:登录,把id放到集合中---》统计集合大小
-方式二:登录,操作位图,把id对应的数字设为1 ,以后统计1的个数 数据量小的时候,使用Bitmap反而占用更多空间。 '''使用bitmap统计日活'''

9 HyperLogLog

redis中支持这种算法,基于HyperLogLog算法:极小的空间完成独立数量统计
很类似于布隆过滤器 pfadd key element # 向hyperloglog添加元素,可以同时添加多个
pfcount key #计算hyperloglog的独立总数 pfadd uuids "uuid1" "uuid2" "uuid3" "uuid4" #向uuids中添加4个uuid
pfcount uuids #返回4 #也可以做独立用户统计 '''用于统计日订单量 可以存入uuid 而位图只能存数字'''

作业

1 http协议详情,http协议版本,http一些请求头
2 如何实现服务器给客户端发送消息,websocket是什么?用过吗
3 悲观锁和乐观锁,如何实现 # 整理一下讲的内容 ,写简历

[]

【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 HyperLogLog的更多相关文章

  1. Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...

  2. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...

  3. 五大数据类型 - 字符串 - 列表 list - 集合set - 有序集合 - 哈希 hashMap

    基础知识 redis默认有16个数据库:默认使用的是第0个. 可以使用select num切换 查看DB大小 DBSIZE 查看所有的key **keys ** 清空当前数据库 flushdb 清空全 ...

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

    1.列表类型 1.1 列表数据结构 左边为key,是字符串类型 右边为value,是一个有序的队列,与python的列表结构相同 可以在Redis中对列表的value进行如下操作 从左边添加元素 从右 ...

  5. Redis 源码简洁剖析 04 - Sorted Set 有序集合

    Sorted Set 是什么 Sorted Set 命令及实现方法 Sorted Set 数据结构 跳表(skiplist) 跳表节点的结构定义 跳表的定义 跳表节点查询 层数设置 跳表插入节点 zs ...

  6. Redis入门到高可用(九)——有序集合zset

    一.数据结构 集合与有序集合,列表与有序集合的对比 二.主要API zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. zrem 移除有序集 key 中的一个或 ...

  7. redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系

    一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...

  8. redis有序集合性能 列表、集合、有序集合

    https://www.cnblogs.com/pirlo21/p/7120935.html 1.1 列表 列表(list)类型是用来存储多个字符串,元素从左到右组成一个有序的集合.列表中的每个字符串 ...

  9. redis学习(七)——五大数据类型总结:字符串、散列、列表、集合和有序集合

    目录 字符串类型(String) 散列类型(Hash) 列表类型(List) 集合类型(Set) 有序集合类型(SortedSet) 其它命令 一.字符串类型(String) 1.介绍: 字符串类型是 ...

  10. python对redis的常用操作 下 (无序集合,有序集合)

    无序集合: 首先介绍增加,删除和获得所有元素的方法.我将会用第二部分来讨论集合的特殊操作: In [136]: x.sadd("challenge", 1,2,3,4,5,6,7, ...

随机推荐

  1. FPGA常用IP核

    前言: 芯片行业中的IP,一般称为IP(Intellectual Property)核,是具有知识产权核的集成电路芯核的总称.说白了就是厂家实现的具有特定功能工具,然后我们可以直接调用,就相当于是函数 ...

  2. Codeforces Round #538 (Div. 2) F. Please, another Queries on Array?

    原题链接 F. Please, another Queries on Array? 这道题让求\(\phi(\prod\limits_{i = l}^r a_i)\),然后我们化简一下. 设\(P\) ...

  3. 配置postcss-pxtorem报:options has an unknown property 'plugins'

    闲聊: 小颖最近在坐大屏相关的项目,要写适配,之前用的:postcss-px2rem.px2rem-loader,和朋友闲聊呢他说他们也在写大屏,不过他们用的 postcss-pxtorem,在写另外 ...

  4. javaweb项目搭建|前端项目【包含增删改查,mysql】二

    首先,新建一个javaweb项目[前提已经下载tomcat,mysql,此实验idea版本为2022,其他版本可能位置不一样] File->New->Project 起一个项目名称(随便起 ...

  5. 一文带你掌握C语言的循环结构

    C语言循环结构详解 在C语言中,循环结构是一种重要的控制结构,它允许我们重复执行一段代码,以达到特定的目的.循环结构可以帮助我们简化重复性的任务,提高代码的效率.本篇文章将深入探讨C语言中的循环结构, ...

  6. Aiganize微信小程序开发手册二代

    根据此表格, 现有三个模块: 活动模块 聊天模块 影子模块 现活动模块交与:赵坤亮.郝文章做 现聊天模块与用户信息交与:葛方杰.陈金鹏做影子模块待定,现做完那两块,已经有不错的用户体验了.

  7. verdi的rc文件

    Verdi波形定位信号,将每次定位看的信号保存下来,存做rc文件,下次使用时直接打开就出来.不用再一个一个找信号. 原文 https://blog.csdn.net/sinat_43629962/ar ...

  8. 吉特日化MES配料工艺参数标准版-第二版

    作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园共有 ...

  9. 15、string

    1.string是什么? Go中的字符串是一个字节的切片,可以通过将其内容封装起在""中来创建字符串.Go中的的字符串是Unicode兼容的并且是UTF-8编码的. 2.strin ...

  10. 36. 干货系列从零用Rust编写负载均衡及代理,内网穿透中内网代理的实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...