2. Redis进阶

本文深入探讨Redis的高级特性,包括管道技术提高通讯效率,从文件导入数据,发布订阅功能用于聊天系统的搭建,使用事务确保数据一致性,扩展模块如RedisBloom解决缓存穿透问题,以及RDB和AOF持久化策略的优缺点分析。
摘要由CSDN通过智能技术生成

1 管道

  1. 正常情况下,当客户端输入一个命令,需要等待服务器返回命令的结果才能继续输入下一个命令,即使redis自身处理非常快,但如果客户端和服务器之间网络很差,就会极大影响整个通讯的效率

  2. 使用管道可以一次性向服务器发送多个命令,中间不需要服务器将结果返回给客户端,从而可以减少系统调用与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
    
  3. 当需要通过文件向redis插入大量数据时,2.6版本以前可以使用如下命令

    (cat data.txt; sleep 10) | nc localhost 6379 > /dev/null
    
  4. 但用netcat大量插入时,无法检查错误,redis2.6开始,redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作,该模式可以将成功命令数和失败命令数等相关信息打印在控制台上

    cat data.txt | redis-cli --pipe
    

2 从文件导入

  1. 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 发布与订阅

  1. help @pubsub
  2. publish ooxx hello:向名为ooxx的频道中推入一条消息
  3. subscribe ooxx:订阅ooxx这个频道,订阅前推送到该频道中的内容无法被接收
3.1 使用redis与数据库搭建一套聊天系统
  1. 读数据
    1. 实时消息:发布订阅技术
    2. 3天内的聊天记录:使用sorted_set存放,使用日期作为score,消息内容作为value进行存放,然后定期按分值删除即可
    3. 更久之前的数据:使用数据库存放
  2. 写数据
    1. kafka为消息中间件,使用kafka写入mysql是因为写入mysql速度较慢,如果不使用消息中间件异步写入,会影响整个效率

在这里插入图片描述

  1. 此时存在一个问题,client在发布后,存入sorted_set前断开,会导致实时消息被接收,但聊天记录就无法被正确存入了,可以使用redis的事务解决这个问题

4 事务

  1. help @transactions
  2. redis事务不像mysql,支持要么全成功要么全失败,也就是拥有回滚功能,redis的事务表示事务内的命令要么全执行,要么全不执行,即原子性。redis没有回滚是为了保证其速度够快
  3. redis事务执行期间内,其他客户端的命令无法插入进来
  4. 相关命令
    1. multi:开启事务,事务开启后,可以将所有想发送的命令写进去,但不会真正执行,而是放入一个队列中
    2. exec:真正执行事务中所有命令,命令失败不会回滚也不会中断,会继续执行错误命令后的所有命令
    3. 当一个redis服务处理多个客户端请求的事务时,谁的exec先到,就会先执行谁的事务中的一组命令
    4. watch k1:为事务加上一个cas锁(乐观锁),执行watch k1–>multi–>get k1–>exec时,redis会判断exec之前,watch的k1的value是否被其他客户端更改过,如果被修改过,watch后整个事务都不会被执行,客户端可以监控事务是否被正常被执行,然后决定如何处理

5 为redis扩展模块

  1. redis支持加载模块来扩展功能,redis是c语言开发的,其模块也是c开发的,在英文官网https://redis.io/的中Modules目录中能看到redis的模块信息
  2. 使用RedisBloom模块
#1. 通过redis英文官网找
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值