首页 > 试题广场 >

在进入我的淘宝页面时,此页面需要获取登录的用户的相关信息,在

[问答题]
在进入我的淘宝页面时,此页面需要获取登录的用户的相关信息,在访问量少的情况下,可以采用直接访问数据库的方式,但当访问量太高时,会导致数据库压力过高,因此通常采取的方法为将用户信息进行缓存,在用户数不多的情况下,这个方案还是提供了很大的帮助的,但用户数增多了一点后,出现的问题是缓存占了太多的内存,而经分析,原因是这些缓存中有很多是不访问的用户信息。
1.1 请写一段存储用户信息的缓存实现代码,并实现当缓存到达一定大小后,如继续新增用户信息,则将最近不访问的用户信息从缓存中踢出;
1.2 由于我的淘宝是部署在多台机器上的,如用户每次访问不同的机器,以上方案会造成每台机器都需要去数据库中加载此用户信息,请给出一个方案来避免此问题。

2.使用分布式缓存机制,将频繁访问的数据信息直接存放在缓存中,比如php使用Mem***d,
Java可以使用Redis。这样就不用所有数据都去访问数据库了。
发表于 2015-08-22 13:56:17 回复(0)
1、使用LRU算法即可将最近不访问的用户信息剔除:Java代码如下:
public class LRUCache {
    public int capacity;
    public LinkedHashMap<Integer,Integer> map;
    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.map = new LinkedHashMap<Integer, Integer>(capacity,(float)0.5,true);

    }
    public int get(int key) {
        if(map.containsKey(key))
            return map.get(key);
        return -1;
    }

    public void set(int key, int value) {
        if(map.size()<capacity || map.containsKey(key))
            map.put(key,value);
        else{
            Iterator<Integer> it = map.keySet().iterator();
            int itt = it.next();
            map.remove(itt);
            map.put(key,value);
        }
    }
}

2、使用分布式缓存机制,将频繁访问的数据信息直接存放在缓存中,比如php使用Mem***d,Java可以使用Redis。这样就不用所有数据都去访问数据库了。

发表于 2015-01-27 21:05:19 回复(0)
1.1 LRU算法,python版本代码:
class Cache:
    def __init__(self, limit):
        self._data = {}
        self._recent_access = []
        self.limit = limit
        self.used = 0

    def set(self, key, value):
        if key in self._data:
            self._recent_access.pop(self._data[key][1])
        if self.used >= self.limit:
            self.discard()
        self.used += 1
        self._recent_access.append(key)
        self._data[key] = value, len(self._recent_access) - 1

    def get(self, key):
        self._recent_access.pop(self._data[key][1])
        self._recent_access.append(key)
        return self._data[key]

    def discard(self):
        discard_key = self._recent_access.pop(0)
        del self._data[discard_key]

1.2 其实是单机缓存不能共享的问题,使用分布式缓存就可以了,比如Mem***d。

发表于 2015-01-05 22:36:11 回复(3)