You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							52 lines
						
					
					
						
							936 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							52 lines
						
					
					
						
							936 B
						
					
					
				
								package utils
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"container/list"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								type CacheEntry struct {
							 | 
						|
									key   int64
							 | 
						|
									value []byte
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								type LruCache struct {
							 | 
						|
									capacity int
							 | 
						|
									ll       *list.List
							 | 
						|
									cache    map[int64]*list.Element
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func NewLRUCache(capacity int) *LruCache {
							 | 
						|
									return &LruCache{
							 | 
						|
										capacity: capacity,
							 | 
						|
										ll:       list.New(),
							 | 
						|
										cache:    make(map[int64]*list.Element),
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *LruCache) Get(key int64) ([]byte, bool) {
							 | 
						|
									if ele, ok := c.cache[key]; ok {
							 | 
						|
										c.ll.MoveToFront(ele)
							 | 
						|
										return ele.Value.(*CacheEntry).value, true
							 | 
						|
									}
							 | 
						|
									return nil, false
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *LruCache) Put(key int64, value []byte) {
							 | 
						|
									if ele, ok := c.cache[key]; ok {
							 | 
						|
										c.ll.MoveToFront(ele)
							 | 
						|
										ele.Value.(*CacheEntry).value = value
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if c.ll.Len() >= c.capacity {
							 | 
						|
										oldest := c.ll.Back()
							 | 
						|
										if oldest != nil {
							 | 
						|
											c.ll.Remove(oldest)
							 | 
						|
											delete(c.cache, oldest.Value.(*CacheEntry).key)
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									entry := &CacheEntry{key, value}
							 | 
						|
									ele := c.ll.PushFront(entry)
							 | 
						|
									c.cache[key] = ele
							 | 
						|
								}
							 |