1、如何使用RedisTemplate访问Redis数据结构
String、list、hashtable,set,zset
https://www.jianshu.com/p/7bf5dc61ca06/
2、常见的缓存策略有哪些
LRU 最近最少使用
LFU 使用频率最少
3、缓存和数据库一致性解决方案
采用延时双删策略
在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。
具体的步骤就是:
1)先删除缓存
2)再写数据库
3)休眠500毫秒
4)再次删除缓存
4、缓存穿透解决方案
DB中也无数据的情况:防止恶意攻击,在缓存中设置默认值
DB中存在数据:热点数据可设置不过期,定期补偿数据
5、缓存雪崩解决方案
和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3、设置热点数据永远不过期。
6、redis有哪些数据结构
7、redis持久化方式
RDB:通过同步或者异步的方式保存数据快照,重新启动时恢复数据快,缺点由于fork子进程异步进行持久化的,在宕机时可能会丢失数据
AOF:以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。每条同步、每秒同步和不同步,三种策略,缺点是AOF文件大重新启动时恢复慢
8、redis淘汰策略
noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。
allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 所有key通用; 随机删除一部分 key。
volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。
9、Redis的过期策略
Redis中同时使用了惰性过期和定期过期两种过期策略
10、redis2和redis3的区别
1)、主要体现在主从复制上面,redis2.8以前,主要是通过sync命令全量复制,即使在主从终端恢复后也是全量复制
redis3.0开始 ,通过psync部分复制,首次同步主服务器发送RDB文件,非首次只发送非同步数据,主服务器保存了同步的偏移量,和复制积压缓冲区
2)、Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供
11、redis集群方案
1)主从模式
Redis不具备自动容错和恢复功能,可用性低
2)哨兵模式
Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用。
缺点:哨兵模式也是基于主从模式,切配置复杂
3)Redis官方 Cluster集群模式
集群搭建的时候需要给集群节点分配哈希槽,当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
4)Jedis sharding集群
5)利用中间件代理
12、redis和memcached 的内存管理的区别
1)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
3)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
13、什么是Redis的并发竞争问题,如何解决
1)、利用redis自带的incr命令
2)、可以使用独占锁的方式,类似操作系统的mutex机制
3)、使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)
4)、这个是针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。
5)利用redis的setnx实现内置的锁
13、了解Redis事务的CAS操作吗
乐观锁工作机制:
watch 命令会监视给定的每一个key,当exec时如果监视的任一个key自从调用watch后发生过变化,则整个事务会回滚,不执行任何动作。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令,及客户端连接关闭都会清除连接中的所有监视。还有,如果watch一个不稳定(有生命周期)的key并且此key自然过期,exec仍然会执行事务队列的指令。
14、Redis的选举算法和流程是怎样的。
对raft算法的实现,Raft采用心跳机制触发Leader选举。系统启动后,全部节点初始化为Follower,term为0.节点如果收到了RequestVote或者AppendEntries,就会保持自己的Follower身份。如果一段时间内没收到AppendEntries消息直到选举超时,说明在该节点的超时时间内还没发现Leader,Follower就会转换成Candidate,自己开始竞选Leader。
https://blog.csdn.net/qq_34988624/article/details/86412393
15、知道哪些redis的优化操作
1)尽量使用短的key
2)避免使用keys *
3)在存到Redis之前先把你的数据压缩下
4)设置 key 有效期
5)选择回收策略(maxmemory-policy)
6)使用bit位级别操作和byte字节级别操作来减少不必要的内存使用
7)尽可能地使用hashes哈希存储。
8)当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能。
9)想要一次添加多条数据的时候可以使用管道。
10)限制redis的内存大小(64位系统不限制内存,32位系统默认最多使用3GB内存)
11)SLOWLOG [get/reset/len]
https://blog.csdn.net/achuo/article/details/80600170
16、redis的线程模型
采用文件事件驱动模式,文件事件驱动器使用IO多路复用对网络套接字进行监听,将监听到的事件放入队列,然后依次分配给事件处理器进行处理。
https://www.cnblogs.com/barrywxx/p/8570821.html
17、Redis是单线程模型为什么效率还这么高?
1)纯内存访问:数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。
2)非阻塞I/O:Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。单线程避免了线程切换和竞态产生的消耗。
3)Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库