赞
踩
目录
1、介绍下Redis Redis有哪些数据类型 难度系数:⭐
6、为什么Redis的操作是原子性的,怎么保证原子性的 难度系数:⭐
8、Redis数据和MySQL数据库的一致性如何实现 难度系数:⭐⭐
9、缓存击穿,缓存穿透,缓存雪崩的原因和解决方案(或者说使用缓存的过程中有没有遇到什么问题,怎么解决的) 难度系数:⭐
12、MySQL里有大量数据,如何保证Redis中的数据都是热点数据 难度系数:⭐⭐
Redis(Remote Dictionary Server) 是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(string)、哈希(Hash)、列表(list)、集合(sets)、有序集合(sorted sets)等类型。
注:喜欢的朋友可以关注公众号“JAVA学习课堂”方便阅读,内容同步更新。
Redis 支持多种数据类型,每种数据类型都有其特定的使用场景和优势。以下是 Redis 的主要数据类型:
这些数据类型使得 Redis 能够灵活地处理各种应用场景,无论是简单的缓存需求还是复杂的数据结构处理,Redis 都能提供高效且强大的支持。
Redis之所以快,主要归因于以下几个关键因素:
内存存储:Redis将数据主要存储在内存中,而内存读写速度远快于硬盘。因此,Redis能够快速地读取和写入数据,实现高性能的响应。
数据结构优化:Redis支持多种数据类型,每种数据类型都经过精心设计,以实现高效的操作。例如,Redis的字符串类型采用了SDS(简单动态字符串)实现,不仅支持修改字符串长度,还避免了C语言字符串操作中的频繁内存分配和释放。此外,Redis还针对每种数据类型提供了丰富的操作命令,这些命令都经过优化,以最小化时间复杂度。
单线程模型:Redis采用单线程模型来处理客户端请求。虽然这看似限制了Redis的并发性能,但实际上由于Redis的操作大多是基于内存的,且避免了多线程的上下文切换和锁竞争,使得Redis在处理单个请求时非常高效。此外,Redis通过IO多路复用技术(如epoll)来同时处理多个客户端连接,进一步提高了并发性能。
高效的数据编码:Redis对不同的数据类型采用不同的编码方式,以最大化性能和空间利用率。例如,对于小整数,Redis使用共享对象来减少内存占用;对于字符串,Redis会根据长度选择不同的编码方式;对于哈希、列表等复杂数据类型,Redis也采用了紧凑的存储结构和高效的操作算法。
持久化机制:虽然Redis主要关注性能,但它也提供了持久化机制,以防止数据丢失。Redis支持RDB快照和AOF日志两种持久化方式,可以根据实际需求选择。这些持久化方式都经过优化,以最小化对性能的影响。
官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了Redis利用队列技术将并发访问变为串行访问
1)绝大部分请求是纯粹的内存操作
2)采用单线程,避免了不必要的上下文切换和竞争条件
在Redis的配置文件中,通过maxmemory
参数来指定Redis实例能够使用的最大内存量。参数的值是以字节为单位的。
例如,在Redis的配置文件redis.conf
中,你可以这样设置最大内存限制:
maxmemory 1gb
或者,如果你想要设置为500MB,可以这样写:
maxmemory 524288000
一旦设置了maxmemory
,当Redis使用的内存接近或达到这个限制时,它会根据配置的淘汰策略(eviction policy)来自动移除一些键,以确保不会超出内存限制。淘汰策略可以通过maxmemory-policy
参数来配置,常见的策略包括:
noeviction
:不删除任何数据,拒绝写入操作并返回一个错误。allkeys-lru
:根据LRU(Least Recently Used)算法删除键。volatile-lru
:只删除设置了过期时间的键,使用LRU算法。allkeys-random
:随机删除键。volatile-random
:只随机删除设置了过期时间的键。volatile-ttl
:只删除设置了过期时间的键,并且优先删除剩余时间(TTL)较短的键。对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。
Redis的操作之所以是原子性的,是因为Redis是单线程的。
Redis本身提供的所有API都是原子操作,Redis中的事务其实是要保证批量操作的原子性。
多个命令在并发中也是原子性的吗?
不一定, 将get和set改成单命令操作,incr 。使用Redis的事务,或者使用Redis+Lua==的方式实现.
Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。
Redis数据和MySQL数据库的一致性可以通过以下几种方式实现:
问题描述:查询一个不存在的数据,由于缓存和数据库都未命中,导致每次请求都要查询数据库,失去了缓存的意义。
解决方案:
问题描述:由于大量缓存同时失效,导致所有请求都转发到数据库,数据库瞬时压力过大。
解决方案:
问题描述:对于设置了过期时间的热点数据,如果这些数据在过期时刻被大量并发请求访问,会导致所有请求都转发到数据库。
解决方案:
redis一共有3中集群模式,1、主从模式。2、哨兵模式。3、Cluster模式
。
哨兵模式是为了解决主从复制模式的缺点的,即哨兵模式还是基于主从复制模式,只不过多了一个“哨兵”,当master挂掉之后,哨兵就会在在所有的从节点竞选出新的主节点
当master挂掉之后,哨兵会自动从slave中选一个作为master,若master重新启动,master则会转化为现有的master下的一个slave,当slave切换时,会通过发布订阅方式,将slave所对应的master更改。
哨兵本身也有单点故障的问题,所以在一个一主多从的Redis系统中,可以使用多个哨兵进行监控,哨兵不仅会监控主数据库和从数据库,哨兵之间也会相互监控。每一个哨兵都是一个独立的进程,作为进程,它会独立运行
问题描述:Redis使用了过多的内存,可能导致系统资源紧张,影响性能。
解决方案:
问题描述:Redis的读写操作变得缓慢,响应时间增加。
解决方案:
问题描述:Redis的某些操作(如大键值的操作、长时间的Lua脚本等)可能导致阻塞,影响整体性能。
解决方案:
问题描述:在Redis主从复制的场景下,从库可能存在延迟,导致读取不一致。
解决方案:
问题描述:网络延迟或不稳定可能导致Redis性能下降。
解决方案:
要实现MySQL中的大量数据只保证Redis中存储热点数据,可以结合多种策略和技术。以下是一些具体的实现方式:
maxmemory
参数,限制Redis使用的最大内存。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。