[Redis]对缓存的一些思考

版权声明:本文为博主原创文章,未经博主允许不得转载。有任何问题请邮件联系[email protected] https://blog.csdn.net/drdongshiye/article/details/84931684

1.为什么要使用缓存技术
高并发:单机缓存支持每秒QPS十几万 远远超过数据库
高性能:缓存使用内存读写性能远超磁盘

2.Redis对比memcached
redis支持多种数据结构存储
redis支持原生集群在3版本以上
redis支持持久化有更好的可靠性
因redis只使用单核memcached多核所以redis性能弱一些(大量数据时)

3.redis的5中数据结构
String 最基本的结构 set key value; get key
hash 类似map hset key field value ; hget key filed
list 类似双端队列 lpush key value1, value2
lpop rpop
set 无序集合 可去重复
sorted set 有序集合

4.redis持久化
详见博客

5.redis过期策略和内存淘汰机制
定期删除+惰性删除
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
LRU算法

class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int CACHE_SIZE;

    /**
     * 传递进来最多能缓存多少数据
     *
     * @param cacheSize 缓存大小
     */
    public LRUCache(int cacheSize) {
        // true 表示让 linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部。
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        CACHE_SIZE = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 当 map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据。
        return size() > CACHE_SIZE;
    }
}

6.redis集群
https://blog.csdn.net/drdongshiye/article/details/84204392

7.穿刺和雪崩

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/84931684