首页 > 其他 > 详细

Redis4-消息订阅

时间:2021-08-22 09:21:45      阅读:10      评论:0      收藏:0      [点我收藏+]

redis进阶使用

管道(Pipelining)

http://redis.cn/topics/pipelining.html

技术分享图片

管道连接redis

一次发送多个命令,节省往返时间

  1. 安装nc yum install nc -y

  2. 通过nc连接redis nc localhost 6379 注意配置/etc/hosts

  3. 通过echo向nc发送指令 echo -e "set k2 99\nincr k2\n get k2" |nc localhost 6379

    技术分享图片

发布订阅(pub/Sub)

发送者

publish channel message

订阅者

subscribe channel

技术分享图片 技术分享图片
## 聊天室架构
  • 每个人能够收到实时消息 发布订阅

  • 上滑加载最近3天消息 sorted_set

  • 再上滑加载历史消息,所有消息都应该被存在数据库中

    单调发布,写入sorted_set和单调kafka入库构成事务

技术分享图片

启动不同的redis去接收订阅的消息,有的用来推送给用户,有的用来发给kafka,继而存储到数据库中

技术分享图片

事务

技术分享图片

假设是client1先开启的事务multi(绿色),client2后开启的事务multi(黄色),并且假设client2的exec先到达,client1的exec后到达:

客户端的exec先达到则先执行事务

技术分享图片

技术分享图片 技术分享图片

watch

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。

技术分享图片

WATCH 执行之后, EXEC 执行之前, 有其他客户端修改了 mykey 的值, 那么当前客户端的事务就会失败。 程序需要做的, 就是不断重试这个操作, 直到没有发生碰撞为止。

技术分享图片 技术分享图片
## RedisBloom布隆过滤器

技术分享图片

解决缓存穿透问题

缓存穿透,是指查询一个数据库中不一定存在的数据;

正常使用缓存查询数据的流程是,依据key去查询value,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

如果每次都查询一个不存在value的key,由于缓存中没有数据,所以每次都会去查询数据库;

当对key查询的并发请求量很大时,每次都访问DB,很可能对DB造成影响;并且由于缓存不命中,每次都查询持久层,那么也失去了缓存的意义。

布隆过滤器原理
原理就是一个对一个key进行k个hash算法获取k个值,在比特数组中将这k个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。

布隆过滤器可能会误判,如果它说不存在那肯定不存在,如果它说存在,那数据有可能实际不存在;Redis的bitmap只支持2^32大小,对应到内存也就是512MB,误判率万分之一,可以放下2亿左右的数据,性能高,空间占用率及小,省去了大量无效的数据库连接。

因此我们可以通过布隆过滤器,将Redis缓存穿透控制在一个可容范围内。

三种bloom实现方式

技术分享图片

技术分享图片

redis作为数据库/缓存区别

技术分享图片

key的有效期

技术分享图片

Redis4-消息订阅

原文:https://www.cnblogs.com/zhoum/p/15170813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!