Redis学习笔记

本文探讨了事务的ACID属性、单例模式的实现方式、master-slave架构的应用及Redis内部数据结构的设计原理,包括SDS、链表、字典、跳跃表等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——————————————————
事务

单个逻辑工作单元执行的一系列操作,一个逻辑工作单元要成为事务,须具备ACID(原子性,一致性,隔离型和持久性)属性。
——————————————————

单例模式

一种避免冲突的设计思想
单例对象的类必须保证只有一个实例存在。有时整个系统需要有一个 全局对象,有利于协调系统整体行为。
如 一家人吃饭,只有一张桌子是单例,每个人都有一个碗是多例。

(基于装饰器实现)
def singleton(cls):
    instance = cls()
    instance.__call__ = lambda:instance
    return instance
@singleton
class Highlander:
x = 100

highlander = Highlander()
another_higerlander = Highlander()
assert id(highlander) == id(another_highlander)

singleton装饰器覆盖了类的 __call__方法,使得每当创建该类时会创建同一个实例。

————————————————————————————————
(基于metaclass实现)
class singleton(Type):
    def __init__(cls,name,bases,dict):
        super(singleton,cls).__init__(name,bases,dict)
        cls._instance = None
    def __call__(cls,*args,**kw):
        if cls._instance is None:
            cls._instance = super(sigleton,cls).__call__(*args,**kw)
        return cls._instance
class Myclass(object):
    __metaclass__ = singleton
one = Myclass()
two = Myclass()
>在类的第一次实例之后将这个实例作为变量保存

——————————————————
master-slave
故障时可以切库;读写分离(数据库稳定);从库执行其他业务。可提高系统的可用性。
SQL的master-slave原理
分三个步骤:
①master记录二进制日志(binary log)
②slave将binary log 拷贝到中继日志
③slave重做中继日志中的事件。


配置:

在slave的conf中

slaveof 192.168.33.27


master 是非阻塞模式
slave 是阻塞模式

———————————————————
imsi
国际移动用户区别码

Redis
———————————————————

SDS(简单动态字符串)

redis中使用sds,而不是c字符串;用来保存数据库中的字符串值;还被用作缓冲区;

与c字符串相比,常数复杂度获取字符串长度 O(1)。(len属性记录了本身长度)。
与c字符串相比,sds的空间分配策略杜绝缓冲区溢出。
通过未使用空间,SDS实现了空间预分配和惰性空间释放
和c字符串相比,SDS可以保存二进制数据。
兼容部分c字符串函数。

NNN
使free

————————————————————

链表

列表键,发布与订阅,慢查询,监视器都用到了链表
链表由list结构实现,带有表头表尾节点指针,链表长度等信息
链表节点由listNode结构来表示,一个指向前置节点和后置节点的指针(双端)
表头的prev,表尾的tail指向NUll(无环)
不同的类型特定函数,Redis的链表可以用于保存各种不同类型的值。

————————————————————

字典

Redis的数据库是用字典作为底层实现的
哈希键的底层实现之一
字典用哈希表作为底层实现,每个字典两个哈希表,一个平时用,另一个仅在rehash时用。
使用链地址法解决键冲突(next指针构成单向链表)
用MurmurHash算法计算键的哈希值
rehash(重新散列) –当哈希表保存的键值对数量太多或太少时;维持哈希表的负载因子在一个合理的范围之内。

=/

rehash步骤

(扩展)服务器目前没有在执行BGSAVE命令或者BGREWRITEOF命令,且负载因子大于等于1; 服务器正在执行BGSAVE命令或者BGREWRITEOF命令,负载因子大于等于5。【为ht[1]分配一个大于等于–当前包含键值对数量(ht[0].used)的内存空间。】
(收缩)负载因子小于0.1时。【为ht[1]分配一个大于等于当前包含键值对数量的的内存空间。】
将保存在ht[0]中的所有键值对rehash到ht[1]
释放ht[0],将ht[1]设为ht[0]。

渐进式rehash,避免rehash对服务器性能造成影响。

————————————————————

跳跃表

有序结合键的实现之一
————————————————————

整数集合(intset)

集合键的底层实现之一
可保存int16t,int32t,int64t三种类型的整数集
添加新元素可能引起升级,所以添加新元素的时间复杂度为O(N)
不支持降级
————————————————————

压缩列表(ziplist)

列表键和哈希键的底层实现之一
包含任意多个节点,每个节点可保存一个字节数组或整数值(encoding决定)
————————————————————

对象

基于前几种数据结构创建一个对象系统。
每个对象由一个redisObject 结构表示,有type,encoding,ptr(底层实现数据结构)等属性。

————————————————————

原子操作

计算机最重要的构成单位是原子操作,希腊语中是不可再分的关系。
x86的 兜底是通过加锁实现,即占用总线。这种方式向后兼容,允许一些非常不可靠的操作,但是慢。
可以是一个步骤,也可以是多个步骤,核心是视作整体。

————————————————————
参考资料
① :http://py.windrunner.info/design-patterns/singleton.html 单例
②:http://blog.csdn.net/mer1234567/article/details/7405775 master-slave
③: http://kexue08.blog.163.com/blog/static/1137563242012326102818326/ redis.conf配置说明
④ 《Redis设计与实现》 黄建宏
⑤: https://www.mudoom.com/%E3%80%8Aredis%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%E3%80%8B%E7%AE%80%E8%AF%BB/ 《Redis设计与实现》简读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值