美文网首页
redis原理

redis原理

作者: 写代码的杰西 | 来源:发表于2020-03-15 22:09 被阅读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为什么这么快

  • 纯内存 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。一般两种一起用。

相关文章

网友评论

      本文标题:redis原理

      本文链接:https://www.haomeiwen.com/subject/ozwyshtx.html