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是怎么处理的:
- -内存淘汰机制:
- noeviction:当内存不足时,新写入报错(一般不用).
- allkeys-lru:当内存不足时,删除最少使用的key(最常使用方案).
- allkeys-random:当内存不足时,随机删除key(一般没人用).
- volatile-lru:当内存不足时,在设置过期时间的key中,删除最少使用的key.
- 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; } }