百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

redis知识整理-进阶部分

mhr18 2024-11-30 12:27 21 浏览 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 :不删除任何内容只是在写操作时报错

相关推荐

Spring Boot 分布式事务实现简单得超乎想象

环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

Qt编写可视化大屏电子看板系统15-曲线面积图

##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

「数据库」Sysbench 数据库压力测试工具

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

如何选择适合公司的ERP(选erp系统的经验之谈)

很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

Manus放开注册,但Flowith才是Agent领域真正的yyds

大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

为什么说Python是最伟大的语言?看图就知道了

来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

联合国岗位上新啦(联合国的岗位)

联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

oracle列转行以及C#执行语句时报错问题

oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

取消回复欢迎 发表评论: