Redis -- Redis独立功能实现

1,发布与订阅
redis发布与订阅由:PUBLISH、SUBSCRIBE、PSUBSCRIBE命令组成
1.1 订阅与退订
订阅频道:客户端执行SUBSCRIBE命令订阅某个或某些频道时候,服务器会将客户端与被订阅的频道在pubsub_channels字典中关联起来
退订频道:UNSUBSCRIBE命令会将pubsub_channels字典中绑定关系解除

订阅模式:客户端执行PSUBSCRIBE命令订阅某个或某些模式,服务器新建一个pubsubPattern结构,将结构的pattern属性设置为被订阅模式,client属性设置为订阅模式的客户端,并将结构加入到pubsub_patterns链表表尾
退订模式:PUNSUBSCRIBE命令会将pubsub_patterns链表中删除对应的pubsubPattern结构
1.2 发送消息
客户端执行PUBLISH<channel> <message>命令将消息发送给频道(channel)
	将消息推送给channel频道的所有订阅者
	如果有一个或多个模式pattern与频道channel匹配,那么将消息发送给pattern模式的订阅者
2,事务
Redis通过MULTI、EXEC、WATCH命令来实现事务功能
2.1 事务实现

事务开始

MULTI命令标志着事务的开始,将执行该命令的非事务状态切换到事务状态,通过在客户端的flags属性中打开REDIS_MULTI标识来完成

命令入队
在这里插入图片描述

事务队列

multiCmd类型的数组,数组中每一个multiCmd结构保存了一个已入队列命令的相关信息
多个命令会被入队到事务队列中,按先进先出FIFO顺序执行

事务执行

当客户端发送EXEC命令时,将立即被服务器遍历客户端的事务队列,执行队列中保存的所有命令,将执行结果返回给客户端
2.2 WATCH命令
watch命令是一个乐观锁,在EXEC执行之前,监视任意数量的数据库键,执行EXEC时检查被监视的键是否至少有一个被修改,如果被修改就拒绝执行事务,向客户端返回事务执行失败的空回复

每个Redis数据库都保存一个watched_keys字典,字典的键是被某个WATCH命令监视的数据库键,字典值是一个链表,记录所有监视相应数据库的客户端,可以很清楚知道哪些数据库正在被监视,以及哪些客户端正在监视这些数据库键

带有WATCH命令的事务会将客户端和被监视的键在数据库的watched_keys字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标志打开,从而来拒绝执行客户端的事务(修改了就破坏了原子性,不能提交该事务)
2.3 Redis-ACID
redis事务和传统关系型数据库最大的区别在于Redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出错,整个事务也会继续执行,直到事务队列中的所有命令都执行完毕
原子性:数据库将事务中的多个操作作为一个整体执行,要么执行事务中的所有操作,要么一个操作也不执行

一致性:数据库在执行事务前是一致的,则在数据执行之后,无论是否成功,数据库应该任然是一致的
	入队错误:一个事务在入队命令过程中,如果发现命令不存在或者命令格式有误,redis将直接拒绝这个事务
	执行错误:命令已经在执行了发现的错误,服务器是不会中断事务的执行,出错也不影响,会继续执行事务中余下的命令(出错的命令会被服务器识别到,进行相应的错误处理,出错的命令不会对数据库做任何修改,也不会对事务的一致性产生影响)
	服务器停机:执行事务过程中停机,会根据不同持久化模式做出相应恢复,但都不会影响事务一致性
		无持久化模式 --> 重启后数据库空白(内存全部丢失),数据一定一致
		RDB模式 --> Redis 不会中断事务去执行保存RDB 的工作,所以当RDB 模式下的Redis 服务器进程在事务中途被杀死时,事务内执行的命令,不管成功了多少,都不会被保存到RDB 文件里。
		AOF模式 --> 如果事务的部分语句被写入到AOF 文件,并且AOF 文件被成功保存,那么不完整的事务执行信息就会遗留在AOF 文件里,当重启Redis 时,程序会检测到AOF 文件并不完整,Redis 会退出,并报告错误。需要使用redis-check-aof 工具将部分成功的事务命令移除之后,才能再次启动服务器。还原之后的数据总是一致的,而且数据也是最新的(直到事务执行之前为止)

隔离性:数据库中多个事务并发执行,各个事务之间不会相互影响,并发状态情况下执行的事务和串行情况下执行的事务产生的结果完全一样
	Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis的事务是总是带有隔离性的

持久性:一个事务执行完毕后,执行这个事务所得到的结果已经被固化到磁盘,即使服务器在事务执行完毕后停机,结果也不会丢失
	redis的事务是使用队列包裹一组redis命令,redis本身并没有为事务提供持久化能力,所以持久化是依赖于redis的持久化模式(AOF、RDB)
	无持久化模式 --> 重启后数据库空白(内存全部丢失),不具有持久性
	RDB模式 --> 服务器在给定情况满足时才会执行BGSAVE对数据进行持久化操作,而且BGSAVE是子进程操作的,不能保证第一时间保存到硬盘,因此也不具有持久性
	AOF模式 --> appendfsync选项为always时,程序会在执行命令之后调用同步函数,将数据真正的保存到硬盘,才具有持久性,其它everysec或者no选项时都不具有持久性
	
事务最后加一个SAVE命令,触发父进程自己持久化可以保证事务的持久性,但是性能低下,不建议使用
3,排序
redis的sort命令会对列表键、集合键或者有序集合键进行值的排序,由快速排序算法实现
SORT命令通过将被排序键包含的元素载入到数组中,通过对数组的排序来完成对键的排序工作,默认情况下SORT命令假设被排序的键包含的都是数字值,以数字值的方式来排序
使用ALPHA选项时,会假设被排序的键包含的都是字符串,以字符串方式排序
4,二进制数组
redis提供SETBIT、GETBIT、BITCOUNT、BITOP命令处理二进制位数组(位数组)

参考链接:
学习《Redis设计与实现》 笔记

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值