一、管道
1.管道的意义?
啤酒瓶理论:
怎么喝啤酒最舒服?
是去超市买一瓶,喝一瓶,再去超市买一瓶。还是去超市买一箱回来慢慢喝?
答案一般是后者,这就是管道的意义:减少通信成本,只需要TCP握手一次,就能执行多条命令。
2.实际命令
(yum install nc) nc localhost 6379 //连接redis,建立socket连接 echo -e “set
k2 99\nincre k2\n get k2” | nc localhost 6379 // 连接6379,并发送3条命令,分别是
set k2 99
incre k2
get k2
3.管道的应用
可以对redis做冷启动,利用管道读取文件做初始数据
二、事务
redis的事务并不完整,没有回滚功能,原因是回滚会损耗redis性能,作者决定不做回滚。不需要回滚,那么redis内部可以保持简单且快速
基本命令:
help @transactions // 查看事务相关命令
mutli // 开启事务
exec // 关闭事务
discard // 取消事务
watch {keys }// 监视一个/多个key,如果事务执行前key被改动,则打断事务
注:redis事务只会因为语法而失败
三、发布订阅
基本命令:
help @pubsub // 查看发布订阅命令
publish ooxx hello // 向管道ooxx推送一个hello
subscribe ooxx // 订阅ooxx
面试题:
微信,qq等,历史性数据是存在redis里还是关系型数据库里?设计一个解决方案。
思考:
微信如果半年不上线,上线后一样可以收到这半年以来的所有消息,所以大概率是持久化进数据库里的。但数据库不可能接收微信这样的高并发场景,因此可能会用到redis的缓存机制(最近几天)和实时机制(发布订阅)
所以设计方案如下:
如图所示,实时性的数据利用redis发布订阅实现(微信在线的情况)。最近3天的数据使用sortSet实现(score为时间戳),更久远的数据用kafka持久到数据库里。
上图实现有一个问题,就是读写都在同一个redis中。如果能实现读写分离就更好了,因此写有优化方案,如下:
用另一个redis订阅写的redis,那就从业务角度实现了读写分离
如果有写错的地方,欢迎大家指正,感谢!