为什么使用 Redis
性能:耗时且返回结果变化不频繁,
例如:秒杀获取秒杀商品集合,做到不同地区不同会员级别获取不同的商品集合
处理:if(get(地区+会员级别) ==null){
数据库获取商品集合
set(地区+会员级别,商品集合,超时时间);
}
注意:在获取redi缓存之前,一定要检验地区和会员级别在不在你的设置的集合里(可以用redis来存放这个集合),如果没有就给默认值(不然就会造成缓存穿透)
并发:数据库的频繁交互
例如:获取首页的商品详情(首页的商品获取很频繁,如果每个都和数据库交互系统压力很大)
处理:if(get(商品id) ==null){
数据库获取商品详情
set(商品id,商品详情,超时时间(10-15));
}
注意:设置超时时间不要设定为固定值,如果设置为固定值可能导致(缓存雪蹦)
使用 Redis 的常见问题
缓存和数据库双写一致性问题
最终一致性
强一致性:不能放缓存,例如:商品库存
缓存雪崩问题
设置超时时间不要设定为固定值,如果设置为固定值可能导
缓存击穿问题
在获取redi缓存之前,一定要检验地区和会员级别在不在你的设置的集合里(可以用redis来存放这个集合),如果没有就给默认值(不然就会造成缓存穿透)
缓存的并发竞争问题
单线程的 Redis 为什么这么快
纯内存操作
单线程操作,避免了频繁的上下文切换
采用了非阻塞 I/O 多路复用机制
自我理解非阻塞 I/O 多路复用机制第二种:
List<String> request = new ArrayList<>();
request.add("0");
request.add("1");
request.add("2");
request.add("3");
request.add("4");
String[] redis = new String[100000];
//第一种
for (int i = 0; i < request.size(); i++) {
Thread.sleep(10000);
redis[i] = request.get(i);
}
//第二种(由于只用放到指定socket,就可以成功返回了,所以效率高)
//第一步和第二步都在同时进行
//第一步单线程存到socket
Map<Integer,String> socket = new HashMap<>();
for (int i = 0; i < request.size(); i++) {
Thread.sleep(10);
socket.put(i,request.get(i));
}
//第二步单线程存储到redis
while (socket.size() !=0){
for (Integer i : socket.keySet()) {
Thread.sleep(10000);
redis[i] = socket.get(i);
}
}
Redis 的数据类型及使用场景
String
get、获取
set、设置
incr、值自增一(例如:缓存点赞次数)
decr 值自减一 (例如:缓存点赞次数)
Hash
hset, 通过KEY和HashKey设置值
hget, 返回单个HashKey的值
hgetall 返回全部HashKey的值
hset user name lzh
hset user age 18
hget user name 结果:lzh
hgetall user 结果:lzh,18
List
lpush,左插入
rpush,右插入
lpop,左移除
rpop,右移除
lrange AList 0 5 ,获取第0个到5个元素
lrange AList 0 -1 ,获取全部元素
Set
sadd, 添加
spop,移除
smembers,获取全部元素
sunion Aset,Bset的合集
smember Aset nihao,nihao在集合Aset里
Sorted Set 带权重的set
zadd, 添加
zrange, 区间获取集合
zrem, 移除
zcard 数量
Pub/Sub
发布(Publish)与订阅(Subscribe)
Transactions
Redis 的过期策略和内存淘汰机制
1.被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
2.主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
3.当前已用内存超过maxmemory限定时,触发主动清理策略
注: http://www.cnblogs.com/mrhgw/p/6278619.html
注:https://mp.weixin.qq.com/s/1TXICDZ_BoJ7FeAFqiZa5A
注:https://mp.weixin.qq.com/s/8fdBKAyHZrfHmSajXT_dnA
注:http://redisdoc.com/index.html