在虚拟机中,
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
拉取镜像
docker pull redis
docker run -p 6379:6379 --name redis
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf
docker自启
docker update redis --restart=always
redis原子操作-令牌的对比和删除必须保证原子性(通过lure脚本原子验证令牌和删除令牌)
String script =
"if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Long result = redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class),
Arrays.asList(USER_ORDER_TOKEN_PREFIX + memberResponseVo.getId()),
orderToken);
缓存三大问题
雪崩,穿透,击穿
雪崩
雪崩: 10万条数据同时失效,100万个人访问数据库就会蹦
解决:设置随机失效时间
穿透
穿透:缓存中没有null数据,数据库也没有,当时被人利用发100万的请求一个没有的数据,就会崩溃
解决:每次查询都把null数据也放入缓存中,必要的话可以设置过期时间
击穿
击穿:一个热点key,设置了过期时间,某个时刻失效了,正好100万人访问,因为缓存没有,100万个人同时查询数据库,
解决:加锁,如果过期了,就让一个人去查,其他人等待