Redis 底层是双向链表
值在键在 值光键亡
list的数据结果是是quicklist
元素较少的情况下 会使用一块连续的内存存储,这个结构是ziplist
也就是压缩链表 它讲所有的元素紧挨着一起存储 分配的是一块连续的内存
当数据量比较多的时候才改成quicklist 因为普通的链表需要的附加指针空间太大,会比较浪费空间,比如这个
列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next
多个压缩链表相互指向,也就是双向指针。
Redis讲链表和ziplist结合起来组成了
set的数据结构是dict字典,Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向
同一个内部值。无序集合它底层其实是一个value为null的hash表所以添加,删除,查找的复杂度都是o(1)
Redis中的hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
hash类型对应的数据结构是两种“ziplist(压缩列表),hashtable(哈希表)。
当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
Redis有序集合zset,是一个没有重复元素的集合。有序不重复。每个成员都关联了一个评分,
这个评分被用来按照从最低分到最高分的排序集合中的成员。集合的成员是唯一的,
但是评分可以是重复的。因为元素是有序的,所以你也可以很快根据评分或者是次序
来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合
作为一个没有重复成员的智能列表。
zset底层使用两个数据结构:
①:hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过
元素value找到相应的score值。
②:跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
Redis事务不能回滚,提交前检查指令的语法,如果语法正确才会提交,如果一旦提交了,就会全部执行,即便其中有报错
也要全部执行完,也不会回滚。
multi:开启事务
exec:执行事务
queued:加入到服务器端的队列
discard:回滚
其实不应该叫事务,应该叫做批量处理,批量操作
在exec命令触发的时候,这一批数据要么执行,要么都不执行。
不能保证连接与连接(客户端与服务器端简历连接)之间的顺序,
外部与计算机连接,在在计算机内部内核中,建立一个缓冲区,建立socket
IO模型,多路复用器,1,epoll,是基于事件,2,io的read
Redis的worker线程只有一个,计算还是串行的,多个io thread进行读取,另外结果输出也是多个线程输出,是并行的,充分利用了CPU
IO IN -----> 计算------->io input
Redis 核心数(IO配置线程数) :CPU核心数 - (1|2)
Redis多线程其实就是利用CPU实现多线程io的读写,但是计算还是串行的,没有加锁