2. redis扩展知识
管道(pipeline)
比如说客户端连接到redis服务端以后,要进行很多命令的操作,每次执行命令都会经过网络io然后调用到redis服务端,管道的技术可以把多个命令进行压缩,这样一次调用就可以了。
使用nc 命令和redis建立连接,然后手动输入命令
新开窗口,获取k1 的值
上面方式理解后,可以说说管道的事,可以把多个命令通过管道给到与redis的连接
消息订阅
比如往ooxx 这个通道里推送了一条消息
新开窗口,订阅ooxx 通道
发现没有hello 这条消息,因为是先往ooxx 通道推送的消息,所以后来订阅的ooxx 通道,收不到hello
如果再往ooxx 通道推送消息
可以看到是可以监听到消息的
所以是监听了通道后,只能看到监听了通道以后的实时性消息
消息是分实时性的和历史性的,实时性的就比如上面的例子
比如微信或者QQ,如果用户去查找之前的历史消息,有可能查找3天内的,甚至更早的,如果是更早的数据,那肯定是查数据库的全量数据。所以redis主要是拿来做缓存用的,目的就是快。
如果是查找实时性的数据,通过发布订阅可以实现,如果是查找历史数据,根据历史时间的顺序,使用有序集合sorted_set来实现。
如果用户发送消息的时候,要分别把消息发送到消息订阅的窗口,和标识有序的历史消息,还要通过中间件比如kafka,最终把数据存到数据库。
事务
因为redis服务是单线程的,所以如果客户端是多线程情况下使用的时候,主要看哪个线程的exec命令先执行,谁就先提交事务。
watch
命令相当于cas操作,
测试一下:
使用watch
命令对k1 进行操作,然后开启事务,执行命令
新开启窗口,开启事务,修改k1 的值,然后提交事务,这是可以发现k1 的值确实已经发生更改
这时候,回到第一个窗口,提交事务,因为k1的值发生了更改,所以对k1的值进行操作不成功,因为k1执行事务时候,k1的值和开启事务时候的值不一样了,发生了变化
布隆过滤器
比如客户端拿着很多不存在的key去请求redis,发现redis没有对应的key,就要去数据库查找,如果是大批量的情况下,然后造成了缓存穿透,布隆过滤器就是解决这个问题的。
主要是通过小的空间来解决大的请求查找数据是否存在,通过使用bitmap来实现的,使用的是二进制位里的值来表示对应的数据是否存在。
比如元素1和元素2是已有的商品元素,存在数据库里的,这两个元素可能有重复的映射函数表示同样的意思,元素3是客户端要查询的商品元素,如果元素3能通过布隆过滤器映射到对应的bitmap二进制位,说明有对应商品,就允许后面的查询操作。
如果在允许后面的查询操作时候,没有对应的商品数据,数据库添加对应的元素,然后元素对布隆过滤器的添加标识。
缓存LRU
redis作为缓存存放的数据是部分数据,全量数据是存在数据库里的,redis里的数据随着业务的变化而变化,redis要清理掉不常用的访问的数据,中间会考虑一些算法。
在给redis存放数据时候,如果设置了时间,在有效时间内,如果对这个数据进行修改,有效时间就会作废,修改后的数据变成永久数据。所以在编写业务代码时候如果修改了这种数据,要再对这个数据加上有效时间。