——————————————————
事务
单个逻辑工作单元执行的一系列操作,一个逻辑工作单元要成为事务,须具备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
故障时可以切库;读写分离(数据库稳定);从库执行其他业务。可提高系统的可用性。
分三个步骤:
①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字符串函数。
空间预分配−−避免每次增长操作都需要内存重分配执行系统调用,将连续增长N次字符串所需的内存重分配次数从−必定N次到−最多N次
惰性空间释放−−缩短时,并不立即使用内存重分配来回收多出来的字节,而是保存到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设计与实现》简读
本文探讨了事务的ACID属性、单例模式的实现方式、master-slave架构的应用及Redis内部数据结构的设计原理,包括SDS、链表、字典、跳跃表等。
2236

被折叠的 条评论
为什么被折叠?



