一、piple 的使用
http://redis.cn/topics/pipelining.html
- 管道主要作用就是一次发送多个命令,减少了命令的通信成本
- redis 启动是冷启动的,有些场景需要,进行一些数据的初始化,这个时候,可以间接用到piple
参考 Redis从文件中批量插入数据 或 Redis 大量数据插入
二、发布和订阅
http://redis.cn/topics/pubsub.html
help @pubsub
PSUBSCRIBE pattern [pattern ...]
summary: Listen for messages published to channels matching the given patterns
since: 2.0.0
PUBLISH channel message
summary: Post a message to a channel
since: 2.0.0
6379 客户端发布渠道ooxx,信息hello ,后边新开对的客户端是不能收到的,只有订阅之后才能实时收到
PUBSUB subcommand [argument [argument ...]]
summary: Inspect the state of the Pub/Sub subsystem
since: 2.8.0
PUNSUBSCRIBE [pattern [pattern ...]]
summary: Stop listening for messages posted to channels matching the given patterns
since: 2.0.0
SUBSCRIBE channel [channel ...]
summary: Listen for messages published to the given channels
since: 2.0.0
UNSUBSCRIBE [channel [channel ...]]
summary: Stop listening for messages posted to the given channels
since: 2.0.0
使用场景:聊天记录,需要查看历史记录,包括3天之内,以及更远的记录;
实际应用中,更远的记录一般在数据库里进行全量持久化;redis 作为缓存,可以缓存一定期限内的,比如3天,则可以用sorted_set进行一定期限内消息的维护(一些只取部分满足需求的命令);
也可以像上图一样,进行职责的拆分,当多个客户端的时候,采用多个redis 服务,每个服务的职责不一样,持久化,以及缓存分开来做;
三、事务
http://redis.cn/topics/transactions.html
redis 不支持回滚;
上图表示: 由于redis 是单线程的,那么多个客户端同时间隔有多个命令的时候,对于最后先执行的,是触发事务执行的命令exec 先到的客户端,所以上图虽然1先发了其它的命令,但是晚于2发出执行命令exec ,那么,只能是2先执行,再执行客户端1中建立的事务;
添加watch 是为了监控某些条件,假如客户端1的事物是要在k1 = 3的时候执行,那么增加watch 之后,会进行比对,当需要执行时发现k1 有变动,那么client1 的事务就不会执行,就会根据这个做相应的反应,比如抛错等等;
help @transactions
DISCARD -
summary: Discard all commands issued after MULTI
since: 2.0.0
EXEC -
summary: Execute all commands issued after MULTI,执行MULTI之间的事务命令的标志
since: 1.2.0
MULTI -
summary: Mark the start of a transaction block,开启事务标志,后续就可以写多个要执行的命令,包括在这个事务中
since: 1.2.0
UNWATCH -
summary: Forget about all watched keys
since: 2.2.0
WATCH key [key ...]
summary: Watch the given keys to determine execution of the MULTI/EXEC block
since: 2.2.0
四、布隆过滤器(解决缓存穿透的问题)
https://github.com/RedisBloom/RedisBloom
右下角为安装过程,
如果缓存穿透了,但是数据库咩有值,则需要增加key 相对应的value防止报错;
五 、Redis当做使用LRU算法的缓存来使用
http://redis.cn/topics/lru-cache.html
- LRU是Redis唯一支持的回收方法。本页面包括一些常规话题,Redis的
maxmemory
指令用于将可用内存限制成一个固定大小,还包括了Redis使用的LRU算法,这个实际上只是近似的LRU。 maxmemory
配置指令用于配置Redis存储数据时指定限制的内存大小。通过redis.conf可以设置该指令,或者之后使用CONFIG SET命令来进行运行时配置;
过期相关 http://redis.cn/commands/expire.html
六、数据的持久化RDB
- LINUX 中的管道
- 父进程与子进程,进程间是数据隔离的;父进程可以让子进程看到自己的变量用export,但是不能被修改;
- 创建子进程,fork();linux 调用fork 进行 copy on write机制(写的时候进行一个新的地址进行修改,例如 下图其中一个redis 跟更改a3 时,会在9w 那里进行修改) ;
- 持久化RDB
http://redis.cn/topics/persistence.html
- 持久化AOF
记到文件中的是命令,*代表后边几个变量,$代表的是变量有几个字节,后边接变量,或者指令;
dump.rdb 文件 为二进制,几乎看不懂,但是命令 redis-check-rdb 可以帮助检查;
bgrewriteaof 指令,可以将无用的命令记录剔除掉,保留最新的状态;这是老版本4.0之前把融合关掉(在相应端口比如6379.conf 中配置aof-use-rdb-preamble no 来实现),没有开启混合RDB的情况;
开启了RDB混合之后(在相应端口比如6379.conf 中配置aof-use-rdb-preamble no 来实现),,红框圈的是bgrewriteaof 命令后得到的结果,当继续有新的命令,则会以命令的形式追加进去;