IMHO, Functional Reactive Programming (FRP) เป็นวิธีทั่วไปในการแก้ปัญหาแคชไม่ถูกต้อง
นี่คือเหตุผลที่: ข้อมูลเก่าใน FRP คำศัพท์ที่จะเรียกว่าเป็นความผิดพลาด เป้าหมายอย่างหนึ่งของ FRP คือการรับประกันว่าจะไม่มีข้อบกพร่อง
FRP มีการอธิบายรายละเอียดเพิ่มเติมในการพูดคุย 'Essence of FRP'และในคำตอบ SOนี้นี้
ในการพูดคุยCell s แทนวัตถุแคช / Entity และCellจะมีการรีเฟรชถ้าหนึ่งในนั้นจะมีการรีเฟรชพึ่งพา
FRP ซ่อนรหัสประปาที่เกี่ยวข้องกับกราฟการพึ่งพาและทำให้แน่ใจว่าจะไม่มีกลิ่นอับCells
อีกวิธีหนึ่ง (แตกต่างจาก FRP) ที่ฉันคิดได้คือการรวมค่าที่คำนวณ (ประเภทb) ไว้ในตัวเขียน Monad บางประเภทโดยWriter (Set (uuid)) bที่Set (uuid)(สัญกรณ์ Haskell) มีตัวระบุทั้งหมดของค่าที่ไม่แน่นอนซึ่งค่าที่คำนวณbขึ้นอยู่กับ ดังนั้นuuidเป็นตัวระบุที่ไม่ซ้ำกันบางประเภทที่ระบุค่า / ตัวแปรที่ไม่แน่นอน (เช่นแถวในฐานข้อมูล) ซึ่งbขึ้นอยู่กับการคำนวณ
รวมแนวคิดนี้เข้ากับตัวผสมที่ดำเนินการกับ Monad นักเขียนประเภทนี้และอาจนำไปสู่การแก้ปัญหาการยกเลิกแคชทั่วไปบางประเภทหากคุณใช้ตัวผสมเหล่านี้ในการคำนวณใหม่bเท่านั้น combinators ดังกล่าว (พูดรุ่นพิเศษfilter) ใช้เวลาเขียน monads และ(uuid, a)-s เป็นปัจจัยการผลิตที่aเป็นข้อมูลที่ไม่แน่นอน / uuidตัวแปรระบุ
ดังนั้นทุกครั้งที่คุณเปลี่ยนข้อมูล "ต้นฉบับ" (uuid, a)(เช่นข้อมูลที่ทำให้เป็นมาตรฐานในฐานข้อมูลที่bคำนวณ) ซึ่งค่าที่คำนวณได้bขึ้นอยู่กับประเภทคุณสามารถทำให้แคชที่มีอยู่เป็นโมฆะbหากคุณเปลี่ยนค่าใด ๆaซึ่งbค่าที่คำนวณนั้นขึ้นอยู่กับ เนื่องจากจากSet (uuid)ใน Writer Monad คุณสามารถบอกได้เมื่อสิ่งนี้เกิดขึ้น
ดังนั้นเมื่อใดก็ตามที่คุณกลายพันธุ์ด้วยสิ่งที่กำหนดuuidคุณจะถ่ายทอดการกลายพันธุ์นี้ไปยัง cache-s ทั้งหมดและทำให้ค่าbที่ขึ้นอยู่กับค่าที่ไม่แน่นอนที่ระบุด้วยคำพูดนั้นไม่ถูกต้องuuidเนื่องจาก Writer monad ที่bมีการห่อสามารถบอกได้ว่าbขึ้นอยู่กับที่กล่าวuuidหรือ ไม่.
แน่นอนว่าสิ่งนี้จะคุ้มค่าหากคุณอ่านบ่อยกว่าที่คุณเขียน
แนวทางที่สามในทางปฏิบัติคือการใช้มุมมองที่เป็นรูปธรรมในฐานข้อมูลและใช้เป็นแคช AFAIK พวกเขายังตั้งเป้าหมายที่จะแก้ปัญหาการไม่ถูกต้อง แน่นอนว่านี่เป็นการ จำกัด การดำเนินการที่เชื่อมต่อข้อมูลที่ไม่แน่นอนกับข้อมูลที่ได้รับ