added caching to map results
All checks were successful
Run Integration Tests / test (push) Successful in 19s
All checks were successful
Run Integration Tests / test (push) Successful in 19s
This commit is contained in:
parent
f2d9a37e87
commit
7498f4128a
3 changed files with 77 additions and 4 deletions
58
cache.go
58
cache.go
|
@ -62,6 +62,23 @@ type ForumSearchResult struct {
|
||||||
ThumbnailSrc string `json:"thumbnailSrc,omitempty"`
|
ThumbnailSrc string `json:"thumbnailSrc,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GeocodeCachedItem represents a geocoding result stored in the cache.
|
||||||
|
type GeocodeCachedItem struct {
|
||||||
|
Latitude string
|
||||||
|
Longitude string
|
||||||
|
Found bool
|
||||||
|
StoredTime time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
// GeocodeCache is a thread-safe map for caching geocoding results.
|
||||||
|
type GeocodeCache struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
results map[string]GeocodeCachedItem
|
||||||
|
expiration time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
var geocodeCache *GeocodeCache
|
||||||
|
|
||||||
// CacheKey represents the key used to store search results in the cache.
|
// CacheKey represents the key used to store search results in the cache.
|
||||||
type CacheKey struct {
|
type CacheKey struct {
|
||||||
Query string
|
Query string
|
||||||
|
@ -95,6 +112,15 @@ func NewResultsCache() *ResultsCache {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewGeocodeCache creates a new GeocodeCache with a specified expiration duration.
|
||||||
|
func NewGeocodeCache() *GeocodeCache {
|
||||||
|
printDebug("Initializing geocode cache with expiration: %s", config.RamCache.Duration)
|
||||||
|
return &GeocodeCache{
|
||||||
|
results: make(map[string]GeocodeCachedItem),
|
||||||
|
expiration: config.RamCache.Duration,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get retrieves the results for a given key from the cache.
|
// Get retrieves the results for a given key from the cache.
|
||||||
func (rc *ResultsCache) Get(key CacheKey) ([]SearchResult, bool) {
|
func (rc *ResultsCache) Get(key CacheKey) ([]SearchResult, bool) {
|
||||||
rc.mu.Lock()
|
rc.mu.Lock()
|
||||||
|
@ -151,6 +177,38 @@ func (rc *ResultsCache) currentMemoryUsage() uint64 {
|
||||||
return v.Used // Used memory in bytes
|
return v.Used // Used memory in bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get retrieves the geocoding result for a given query from the cache.
|
||||||
|
func (gc *GeocodeCache) Get(query string) (latitude, longitude string, found bool, exists bool) {
|
||||||
|
gc.mu.Lock()
|
||||||
|
defer gc.mu.Unlock()
|
||||||
|
|
||||||
|
item, exists := gc.results[query]
|
||||||
|
if !exists {
|
||||||
|
return "", "", false, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the item has expired
|
||||||
|
if time.Since(item.StoredTime) > gc.expiration {
|
||||||
|
delete(gc.results, query)
|
||||||
|
printDebug("Geocode cache expired for query: %s", query)
|
||||||
|
return "", "", false, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return item.Latitude, item.Longitude, item.Found, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gc *GeocodeCache) Set(query, latitude, longitude string, found bool) {
|
||||||
|
gc.mu.Lock()
|
||||||
|
defer gc.mu.Unlock()
|
||||||
|
|
||||||
|
gc.results[query] = GeocodeCachedItem{
|
||||||
|
Latitude: latitude,
|
||||||
|
Longitude: longitude,
|
||||||
|
Found: found,
|
||||||
|
StoredTime: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (rc *ResultsCache) cleanOldestItems() {
|
func (rc *ResultsCache) cleanOldestItems() {
|
||||||
rc.mu.Lock()
|
rc.mu.Lock()
|
||||||
defer rc.mu.Unlock()
|
defer rc.mu.Unlock()
|
||||||
|
|
1
init.go
1
init.go
|
@ -89,6 +89,7 @@ func main() {
|
||||||
// Start periodic cleanup of expired cache files
|
// Start periodic cleanup of expired cache files
|
||||||
if config.RamCacheEnabled {
|
if config.RamCacheEnabled {
|
||||||
resultsCache = NewResultsCache()
|
resultsCache = NewResultsCache()
|
||||||
|
geocodeCache = NewGeocodeCache()
|
||||||
printInfo("RAM cache started.")
|
printInfo("RAM cache started.")
|
||||||
} else {
|
} else {
|
||||||
printInfo("RAM cache is disabled.")
|
printInfo("RAM cache is disabled.")
|
||||||
|
|
22
map.go
22
map.go
|
@ -14,11 +14,20 @@ type NominatimResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func geocodeQuery(query string) (latitude, longitude string, found bool, err error) {
|
func geocodeQuery(query string) (latitude, longitude string, found bool, err error) {
|
||||||
|
// First, check if the result is in the cache
|
||||||
|
cachedLat, cachedLon, cachedFound, exists := geocodeCache.Get(query)
|
||||||
|
if exists {
|
||||||
|
printDebug("Geocode cache hit for query: %s", query)
|
||||||
|
return cachedLat, cachedLon, cachedFound, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
printDebug("Geocode cache miss for query: %s", query)
|
||||||
|
|
||||||
// URL encode the query
|
// URL encode the query
|
||||||
query = url.QueryEscape(query)
|
queryEscaped := url.QueryEscape(query)
|
||||||
|
|
||||||
// Construct the request URL
|
// Construct the request URL
|
||||||
urlString := fmt.Sprintf("https://nominatim.openstreetmap.org/search?format=json&q=%s", query)
|
urlString := fmt.Sprintf("https://nominatim.openstreetmap.org/search?format=json&q=%s", queryEscaped)
|
||||||
|
|
||||||
// Make the HTTP GET request
|
// Make the HTTP GET request
|
||||||
resp, err := http.Get(urlString)
|
resp, err := http.Get(urlString)
|
||||||
|
@ -37,10 +46,15 @@ func geocodeQuery(query string) (latitude, longitude string, found bool, err err
|
||||||
if len(result) > 0 {
|
if len(result) > 0 {
|
||||||
latitude = result[0].Lat
|
latitude = result[0].Lat
|
||||||
longitude = result[0].Lon
|
longitude = result[0].Lon
|
||||||
return latitude, longitude, true, nil
|
found = true
|
||||||
|
} else {
|
||||||
|
found = false
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", "", false, nil
|
// Store the result in the cache
|
||||||
|
geocodeCache.Set(query, latitude, longitude, found)
|
||||||
|
|
||||||
|
return latitude, longitude, found, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleMapSearch(w http.ResponseWriter, settings UserSettings, query string) {
|
func handleMapSearch(w http.ResponseWriter, settings UserSettings, query string) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue