1 管道
-
正常情况下,当客户端输入一个命令,需要等待服务器返回命令的结果才能继续输入下一个命令,即使redis自身处理非常快,但如果客户端和服务器之间网络很差,就会极大影响整个通讯的效率
-
使用管道可以一次性向服务器发送多个命令,中间不需要服务器将结果返回给客户端,从而可以减少系统调用与IO
#1. 安装netcat,该工具可以方便的与某个地址下的某个端口建立socket链接 yum install nc #2. 使用管道|,将echo命令的输出,作为nc到本机6379建立的socket连接的输入 echo -e "set k2 99\nincr k2\n get k2" | nc localhost 6379
-
当需要通过文件向redis插入大量数据时,2.6版本以前可以使用如下命令
(cat data.txt; sleep 10) | nc localhost 6379 > /dev/null
-
但用netcat大量插入时,无法检查错误,redis2.6开始,redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作,该模式可以将成功命令数和失败命令数等相关信息打印在控制台上
cat data.txt | redis-cli --pipe
2 从文件导入
-
redis-cli中只支持dos格式的换行符
\r\n
,linux下创建的文件默认换行符是\n,因此应该先将文件进行转码,再执行导入#1. 插入文件 vim d1.txt set myk12 v1 zadd zset12 0 a 1 b 3 c sadd sset12 e f g hh set myk22 v2 hset myset12 k1 v1 hmset myset22 k2 v2 k3 v3 k4 v4 set myk32 v3 #2. 下载用于转码的unix2dos指令 yum install unix2dos #3. 对文件进行转码 unix2dos d1.txt #4. 导入文件,此处不使用pipe模式 unix2dos d1.txt
3 发布与订阅
- help @pubsub
- publish ooxx hello:向名为ooxx的频道中推入一条消息
- subscribe ooxx:订阅ooxx这个频道,订阅前推送到该频道中的内容无法被接收
3.1 使用redis与数据库搭建一套聊天系统
- 读数据
- 实时消息:发布订阅技术
- 3天内的聊天记录:使用sorted_set存放,使用日期作为score,消息内容作为value进行存放,然后定期按分值删除即可
- 更久之前的数据:使用数据库存放
- 写数据
- kafka为消息中间件,使用kafka写入mysql是因为写入mysql速度较慢,如果不使用消息中间件异步写入,会影响整个效率
- 此时存在一个问题,client在发布后,存入sorted_set前断开,会导致实时消息被接收,但聊天记录就无法被正确存入了,可以使用redis的事务解决这个问题
4 事务
- help @transactions
- redis事务不像mysql,支持要么全成功要么全失败,也就是拥有回滚功能,redis的事务表示事务内的命令要么全执行,要么全不执行,即原子性。redis没有回滚是为了保证其速度够快
- redis事务执行期间内,其他客户端的命令无法插入进来
- 相关命令
- multi:开启事务,事务开启后,可以将所有想发送的命令写进去,但不会真正执行,而是放入一个队列中
- exec:真正执行事务中所有命令,命令失败不会回滚也不会中断,会继续执行错误命令后的所有命令
- 当一个redis服务处理多个客户端请求的事务时,谁的exec先到,就会先执行谁的事务中的一组命令
- watch k1:为事务加上一个cas锁(乐观锁),执行watch k1–>multi–>get k1–>exec时,redis会判断exec之前,watch的k1的value是否被其他客户端更改过,如果被修改过,watch后整个事务都不会被执行,客户端可以监控事务是否被正常被执行,然后决定如何处理
5 为redis扩展模块
- redis支持加载模块来扩展功能,redis是c语言开发的,其模块也是c开发的,在英文官网https://redis.io/的中Modules目录中能看到redis的模块信息
- 使用RedisBloom模块
#1. 通过redis英文官网找