Redis基本介绍

Redis是单线程的,为什么还能支持高并发:

  • 非阻塞io多路复用机制
  • 纯内存操作
  • 单线程避免了频繁上下文切换

Redis的数据类型,一般支持那些场景:

  • String
    • -最普通的get和set,做简单的key,value缓存
  • Hash
    • -类似与map(key=1,value={"id":1,"name":"张三","age":18}),一般存储结构化数据,比如一个对象(对象中不能嵌套其他对象),每次读写缓存就可以操作hash中的某个字段.
  • List
    • -有序列表,可以通过lrange,基于list分页.可以缓存一些列表.
  • Set
    • -无序集合,自动去重,当系统部署在多个服务器上,jvm的set就实现不了,此时就需要用到Reids中的set.也可以基于set实现交集,并集,差集.比如qq中的共同好友.
  • Sorted Set
    • 排序的set,去重排序.比如基于分数实现排名.

Redis的过期策略:

  • 10G的redis缓存,写入20个G数据,redis是怎么处理的:

    • -内存淘汰机制:
      1. noeviction:当内存不足时,新写入报错(一般不用).
      2. allkeys-lru:当内存不足时,删除最少使用的key(最常使用方案).
      3. allkeys-random:当内存不足时,随机删除key(一般没人用).
      4. volatile-lru:当内存不足时,在设置过期时间的key中,删除最少使用的key.
      5. volatile-random:当内存不足时,在设置过期时间的key中,随机删除key.
  • 存入5个G的数据到redis时,设置过期时间,时间到了为什么还是占用了5个G的空间

    • -redis走的是:定期删除+堕性删除;redis每隔100ms随机抽取一些key来检查和删除,当你去redis取某个key,redis会去检查是否设置过期时间,是否已经过期,过期就会删除.
  • 简写一个lru:

    • public class LRUCache<K,V> extends LidkenHashMap<K,V>{
          private final int CACHE_SIZE;
          //传递进来最多能缓存多少数据
          public LRUCache(int cacheSize){
              //设置hashmap的初始大小,最后一个参数true是让LidkenHashMap按照访问顺序进行排序,最近发放的排在前面
              super((int)Math.ceil(cacheSize/0.75) + 1, 0.75f, true);
              CACHE_SIZE = cacheSize
          }
          
          @Override
          public boolean removeEldestEntry(Map.Entry eldest){
              //map中的数据量大于指定缓存数据量的时候,就自动删除最老的数据
              return size > CACHE_SIZE;
          }
      }
      
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容