网站遭攻击,wordpress多重筛选器,淘宝内部优惠券网站怎么建设,自己弄个网站要怎么弄【Redis_Day4】内部编码和单线程模型 五大数据类型内部编码object encoding key1#xff1a;查询key1对应值的内部编码 redis中的单线程模型 redis中的数据都是以键值对的方式存的#xff0c;redis内部用哈希表组织这些键值对。
五大数据类型
站在用户角度#xff0c; 在一… 【Redis_Day4】内部编码和单线程模型 五大数据类型内部编码object encoding key1查询key1对应值的内部编码 redis中的单线程模型 redis中的数据都是以键值对的方式存的redis内部用哈希表组织这些键值对。
五大数据类型
站在用户角度 在一个键值对内部键的数据类型都是String值的数据类型有很多选择最常用的数据类型有五个分别是字符串(String)哈希表(hash)列表(list)集合(set)有序集合(zset)。操作不同的数据结构需要使用不同的命令。 内部编码
站在redis角度 Redis底层在实现用户使用的五大数据结构的时候Redis针对每种数据结构的实现都有自己的底层内部编码而且针对一种数据结构往往有多种实现即一种数据结构对应多个内部编码。Redis内部会在合适的场景选择合适的内部编码存储管理数据。
每种数据结构都至少有两种以上的内部编码。 用户存储数据的时候redis会自动选择具体用什么内部编码来保存数据用户感知不到redis行为。比如用户存储字符串redis中保存这个字符串的时候可能是通过raw也可能是int也可能是embstr。 rawintembstr都是String的内部编码。 raw是最基本的字符串一般保存较大字符串。当value是一个整数的时候redis可能就会直接用int保存value。一个int是64bit。embstr一般保存较短的字符串。 hashtable和ziplist都是哈希表的内部编码。 hashtable实现了一个最基本的哈希表ziplist是压缩列表当哈希表中元素比较少的时候redis就会把哈希表的内部实现转换成ziplist。ziplist可以节省空间对于redis来说如果key特别多hash类型的value也特别多但是每个hash类型的value又不大的情况下通过压缩这些hash类型的value就可以让整体键值对占用的内存更小。 redis3.2之前linkedlist和ziplist都是列表的内部编码。 从redis3.2开始引入quicklist取代了linkedlist和ziplistquicklist同时兼顾了linkedlist和ziplist的优点quicklist本身就是链表每个元素又是一个ziplist。通过quicklist能节省空间和提高管理数据的效率。 hashtable和inset都是集合的内部编码。 如果集合中存的都是整数集合就会被优化成inset。 skiplist和ziplist都是有序集合的内部编码 skiplist也属于链表但和普通链表相比skiplist的每个结点上有多个指针域通过巧妙搭配这些指针域的指向可以做到在skiplist上查询元素的时间复杂度为O(logN)。
redis底层这样设计的好处 可以改进内部编码且对外的数据结构和命令没有任何影响这样⼀旦开发出更优秀的内部编码无需改动外部数据结构和命令例如Redis3.2提供了quicklist结合了ziplist和linkedlist两者的优势为列表类型提供了⼀种更为优秀的内部编码实现且对用户来说基本无感知。 多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist⽐较节省内存但是在列表元素比较多的情况下性能会下降这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist整个过程用户同样无感知。
object encoding key1查询key1对应值的内部编码 redis中的单线程模型
redis单线程模型不是说一个redis服务器进程内部只有一个线程。 redis单线程模型指的是redis只使用一个线程处理所有的命令请求
假设多个客户端同时操作一个redis服务器此时服务器端并不会存在类似于线程不安全的问题。redis服务器实际上是单线程模型当多个请求同时到达redis服务器需要在队列中排队等待redia服务器一个一个的取出里面的命令再执行微观上说redis服务器是串行执行/顺序执行多个命令的。
redis能使用单线程模型很好工作原因主要在于redis的核心业务逻辑都是短平快的不太消耗cpu资源假设使用多线程模型处理业务也提升不大。所以它的弊端也很明显如果某个操作占用redis时间太长就会阻塞redis执行其他命令。
和关系型数据库(mysqloraclesqlServer)相比redis效率高速度快的原因
redis访问内存关系型数据库访问硬盘。redis的核心功能比关系型数据库的核心功能更简单。关系型数据库对于数据库的增删改查都有更复杂的功能支持这样的功能势必要花费更多的开销。redis采用单线程模型避免了一些不必要的线程竞争开销。redis处理网络IO的时候使用了epoll这样的IO多路复用机制。C可以直接使用Linux原生的epoll APIjava可以使用NIONIO是java标准库提供的一组类该类底层封装了epoll。