redis知识整理-进阶部分
mhr18 2024-11-30 12:27 13 浏览 0 评论
发布订阅
发布消息
PUBLISH channel message
向c1的channel发布消息hello
PUBLISH c1 hello
订阅消息
SUBSCRIBE channel [channel ...]
订阅c1的channel的消息
SUBSCRIBE c1
订阅一个channel的消息时只会接收订阅之后发送到channel的消息,订阅之前的消息则不会接收,先向c1channel发送一条hello的消息,然后订阅c1channel,并没有接收到hello,然后再发送world消息,这是订阅端接收到world消息
适用场景:
1、聊天室群消息,订阅一个channel之后实时接收新发送的到这个channel的消息
2、当消息中间件使用等
pipeline
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复
使用 管道借助nc一次发送多个redis命令
(printf "set k1 qq\r\nget k1\r\n") | nc localhost 6379
Redis 事务
查看Redis相关命令:help @transactions
MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
EXEC 命令负责触发并执行事务中的所有命令:
- 如果客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。
- 另一方面,如果客户端成功在开启事务之后执行 EXEC ,那么事务中的所有命令都会被执行。
MULTI 命令用于开启一个事务,它总是返回 OK 。 MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当 EXEC命令被调用时, 所有队列中的命令才会被执行。
当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出:
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。
在一个客户端中set k1的值为1 ,并用WATCH监听k1然后执行MULTI命令进入Redis事务,在EXEC之前在另外一个客户端对k1的值进行修改,然后EXEC命令执行事务会发现返回nil,事务中的命令并未执行。
在事务exec之前另外一个客户端get 被监听的key的值不影响事务的正常执行
modules:Redis 布隆过滤器
Redis布隆过滤器的地址 https://github.com/RedisBloom/RedisBloom
安装及使用:
下载RedisBloom到Redis服务器上然后解压得到RedisBloom-master文件夹,进去RedisBloom-master文件夹
然后执行make命令得到redisbloom.so文件
重新启动Redis服务时添加 --loadmodule /path/to/redisbloom.so(redisbloom.so绝对路径) 参数或者在启动的配置文件中配置也可以
./redis-server --loadmodule /usr/local/redis5/RedisBloom-master/redisbloom.so
在redis客户端中输入BF.并按Tab键可循环查看布隆过滤器的相关命令
使用BF.ADD命令向key为bloomfilter的布隆过滤器中添加元素,并查看元素是否可能存在
BF.EXISTS返回0说明是一定不存在,返回1可能存在。用"可能存在"是由于布隆过滤器的概率问题而不是百分百的存在。
布隆过滤器原理简要介绍:
1、要将元素插入到布隆过滤器中首先使用不同的映射函数获取该元素在bitmap中的不同位置的下标,如元素"haha"调用三个不同的映射函数返回三个下标值1,3,5,将bitmap中下标位置为1,3,5的位置的值都设置为1,元素"hehe"调用三个不同的映射函数返回三个下标值3,6,7 将bitmap中下标位置为3,6,7的位置的值都设置为1
2、查询一个元素"hello"是不是布隆过滤器中存在,首先调用三个不同的映射函数获取三个在bitmap中的下标位置,如果返回的下标位置为1、6、7的话则会被布隆过滤器认为是存在的,因为1、6、7位置的值都是1 ,这就是上面所说的可能存在的问题根源,这是概率问题因为都命中了其他元素返回的下标位置。如果返回的下标位置为1、6、8的话则会被布隆过滤器认为是不存在的,因为8位置的值是0。
提高布隆过滤器的准确率可从两个维度入手,1是映射函数的个数,2、是bitmap的长度。映射函数的个数越多、bitmap的长度越长发生碰撞的概率就会越低,误判的概率就会降低。凡事都用两面性具体的可查看布隆过滤器的详细介绍。
Redis缓存/数据库
redis作为缓存和作为数据库的区别:
作为数据库:数据是全量的且持久化不能丢的
作为缓存:数据是可以丢的、不是全量数据,且随着业务访问变化的热数据
Redis里的数据怎么随业务变化只保留热数据?
1、设置有效期
1)使用 SET key value [expiration EX seconds|PX milliseconds] [NX|XX],在设置值的时候设置过期时间
2)使用 EXPIRE key seconds 给已有的键值设置过期时间,
3)使用 EXPIREAT key timestamp 给一个时间戳到达某个时间点后删除
设置的过期时间不会随访问而延长,发生写操作时会剔除这个key的过期时间,变成不会过期。
redis如何淘汰过期的key?
Redis keys过期有两种方式:被动和主动方式。
被动方式:当一些客户端尝试访问它时,访问这个key时发现已过期会被删除,加入过期的key一直不被访问则一直不被删除一直占用内存空间
主动方式:周期性轮询,定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。
具体就是Redis每秒10次做的事情:
1、测试随机的20个keys进行相关过期检测。
2、删除所有已经过期的keys。
3、如果有多于25%的keys过期,重复步奏1.
这是一个平凡的概率算法,基本上的假设是,我们的样本是这个密钥控件,并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。
2、淘汰掉冷数据
redis配置文件设置最大的内存大小和达到最大内存执行淘汰策略
设置内存最大值(单位是字节):maxmemory <bytes>
设置达到内存设置的最大值后的淘汰策略:maxmemory-policy noeviction
maxmemory-policy的取值:
allkeys-lru: 尝试回收最少使用的键(LRU),使用时间最老的
allkeys-lfu:尝试回收使用最少的键(LFU),使用次数最少
volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
allkeys-random:回收随机的键使得新添加的数据有空间存放
volatile-ttl:删除具有最近过期时间的key
noeviction :不删除任何内容只是在写操作时报错
- 上一篇:Redis 集群解决方案分析
- 下一篇:每个人都应该知道的关于redis学习的事
相关推荐
- 京东大佬问我,每天新增100w订单数据的分库分表方案
-
京东大佬问我,每天新增100w订单数据的分库分表方案嗯,用户问的是高并发订单系统的分库分表方案,每天新增100万订单。首先,我得理解需求。每天100万订单,那每秒大概是多少呢?算一下,100万除以86...
- MySQL 内存使用构成解析与优化实践
-
在为HULK平台的MySQL提供运维服务过程中,我们常常接到用户反馈:“MySQL内存使用率过高”。尤其在业务高峰期,监控中内存占用持续增长,即便数据库运行正常,仍让人怀疑是否存在异常,甚至...
- 阿里云国际站:怎样计算内存优化型需求?
-
本文由【云老大】TG@yunlaoda360撰写一、内存优化型实例的核心价值内存优化型ECS实例专为数据密集型场景设计,具有以下核心优势:高内存配比:内存与CPU比例可达1:8(如ecs.re6....
- MySQL大数据量处理常用解决方案
-
1、读写分离读写分离,将数据库的读写操作分开,比如让性能比较好的服务器去做写操作,性能一般的服务器做读操作。写入或更新操作频繁可以借助MQ,进行顺序写入或更新。2、分库分表分库分表是最常规有效的一种大...
- 1024程序员节 花了三个小时调试 集合近50种常用小工具 开源项目
-
开篇1024是程序员节了,本来我说看个开源项目花半个小时调试之前看的一个不错的开源项目,一个日常开发常常使用的工具集,结果花了我三个小时,开源作者的开源项目中缺少一些文件,我一个个在网上找的,好多坑...
- 免费全开源,功能强大的多连接数据库管理工具!-DbGate
-
DBGate是一个强大且易于使用的开源数据库管理工具,它提供了一个统一的Web界面,让你能够轻松地访问和管理多种类型的数据库。无论你是开发者、数据分析师还是DBA,DBGate都能帮助你提升工作效率...
- 使用operator部署Prometheus
-
一、介绍Operator是CoreOS公司开发,用于扩展kubernetesAPI或特定应用程序的控制器,它用来创建、配置、管理复杂的有状态应用,例如数据库,监控系统。其中Prometheus-Op...
- java学习总结
-
SpringBoot简介https://spring.io/guideshttp://www.spring4all.com/article/246http://www.spring4all.com/a...
- Swoole难上手?从EasySwoole开始
-
前言有些童鞋感觉对Swoole不从下手,也不知在什么业务上使用它,看它这么火却学不会也是挺让人捉急的一件事情。Swoole:面向生产环境的PHP异步网络通信引擎啥是异步网络通信?10年架构师领你架...
- 一款商用品质的开源商城系统(Yii2+Vue2.0+uniapp)
-
一、项目简介这是一套很成熟的开源商城系统【开店星】,之前推过一次,后台感兴趣的还不少,今天再来详细介绍一下:基于Yii2+Vue2.0+uniapp框架研发,代码质量堪称商用品质,下载安装无门槛,UI...
- Yii2中对Composer的使用
-
如何理解Composer?若使用Composer我们应该先知道这是一个什么东西,主要干什么用的,我们可以把Composer理解为PHP包的管理工具,管理我们用到的Yii2相关的插件。安装Compose...
- SpringBoot实现OA自动化办公管理系统源码+代码讲解+开发文档
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的自动化OA办公管理系统,主要实现了日常办公的考勤签到等一些办公基本操作流程的全部功能,系统分普通员工、部门经理、管理员等...
- 7层架构解密:从UI到基础设施,打造真正可扩展的系统
-
"我们系统用户量暴增后完全崩溃了!"这是多少工程师的噩梦?选择正确的数据库只是冰山一角,真正的系统扩展性是一场全栈战役。客户端层:用户体验的第一道防线当用户点击你的应用时,0.1秒...
- Win11系统下使用Django+Celery异步任务队列以及定时(周期)任务
-
首先明确一点,celery4.1+的官方文档已经详细说明,该版本之后不需要引入依赖django-celery这个库了,直接用celery本身就可以了,就在去年年初的一篇文章python3.7....
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)