Redis和MySQL的区别?

本文介绍了Redis,一种内存数据库,其特点包括单线程设计、高性能、多种数据类型支持、key冲突解决方法以及Redis Cluster的集群策略。对比了Redis与MySQL的区别,并列举了其五大数据类型的操作。

1、什么是Redis?

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

        因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。

        另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

         如果数据长度都一样,就用char,比如身份证号、手机号 如果数据长度不一样,就用varchar,比如名字、地址,但要保证不越界 定长的磁盘空间比较浪费,但效率高 变长的磁盘空间比较节省,但效率低 varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 char(L): 固定长度字符串,L是可以存储的长度,单位为字符(字母/汉字),最大长度值可以为255

2、Redis是单线程的吗?

        redis是单线程的!

         redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。

        redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。

3、 Redis和MySQL的区别?

a).mysql是关系型数据库,而redis是NOSQL,非关系型数据库。mysql将数据持久化到硬盘,读取数据慢,而redis数据先存储在缓存中,读取速度快,但是保存时间有限,最后按需要可以选择持久化到硬盘。

b).mysql作为持久化数据库,每次访问都要在硬盘上进行I/O操作。频繁访问数据库会在反复连接数据库上花费大量时间。redis则会在缓存区存储大量频繁访问的数据,当浏览器访问数据的时候,先访问缓存,如果访问不到再进入数据库.

4、Redis的五大数据类型?

a) 字符串类型 String 添加操作:set

b) 哈希对象 hash 添加操作: hset

c). 列表对象 list 添加操作: lpush

d). 集合对象 set 添加操作:sadd

e). 有序集合对象 sorted set 添加操作: zadd (其他操作略)

6、Redis如何解决key冲突?

        拉链法。这个问题可以考虑到另一个问题,HashMap是如何解决key冲突的,同样也是采用拉链地址法。如果被问到解决key值冲突还有什么方法?一般来说解决key值冲突的方法有俩种,一种是开放地址法,另一种就是拉链法。

7、Redis的集群策略?

 redis的集群有多个,但是性能最强大的是官方的redis-cluster。

1.使用去中心化化思想, 使用hash slot方式 将16348个hash slot 覆盖到所有节点上 对于存储的每个key值 使用CRC16(KEY)&16348=slot 得到他对应的hash slot 并在访问key时就去找他的hash slot在哪一个节点上 然后由当前访问节点从实际被分配了这个hash slot的节点去取数据。

2.投票容错。通过投票容错机制判断节点是否还在工作中。Redis集群中每个节点都会按时向其他节点发送”心跳包”。当有一个节点不响应时,则判断该节点故障。要求是超过半数的投票不响应。

3.为了解决节点master失效fail的问题,可以使用主从复制策略。 什么时候整个集群不可用(cluster_state:fail)? 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. 如果集群超过半数以上master挂掉,无论是否有slave(从),集群进入fail状态.

### 三、Redis 预减库存在高并发秒杀系统中的作用 在高并发秒杀系统中,**Redis 预减库存**是一种常见的优化手段,其主要作用是通过 Redis 的高性能读写能力,在秒杀请求到达数据库之前进行库存的原子性扣减,从而有效防止超卖问题。由于 Redis 的单线程模型原子操作支持(如 `DECR` 操作),可以在极短时间内完成库存的递减操作,并确保多个并发请求不会导致库存负值。 通过 Redis 预减库存,系统可以在不直接访问数据库的情况下快速响应请求,显著提升系统的吞吐能力响应速度。此外,Redis 的预减操作可以作为库存控制的第一道防线,仅在库存充足时才将请求放入后续的异步队列进行数据库落库处理,从而减轻数据库压力[^2]。 --- ### 三、RedisMySQL 数据一致性保证方法 在高并发场景下,由于 Redis MySQL 是两个独立的数据存储系统,存在网络延迟并发访问的问题,因此需要采取一定的策略来保证两者之间的数据一致性。 #### 1. 延迟双删策略 在更新数据库之前或之后删除 Redis 缓存,可能会导致短暂的不一致。为了缓解这一问题,采用**延迟双删策略**:第一次删除缓存后,执行数据库更新操作,随后在一定延迟后再次删除缓存,确保后续请求能重新从数据库中加载最新数据。该策略适用于读多写少的场景,能够在一定程度上避免脏读问题[^3]。 #### 2. 异步更新与消息队列 通过引入消息队列(如 RocketMQ)将库存更新操作异步化,将 Redis 预减库存与 MySQL 落库操作解耦,从而降低系统耦合度并提升可用性。这种方式可以在保证最终一致性的前提下,提高系统的并发处理能力。 #### 3. 数据库幂等落库 在数据库写入阶段,通过幂等机制(如唯一业务 ID、版本号控制)确保即使发生重复消息或请求,也不会造成数据异常。这种方式可以有效防止因网络重试导致的数据不一致问题。 #### 4. 加锁机制 为了实现强一致性,可以在 Redis 数据库之间加锁(如使用分布式锁 Redisson 或 ZooKeeper),确保整个更新过程的原子性。然而,加锁会显著降低系统的并发性能,因此通常只在对一致性要求极高的场景下使用[^4]。 #### 5. 最终一致性设计 在大多数高并发系统中,通常采用**最终一致性**的设计理念,即允许数据在短时间内存在不一致,但确保最终状态一致。通过优化网络延迟、提升同步效率,将一致性延迟控制在可接受范围内(如 10-30 毫秒)[^5]。 --- ### 示例代码:Redis 原子扣减库存 ```java public boolean reduceStock(String productId) { Long stock = redisTemplate.opsForValue().decrement("stock:" + productId); if (stock != null && stock >= 0) { // 库存充足,继续异步落库 return true; } else { // 库存不足,回滚 Redis 操作(可选) redisTemplate.opsForValue().increment("stock:" + productId); return false; } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值