IMHO, Functional Reactive Programming (FRP) เป็นวิธีทั่วไปในการแก้ปัญหาแคชไม่ถูกต้อง
นี่คือเหตุผลที่: ข้อมูลเก่าใน FRP คำศัพท์ที่จะเรียกว่าเป็นความผิดพลาด เป้าหมายอย่างหนึ่งของ FRP คือการรับประกันว่าจะไม่มีข้อบกพร่อง
FRP มีการอธิบายรายละเอียดเพิ่มเติมในการพูดคุย 'Essence of FRP'และในคำตอบ SOนี้นี้
ในการพูดคุยCell
s แทนวัตถุแคช / Entity และCell
จะมีการรีเฟรชถ้าหนึ่งในนั้นจะมีการรีเฟรชพึ่งพา
FRP ซ่อนรหัสประปาที่เกี่ยวข้องกับกราฟการพึ่งพาและทำให้แน่ใจว่าจะไม่มีกลิ่นอับCell
s
อีกวิธีหนึ่ง (แตกต่างจาก 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 พวกเขายังตั้งเป้าหมายที่จะแก้ปัญหาการไม่ถูกต้อง แน่นอนว่านี่เป็นการ จำกัด การดำเนินการที่เชื่อมต่อข้อมูลที่ไม่แน่นอนกับข้อมูลที่ได้รับ