LRUMap.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. --[[
  2. 基于LRU算法的数据表
  3. ]]
  4. local LRUMap = class("LRUMap")
  5. function LRUMap:ctor(maxLength)
  6. self.nodeMap = {} -- 通过key获得Node
  7. self.firstNode = nil
  8. self.lastNode = nil
  9. self.length = 0
  10. self.maxLength = maxLength or 10
  11. end
  12. function LRUMap:Get(key)
  13. local node = self.nodeMap[key]
  14. if not node then
  15. return nil
  16. end
  17. self:UpdateNode(node)
  18. return node.value or node.key
  19. end
  20. function LRUMap:Set(key, value)
  21. local node = self.nodeMap[key]
  22. if not node then
  23. return
  24. end
  25. node.value = value
  26. self:UpdateNode(node)
  27. end
  28. function LRUMap:Add(key, value)
  29. local node = self.nodeMap[key]
  30. if node then
  31. node.value = value
  32. self:UpdateNode(node)
  33. else
  34. while(self.length >= self.maxLength) do
  35. self:RemoveNode(self.firstNode)
  36. end
  37. node = { prev = nil, key = key, value = value, next = nil }
  38. self.nodeMap[key] = node
  39. self:AddNode(node)
  40. end
  41. end
  42. function LRUMap:Remove(key)
  43. local node = self.nodeMap[key]
  44. if node then
  45. self.nodeMap[key] = nil
  46. self:RemoveNode(node)
  47. return true
  48. end
  49. return false
  50. end
  51. function LRUMap:Clear()
  52. for key, node in pairs(self.nodeMap) do
  53. self:Remove(key)
  54. end
  55. self.nodeMap = {}
  56. self.firstNode = nil
  57. self.lastNode = nil
  58. self.length = 0
  59. end
  60. LRUMap.__tostring = function(self)
  61. local str = "{\n"
  62. local node = self.firstNode
  63. while node do
  64. local key = node.key
  65. local value = node.value
  66. if value then
  67. str = str .. key .. "=" .. Inspect(value) .. ",\n"
  68. else
  69. str = str .. Inspect(key) .. ",\n"
  70. end
  71. node = node.next
  72. end
  73. str = str .. "}"
  74. return str
  75. end
  76. ---------------------------- 内部调用,理论上不在外部调用 Start -----------------------
  77. -- 增加节点
  78. function LRUMap:AddNode(node)
  79. self.length = self.length + 1
  80. self:AddNodeToLast(node)
  81. end
  82. -- 删除节点
  83. function LRUMap:RemoveNode(node)
  84. self:ExtractNode(node)
  85. node.key = nil
  86. node.value = nil
  87. node = nil
  88. self.length = self.length - 1
  89. end
  90. -- 更新节点
  91. -- 节点被访问,则需要把节点更新到末尾
  92. function LRUMap:UpdateNode(node)
  93. if self.lastNode == node then
  94. return
  95. end
  96. self:ExtractNode(node)
  97. self:AddNodeToLast(node)
  98. end
  99. function LRUMap:AddNodeToLast(node)
  100. if self.lastNode then
  101. self.lastNode.next = node
  102. node.prev = self.lastNode
  103. self.lastNode = node
  104. else
  105. self.firstNode = node
  106. self.lastNode = node
  107. end
  108. end
  109. -- 把节点从队列中提取出来
  110. function LRUMap:ExtractNode(node)
  111. local prev = node.prev
  112. local next = node.next
  113. if prev then
  114. prev.next = next
  115. end
  116. if next then
  117. next.prev = prev
  118. end
  119. node.prev = nil
  120. node.next = nil
  121. if self.firstNode == node then
  122. self.firstNode = next
  123. end
  124. if self.lastNode == node then
  125. self.lastNode = prev
  126. end
  127. end
  128. ---------------------------- 内部调用,理论上不在外部调用 End -----------------------
  129. return LRUMap