redis原理

2020-03-15  本文已影响0人  写代码的杰西

发布订阅模式

WeChat54696b45fbe6e57c1d9e36e81c8eb169.png

订阅者订阅频道:可以一次订阅多个,比如这个客户端订阅了 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文件里面 命令的复用

image.png image.png

redis为什么这么快

垃圾回收

内存回收主要分类两类 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。一般两种一起用。

上一篇 下一篇

猜你喜欢

热点阅读