String的使用场景:
set的使用场景:
hash的使用场景:
zset的使用场景:
list的使用场景:
问题:知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的理解,删key的时候有什么问题?
java的锁分为两种,这两种锁是不同的东西
1.JVM层面的加锁,单机版的锁
2.分布式微服务架构,拆分后各个微服务之间为了避免冲突和数据故障而加入的一种锁,分布式锁
分布式锁的实现方案:
1.mysql
2.zookeeper
3.redis
redis分布式锁:
多个服务间+保证同一时刻内+同一用户只能有一个请求(防止关键业务出现数据冲突和并发错误)
程序之间操作:
1.加redis分布式锁,包括锁名,包括唯一值value,过期时间,时间搓,(要保证原子性的过期时间写法)
2.做完业务删除锁(在finally里面删除)
3.防止删除别人的锁,
4.删除保证原子性,要用lua脚本或者用redis自身的事务 (实际工作中用lua脚本)
lua脚本方式:
redis自身事务方式:
5.要确保redislock过期时间大于业务执行时间的问题 集群 主挂掉 会丢失锁
4以上的代码行不通 这样得上Redisson落地实现
6.超高并发会报错 问题出现在unlock() 最好加个判断
redis的过期淘汰策略:
面试题:
redis默认内存是多少?在哪里看?如何设置修改?
vim redis.conf 的maxmemory就是默认内存 如果没设置 就是不限制内存大小 (最大)
查看生产上内存是多少:info memory
还可通过命令配置(可动态修改):config set maxmemory 字节数
一般生产上如何配置?
一般推荐Redis设置内存为最大物理内存的四分之三
真要打满了会怎么样?
如果redis内存使用超过了设置的最大值会怎么样?
报oom
结论:用内存淘汰策略
redis缓存淘汰策略:
三种不同的删除策略:定时,惰性,定期
内存淘汰策略:
可以通过配置文件或者命令方式
命令方式(支持动态):config set maxmemory- policy allkeys- lru
配置文件方式:
redis的LRU算法介绍:
概念:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰
Redis持久化:
RDB:做全量替换
AOF:以日志方式来记录