1.缓存击穿是什么?当某个缓存失效后,多个线程同时访问,同时判断缓存是失效的,那就会多个线程都
访问数据库查询,并多次放入缓存,不但给数据库造成压力,多次访问缓存也给性能带来开销。缓存击穿问题可以
通过加分布式锁得到解决。
2.redis事务
a.开启事务 multi
b.set k1 v1 set k2 v2 这些都会放入到一个QUEUED队列中提交事务后,按顺序执行。
c.exec :执行,提交事务。
d. discard :取消事务。
e.开启事务后执行命令如果有语法错误,在提交事务exec时,全部不会设置时成功。
f.语法没报错,编译通过了但是执行的时候有部分错误,这时候执行成功的就成功,执行不成功的就不成功。
3.redis的watch机制 必须是开启事务之前对某个key进行监控,当执行exec提交事务时,如果其他的客户端对这个key改动过了,那么这个key就会失效。
4.redis发布订阅模式 taibai(相当于是个通道)
订阅消息> subscribe taibai
发布消息> publish taibai "aaaaa"
通配符订阅> psubcribe taibai*
发布消息> publish taibai1 "aaaaa"
发布消息> publish taibai2 "aaaaa"
5.删除策略
setex taibai 5 12213 //设置太白的值12213,5秒钟后过期,默认情况下过期后redis里面其实有可能没有被删除,过期后 get taibai 时才确定被删除
定时删除---以CPU时间换redis内存
惰性删除-----》已redis时间换cpu空间
get时判断超时,超时才删除
定期删除
6.淘汰策略 当服务器内存达到最大值时,删除哪些键值对,这个就是淘汰策略。
a.逐出算法
maxmemory: 最大可使用内存,占用物理内存的比例,默认值为0,,表示不限制。生产环境一般根据需求设置,通常50%以上
maxmemory-policy: 达到最大内存后,对挑选出来的数据进行删除策略
#1)volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最长时间没有被使用的数据,淘汰
#2)allkeys-lru:从数据集(server.db[i].dict)中挑选最长时间没有被使用的数据淘汰
#3)volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
#4)volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最近使用次数最少的数据淘汰
#5)allkeys-lfu:从数据集(server.db[i].dict)中挑选最近使用次数最少的数据淘汰
#6)volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机选择数据淘汰
#7)allkeys-random:从数据集(server.db[i].dict)中随机选择数据淘汰
#8)noeviction(不驱逐),禁止驱逐数据,直接返回报错。
maxmemory-samples: 每次选取待删除数据的个数,选取数据时并不会全库扫描,采用随机获取数据的方式作为待检测删除数据