文章目录

  • 前言
  • 一、消息订阅
  • 二、pipeline
  • 三、事务
  • 四、布隆过滤器



前言

通过redis中文文档 学习,主要记录下学习的过程。主要学习了redis的发布订阅,pipeline管道,事务,缓存lru,以及在https://redis.io/modules网站上的bloom布隆过滤器

一、消息订阅

Redis 消息订阅SqlServer redis订阅binlog_布隆过滤器


通过redis中文文档可以进行学习,具体里面Redis 发布/订阅(Pub/Sub)的详情,大家可以点击进去查询详情。对于我来说,我直接进行试验

看下redis关于发布订阅的指令

127.0.0.1:6379> help @pubsub

Redis 消息订阅SqlServer redis订阅binlog_布隆过滤器_02

开启三个redis客户端,然后一个客户端发布,另外两个接收
一个发送

127.0.0.1:6379> PUBLISH k0 aaa
(integer) 2

两个接收

127.0.0.1:6379> SUBSCRIBE k0
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "k0"
3) (integer) 1
1) "message"
2) "k0"
3) "aaa"

redis实现的发布订阅模式,前提是必须先订阅,后面当有人发布的时候才能接收到消息。

二、pipeline

管道(Pipelining):学习如何一次发送多个命令,节省往返时间。简单理解就是几个命令合成一个包异性通过客户端发到服务端执行,减少网络IO。
试验

#安装nc
 yum install nc -y
#一次性发送数据
[root@localhost ~]# (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG

# -e选项 表示会将后面字符串中的\n转成换行符
[root@localhost ~]# echo -e "set k0 aaa\n keys *\n get k0" | nc localhost 6379
+OK
*1
$2
k0
$3
aaa

三、事务

Redis 事务:将一组命令放在同一个事务中进行处理。redis中的事务不是真正意义上的事务,因为他不支持回滚,理由你可以看文档中的描述。但我总结的就是redis为了追求速度,不需要做回滚。如果redis需要做回滚,意味着redis需要浪费空间来存储数据,还需要一大堆逻辑来处理回滚的事情,并且我们使用redis的目的就是看中他的快,这样就舍本逐末了。
看下redis事务相关命令

127.0.0.1:6379> help @transactions

Redis 消息订阅SqlServer redis订阅binlog_布隆过滤器_03


下面做下试验

MULTI 开启事务

EXEC 执行事务

DISCARD 取消事务

WATCH 监控某个key是否发生改变,如果发生改变,那么事务就不执行

UNWATCH 取消监控key

举例1
clinet1监控k0 client不修改k0则事务正常进行
client2先执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 qq
QUEUED
127.0.0.1:6379> EXEC
1) OK

client1后执行

127.0.0.1:6379> WATCH k0
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> EXEC
1) 1) "k1"
   2) "k0"
2) "qq"

结论,开启事务的各个客户端,只有当执行exec的时候,命令才会执行,所以事务中的命令,如get,可能会读取到外面设置的值。

举例2
clinet1 监控k0 ,然后client2修改了k0的值,然后先执行client2再执行client1,结果是clinet1的事务命令都不执行
clinet2

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k0 qwe
QUEUED
127.0.0.1:6379> EXEC
1) OK

clinet1 将不执行

127.0.0.1:6379> WATCH k0
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> EXEC
(nil)

结论,开启watch的redis客户端会监控该key,如果该key发生变化,则该客户端的事务命令将都不执行。

四、布隆过滤器

布隆过滤器是为了解决,redis缓存击穿的问题。举个例子,当有大量请求发送到服务端,查redis发现没有,就会去Mysql数据库查询,但是如果这些数据在mysql中也是没有的,而白白消耗mysql的性能。为了减少这种情况,出现了布隆过滤器。
布隆过滤器的原理是把数据库中各个元素对应每个映射函数,到redis中的一个bitmap。
然后请求也会根据映射函数映射到bitmap,如果有请求映射的bitmap有个比特位为0,则表明数据库也没有,则立即返回。
当然也会存在小于1%的概念请求会击穿过去,这是因为数据库其他元素的通过映射函数也可能和请求元素的映射函数的比特位在bitmap上重叠。当击穿后,我们就需要在redis缓存中将该击穿的元素补充起来为空或者一个错误信息都行,具体根据业务而定。

通过redis.io网站的module模块

在ctr f 搜索RedisBloom

Redis 消息订阅SqlServer redis订阅binlog_客户端_04


点击下图红框,就可以进入布隆过滤器的github网站

Redis 消息订阅SqlServer redis订阅binlog_布隆过滤器_05

安装步骤参考对应github网站

Redis 消息订阅SqlServer redis订阅binlog_Redis 消息订阅SqlServer_06


Redis 消息订阅SqlServer redis订阅binlog_redis_07

#下载布隆过滤器的包,复制上图Download ZIP连接地址
wgt https://github.com/RedisBloom/RedisBloom/archive/master.zip
unzip master.zip
cd RedisBloom-master
# 执行make后。会在本目录下多了redisbloom.so 一个文件
make

有两种方式启动redis使用布隆过滤器。
第一种是github介绍的

#一定要是绝对路径,不然启动失败
redis-server --loadmodule /path/to/redisbloom.so

第二种,在redis.conf中配置(我使用这种方式)
在下面路径中替换成自己的实际路径即可

################################## MODULES #####################################

# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
loadmodule  /data/redis-5.0.5/redisbloom.so

启动

[root@localhost redis-5.0.5]# redis-server  /data/redis-5.0.5/redis.conf

客户端连接后,只要输入bf能有相关命令显示就表示布隆过滤器和redis整合成功

root@localhost redis-5.0.5]# redis-cli
127.0.0.1:6379> BF.EXISTS
(error) ERR wrong number of arguments for 'BF.EXISTS' command