发布订阅模式

订阅者订阅频道:可以一次订阅多个,比如这个客户端订阅了 3 个频道。
subscribe channel-1 channel-2 channel-3
发布者可以向指定频道发布消息(并不支持一次向多个频道发送消息):
publish channel-1 2673
取消订阅(不能在订阅状态下使用):
unsubscribe channel-1
按规则(Pattern)订阅频道
支持?和占位符。?代表一个字符,代表 0 个或者多个字符。
2
消费端 1,关注运动信息:
psubscribe sport
消费端 2,关注所有新闻:
psubscribe news
消费端 3,关注天气新闻:
psubscribe news-weather
生产者,发布 3 条信息
publish news-sport yaoming
publish news-music jaychou
publish news-weather rain
事务
多个命令作为一个不可分割的处理序列,就需要用到事务。
Redis 的事务有两个特点:
1、按进入队列的顺序执行。
2、不会受到其他客户端的请求的影响。
Redis 的事务涉及到四个命令:multi(开启事务),exec(执行事务),discard (取消事务),watch(监视)
通过 multi 的命令开启事务。事务不能嵌套,多个 multi 命令效果一样。
multi 执行后,客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被 执行, 而是被放到一个队列中, 当 exec 命令被调用时, 所有队列中的命令才会被执 行。
通过 exec 的命令执行事务。如果没有执行 exec,所有的命令都不会被执行。 如果中途不想执行事务了,怎么办?
可以调用 discard 可以清空事务队列,放弃执行。
watch命令
它可以为 Redis 事务提供 CAS 乐观锁行为(Check and Set / Compare and Swap),也就是多个线程更新变量的时候,会跟原值做比较,只有它没有被其他线程修 改的情况下,才更新成新的值。
我们可以用 watch 监视一个或者多个 key,如果开启事务之后,至少有一个被监视 key 键在 exec 执行之前被修改了, 那么整个事务都会被取消(key 提前过期除外)。可 以用 unwatch 取消。
lua脚本
类似数据库的存储过程。
1、一次发送多个命令,减少网络开销。
2、原子性
3、命令放到lua文件里面 命令的复用


redis为什么这么快
- 纯内存 kv结构
- 单线程 没有创建和销毁线程的消耗。避免上下文切换。没有资源竞争问题。
- 异步非阻塞多路复用
垃圾回收
内存回收主要分类两类 1、key过期了 2、内存达到上限
过期策略
1、定时过期
2、惰性过期
3、定期过期
淘汰策略
如果不设置最大内存。64位不限制内存。32位限制3g内存。
LRU算法 :最近最少使用算法。判断最近使用的时间,最少被使用的淘汰
LFU算法:最不常用
如何找出热度最低的数据?
redis所有对象结构中都有一个lru字段,记录了对象的热度。被访问的时候更新lru的值。记录的不是当前系统的时间戳,记录的是一个全局变量server.lruclock。redis有一个定时处理的函数servercron。记录的是当前unix的时间戳。
lfu算法
高16位用来记录访问时间,低八位用来记录访问频率。
计数器只增加不减少的话,不能体现对象的热度。没有被访问的时候,有一个衰减因子来减少计数器。
持久化机制
RDB
默认持久化方案,满足一定条件,生成一个快照文件dump.rdb。通过加载这个文件来恢复。
1、自动触发
a)配置规则触发。
redis.conf, SNAPSHOTTING,其中定义了触发把数据保存到磁盘的触发频率。 如果不需要 RDB 方案,注释 save 或者配置成空字符串""。
save 900 1 # 900 秒内至少有一个 key 被修改(包括添加)
save 300 10 # 400 秒内至少有 10 个 key 被修改
save 60 10000 # 60 秒内至少有 10000 个 key 被修改
注意上面的配置是不冲突的,只要满足任意一个都会触发。 RDB 文件位置和目录:
#文件路径
dir ./
#文件名称
dbfilename dump.rdb
#是否是LZF压缩rdb文件
rdbcompression yes
#开启数据校验 rdbchecksum yes
2、手动触发
save命令,会阻塞redis
bgsave命令,在后台异步进行快照操作,同时还能相应客户端请求
lastsave命令查看最近一次生成快照的时间
rdb文件的优势和劣势
优势
1、非常紧凑
2、生成rdb文件时,redis会fork()一个子进程来处理所有保存工作。主进程不需要任何磁盘io操作。
3、rdb在恢复大数据集的速度比aof的速度快。
劣势
1、rdb数据没法做到实时持久化,bgsave在执行fork操作频繁执行成本过高
2、一定时间做一次备份,如果意外down掉,会丢失数据。
AOF
Append Only File
默认不开启,采用日志的形式来记录每个写操作,追加到文件中。
aof配置
配置文件redis.conf
# 开关 Redis 默认只开启 RDB 持久化,开启 AOF 需要修改为 yes
appendonly no
# 文件名 路径也是通过 dir 参数配置 config get dir
appendfilename "appendonly.aof"
aof优势劣势
优点
1、提供多种同步频率,丢失的比较少
缺点
1、aof比rdf更大
2、高并发情况下,rdb比aof有更好的性能 保证
用哪种呢
如果能忍受一段时间的数据丢失,就用rdb。如果要求数据完整性比较高,就用aof。一般两种一起用。
网友评论