1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["8081"],{1526:function(e,n,i){i.r(n),i.d(n,{default:()=>l});var r=i(2676),s=i(453);function t(e){let n=Object.assign({h1:"h1",a:"a",p:"p",strong:"strong",h2:"h2",ul:"ul",li:"li",h3:"h3",code:"code",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",blockquote:"blockquote"},(0,s.ah)(),e.components);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.h1,{id:"introduction-to-engula",children:["Introduction to Engula",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#introduction-to-engula",children:"#"})]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Engula"})," is a high-performance, memory-efficient Redis-compatible kernel. Built on the Redis Server codebase, it replaces Redis's in-memory object store with the ",(0,r.jsx)(n.strong,{children:"Engula Memory Engine"})," while preserving protocol and behavioral compatibility, allowing existing Redis deployments to migrate and validate at lower cost."]}),"\n",(0,r.jsxs)(n.h2,{id:"core-design-philosophy",children:["Core Design Philosophy",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#core-design-philosophy",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Engula's architecture follows three core principles:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"High Redis behavioral consistency"}),": Official runtest and client validation are continuously published, keeping migration cost extremely low"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Memory efficiency first"}),": Reduces footprint through compression and compact metadata encoding"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Latency as a priority"}),": Under typical read/write workloads, foreground-request P99 latency is on par with Redis 7.2 measured under the same conditions (sub-millisecond)"]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"architecture-overview",children:["Architecture Overview",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#architecture-overview",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Engula Server retains the overall architecture of Redis Server, with the primary change being the replacement of the in-memory object store with the Engula Memory Engine. Other modules require only minor adaptation, preserving existing Redis functionality while maintaining compatibility."}),"\n",(0,r.jsxs)(n.h3,{id:"memory-representation",children:["Memory Representation",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#memory-representation",children:"#"})]}),"\n",(0,r.jsxs)(n.p,{children:["In Redis Server, data access revolves around the ",(0,r.jsx)(n.strong,{children:"Redis Object (robj)"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["In Engula Server, in-memory data is represented as an ",(0,r.jsx)(n.strong,{children:"Engula Object (eobj)"}),": a more compact structure specifically optimized for compression/decompression efficiency."]}),"\n",(0,r.jsx)(n.p,{children:"During key-value operations, Engula converts an eobj into a temporary robj on demand:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Lazy loading"}),": A temporary ",(0,r.jsx)(n.code,{children:"robj"})," is created only when needed"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Automatic release"}),": Compiler-level guarantees ensure temporary objects are correctly reclaimed across all code paths"]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"memory-efficiency",children:["Memory Efficiency",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#memory-efficiency",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Engula significantly reduces memory overhead through highly optimized data structures and encoding. In a typical scenario:"}),"\n",(0,r.jsxs)(n.table,{children:["\n",(0,r.jsxs)(n.thead,{children:["\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.th,{children:"Data Structure"}),"\n",(0,r.jsx)(n.th,{align:"right",children:"Redis Metadata Overhead (bytes)"}),"\n",(0,r.jsx)(n.th,{align:"right",children:"Engula Metadata Overhead (bytes)"}),"\n",(0,r.jsx)(n.th,{children:"Optimization"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.tbody,{children:["\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:"HashTable"}
1),"\n",(0,r.jsx)(n.td,{align:"right",children:"32 (dictEntry)"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"14"}),"\n",(0,r.jsx)(n.td,{children:"Swiss table"}),"\n"]}),"\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:"Key + robj"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"3 (key sds) + 16 (robj)"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"10"}),"\n",(0,r.jsx)(n.td,{children:"eobj storage"}),"\n"]}),"\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:"Value (String)"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"3 (value sds)"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"1"}),"\n",(0,r.jsx)(n.td,{children:"eobj storage"}),"\n"]}),"\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:"TTL"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"8"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"5"}),"\n",(0,r.jsx)(n.td,{children:"Variable-length integer encoding"}),"\n"]}),"\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:"Jemalloc"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"⥠4 (8-byte alignment)"}),"\n",(0,r.jsx)(n.td,{align:"right",children:"2"}),"\n",(0,r.jsx)(n.td,{children:"Memory Block management"}),"\n"]}),"\n",(0,r.jsxs)(n.tr,{children:["\n",(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Total"})}),"\n",(0,r.jsx)(n.td,{align:"right",children:(0,r.jsx)(n.strong,{children:"66"})}),"\n",(0,r.jsx)(n.td,{align:"right",children:(0,r.jsx)(n.strong,{children:"32"})}),"\n",(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"~50% metadata overhead reduction"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Note"}),": The table above compares per-key internal metadata overhead (excluding the value data itself). The larger the values, the smaller the contribution of metadata savings to total memory; the smaller the values and the more keys, the closer the overall saving rate gets to the table above. Measured total memory savings on typical workloads are 40%â75% â import your own RDB with ValueSight for an accurate estimate."]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"memory-block-management",children:["Memory Block Management",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#memory-block-management",children:"#"})]}),"\n",(0,r.jsxs)(n.p,{children:["Engula stores key-value data in ",(0,r.jsx)(n.strong,{children:"Memory Blocks"}),", divided into:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Mutable Zone"}),": A data region that can be modified"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Immutable Zone"}),": A data region where only deletion is allowed"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Background tasks periodically compact and replace the blocks in the Immutable Zone. These background tasks are broken down into fine-grained, ",(0,r.jsx)(n.strong,{children:"interruptible coroutines"})," and executed within the native Redis main thread and I/O threads."]}),"\n",(0,r.jsx)(n.p,{children:"Engula dynamically adjusts the response time budget based on system load, prioritizing the latency targets of foreground requests; background work is distributed according to the utilization of each I/O thread to improve overall CPU efficiency."}),"\n",(0,r.jsxs)(n.h2,{id:"performance-and-scalability",children:["Performance and Scalability",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#performance-and-scalability",children:"#"})]}),"\n",(0,r.jsxs)(n.h3,{id:"horizontal-scaling",children:["Horizontal Scaling",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#horizontal-scaling",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Engula supports near-linear horizontal scaling by adding I/O threads. Overall throughput can match or exceed Redis while maintaining more predictable CPU scalability."}),"\n",(0,r.jsxs)(n.h3,{id:"io-model-optimization",children:["I/O Model Optimization",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#io-model-optimization",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Redis (Busy Polling Model)"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Philosophy"}),": Exclusively occupies CPU and memory resources by default"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Mechanism"}),": I/O threads first busy poll (â 1 million cycles â 0.1ms) before going to sleep"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Behavior"}),": CPU consumption grows non-linearly under high load"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Engula (Adaptive Signal/Wait Model)"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Philosophy"}),": Resource efficiency for shared environments"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Mechanism"}),": Replaces busy polling with signal/wait implemented via atomic operations and ",(0,r.jsx)(n.code,{children:"pthread"})," condition variables"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Optimization"}),": Reduces signal frequency and minimizes redundant context switches"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Result"}),": Achieves Redis-level peak throughput while delivering smoother, more predictable CPU scaling"]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"cpumemory-trade-off",children:["CPUâMemory Trade-off",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#cpumemory-trade-off",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Through real-time compression/decompression, Engula trades controlled CPU overhead for significant memory savings, lowering overall memory cost while maintaining performance."}),"\n",(0,r.jsxs)(n.h2,{id:"redis-and-valkey-compatibility",children:["Redis\xae and Valkey Compatibility",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#redis-and-valkey-compatibility",children:"#"})]}),"\n",(0,r.jsxs)(n.p,{children:["Engula maintains ",(0,r.jsx)(n.strong,{children:"high wire-protocol consistency"})," with Redis and Valkey. By reusing the native compute layer of these ecosystems, Engula delivers consistent behavior for standard data operation commands; the reasons and impacts of known differences are published in proof-live."]}),"\n",(0,r.jsx)(n.p,{children:"With a modular design that highly isolates storage integration points, Engula can align with new Redis/Valkey version releases within one month, ensuring a steady pace of compatibility updates."}),"\n",(0,r.jsxs)(n.h3,{id:"version-support",children:["Version Support",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#version-support",children:"#"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Redis"}),": 7.2.11 is the current publicly validated baseline"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Valkey"}),": Full version support"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Continuous evolution"}),": Migration to Valkey 8/9 is underway"]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"enhanced-features",children:["Enhanced Features",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#enhanced-features",children:"#"})]}),"\n",(0,r.jsxs)(n.h3,{id:"performance-enhancements",children:["Performance Enhancements",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#performance-enhancements",children:"#"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Private RDB format"}),": Shortens ",(0,r.jsx)(n.code,{children:"SAVE"}),"/",(0,r.jsx)(n.code,{children:"LOAD"})," time and accelerates full replication sync"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Large Value optimization"}),": In multi-threaded (⥠4 threads) configurations, large value read performance improves by more than 50%"]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"functional-enhancements",children:["Functional Enhancements",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#functional-enhancements",children:"#"})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"ZSet compression"}),": Compresses sorted sets to further reduce memory overhead"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Enhanced threading model"}),": A per-thread/per-coroutine scheduling and priority system that improves CPU utilization and tail-latency performance"]}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"summary",children:["Summary",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#summary",children:"#"})]}),"\n",(0,r.jsxs)(n.p,{children:["Engula combines ",(0,r.jsx)(n.strong,{children:"innovative memory management"}),", ",(0,r.jsx)(n.strong,{children:"strong compression strategies"}),", and ",(0,r.jsx)(n.strong,{children:"protocol-level interoperability"})," to deliver significant improvements for Redis-compatible databases."]}),"\n",(0,r.jsxs)(n.p,{children:["Its adaptive I/O model and horizontally scalable architecture provide more stable, more linear performance, achieving a ",(0,r.jsx)(n.strong,{children:"40%â75% lower memory footprint"})," (measured on typical workloads; varies with data structures and value sizes) without sacrificing compatibilityâideal for production scenarios that aim to lower memory cost while demanding the highest levels of stability."]}),"\n",(0,r.jsxs)(n.h2,{id:"license-and-editions",children:["License and Editions",(0,r.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#license-and-editions",children:"#"})]}),"\n",(0,r.jsx)(n.p,{children:"Engula offers two editions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Engula Developer Edition"})," â Free forever, up to 6 Engula nodes (any master/replica ratio), with no per-instance memory limit."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Engula Enterprise"})," â For larger scale and production use, including enterprise support, SLA, and a formal contract."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For full edition differences and EULA details, see the ",(0,r.jsx)(n.a,{href:"/en/eula",children:"License and EULA page"}),". For larger scale or enterprise support, contact sales: ",(0,r.jsx)(n.a,{href:"mailto:[email protected]?subject=Engula%20Enterprise%20inquiry",children:"[email protected]"}),"."]})]})}function a(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,s.ah)(),e.components);return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}let l=a;a.__RSPRESS_PAGE_META={},a.__RSPRESS_PAGE_META["en%2Fdocs%2Fabout-engula%2Fintroduction.mdx"]={toc:[{text:"Core Design Philosophy",id:"core-design-philosophy",depth:2},{text:"Architecture Overview",id:"architecture-overview",depth:2},{text:"Memory Representation",id:"memory-representation",depth:3},{text:"Memory Efficiency",id:"memory-efficiency",depth:2},{text:"Memory Block Management",id:"memory-block-management",depth:2},{text:"Performance and Scalability",id:"performance-and-scalability",depth:2},{text:"Horizontal Scaling",id:"horizontal-scaling",depth:3},{text:"I/O Model Optimization",id:"io-model-optimization",depth:3},{text:"CPUâMemory Trade-off",id:"cpumemory-trade-off",depth:3},{text:"Redis\xae and Valkey Compatibility",id:"redis-and-valkey-compatibility",depth:2},{text:"Version Support",id:"version-support",depth:3},{text:"Enhanced Features",id:"enhanced-features",depth:2},{text:"Performance Enhancements",id:"performance-enhancements",depth:3},{text:"Functional Enhancements",id:"functional-enhancements",depth:3},{text:"Summary",id:"summary",depth:2},{text:"License and Editions",id:"license-and-editions",depth:2}],title:"Introduction to Engula",headingTitle:"Introduction to Engula",frontmatter:{}}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.