Redis_常见问题

参考

https://github.com/AobingJava/JavaFamily

为什么使用Redis?

传统的关系型数据库已经不适用所有场景了,例如频繁变化和操作的短时热点数据,如果直接访问MySQL这类的关系型数据库,会极大地增添数据库负担,严重时可能引起系统崩溃,所以考虑引入缓存中间件Redis。

Redis与Memcached的区别,为什么选择Redis?

  • Redis支持的数据结构更丰富

  • Redis支持原生集群

  • Redis单核,MemCached多核,在存储小数据上Redis性能更高,大数据上略逊于MemCached

  • MemCached key 不能超过 250 个字节;

  • MemCached value 不能超过 1M 字节;

  • MemCached key 的最大失效时间是 30 天;

  • MemCached 只支持 K-V 结构,不提供持久化和主从同步功能。

Redis为什么快?

  • 完全基于内存,类似HashMap
  • 单线程,避免不必要的上下文切换和竞争条件
  • 多路IO复用模型,非阻塞IO
  • 数据结构简单
  • 构建了VM机制

什么是上下文切换

比如你看书的时候,突然有朋友说接他看一下,然后你借给他,等他还给你,你要再翻到你之前看到的页码,这就是一个切换过程。

Redis的线程模型是什么?

https://doocs.github.io/advanced-java/#/./docs/high-concurrency/redis-single-thread-model
Redis内部使用文件事件处理器File Event Handler,其包含四个部分:

  • 多个socket
  • IO多路复用程序
  • 文件事件分派器
  • 事件处理器
    • 连接应答处理器
    • 命令请求处理器
    • 命令回复处理器
      文件事件处理器是单线程的,所以Redis是单线程模型,采用IO多路复用机制通知监控多个socket,多个socket可能会并发产生不同操作,每个操作对应不同的文件事件,IO多路复用程序会将事件放入队列,事件分派器依次从队列中取事件,交给对应的事件处理器处理。
      在这里插入图片描述

单线程的Redis是否浪费了多核服务器的性能?

并不会。可以在一台服务器部署多个Redis实例。

Redis有哪些数据结构和应用场景

https://blog.youkuaiyun.com/Chill_Lyn/article/details/104430104
https://blog.youkuaiyun.com/Chill_Lyn/article/details/104484301

  • 基本数据结构
    • String
      • 缓存 setex key seconds value
      • 计数器 incr key incrby key increment
      • 共享用户session
    • Hash
      • 对象有很多属性 hset key field value
    • List
      • 消息队列 lpush key value1 rpop key
      • 分页展示 lrange key start stop
    • Set
      • 获取随机数据 srandmember key [count] spop key [count]
      • 交集、并集、差集 `sinter key1 [ke
### Redis集群连接配置与管理 #### 配置和管理复杂度 相比单个Redis实例,Redis集群的配置和管理更为复杂。这涉及到集群的拓扑结构、数据分片规则以及节点间的故障转移机制等问题,这些都需要额外的时间和资源来设置和维护[^1]。 #### 整体配置流程 为了成功建立并使用Redis集群,在项目中通常遵循如下几个主要步骤: - **引入依赖**:确保应用程序能够访问必要的库文件以便于后续操作。 - **配置连接信息**:设定指向各个Redis服务端的具体地址和其他必要参数。 - **定义集群节点详情**:指定参与构成整个分布系统的各成员位置及其角色分配情况。 - **创建连接池**:优化性能的同时也提高了稳定性;它允许程序重复利用已存在的网络链接而不是每次都新建一个新链路。 - **初始化`RedisTemplate`对象**:这是Spring框架下用来简化对Redis数据库执行命令的一种工具类。 - **实际应用层面上的操作**:最后一步就是通过之前准备好的模板来进行增删改查等常规动作了[^2]。 ```java // Java代码示例 - 使用JedisPoolConfig自定义连接池属性 import org.springframework.context.annotation.Bean; import redis.clients.jedis.JedisPoolConfig; @Bean public JedisPoolConfig jedisPoolConfig() { final JedisPoolConfig poolConfig = new JedisPoolConfig(); // 设置最大空闲数 poolConfig.setMaxIdle(8); // 设置最小空闲数 poolConfig.setMinIdle(0); // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认false poolConfig.setBlockWhenExhausted(true); // 创建连接的最大等待时间(ms) poolConfig.setMaxWaitMillis(15000L); return poolConfig; } ``` #### 启动Redis集群中的节点 在具体环境中启动Redis集群内的不同节点可以通过命令行完成。例如,在名为B的机器上可以依次运行下面几条指令开启三个不同的Redis进程,并让它们加入到同一个Cluster当中去[^3]: ```bash [root@linux02 ~]# redis-server /etc/redis_7003.conf [root@linux02 ~]# redis-server /etc/redis_7004.conf [root@linux02 ~]# redis-server /etc/redis_7005.conf ``` 之后可通过`ps aux | grep redis`查看正在运行的服务列表确认无误。 #### 不同模式下的特点对比 对于想要构建稳定可靠的分布式缓存解决方案而言,理解各种架构之间的差异非常重要。以下是几种常见部署形式的关键特性概述[^4]: - **主从模式**:简单易懂但缺乏自动化处理能力; - **哨兵模式**:增强了健壮性却增加了初始搭建难度; - **集群模式**:提供最佳灵活性及可伸缩性的选项之一,不过同样面临较高的运维成本和技术门槛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值