redis篇(理论篇)

目录

  1. mysql的演进
  2. NoSQL
  3. redis概述
  4. redis安装
  5. redis基本知识
  6. redisKey基本命令
  7. 八种数据结构
  8. redis基本事务操作
  9. redis 实现乐观锁

 

一、MySQL的演进过程

1. 初期:单机架构,简单高效

  • 90年代,随着互联网初期发展,单机数据库架构(APP → Middleware → MySQL)完全够用,压力小,易于维护。

2. 中期:垂直拆分与读写分离

  • 随着业务量增加,单机无法满足需求,出现了垂直拆分(不同模块用不同数据库)与读写分离(主库写,从库读)策略。

3. 缓存层优化

  • 进一步为了减轻MySQL压力,开始在应用层引入文件缓存机制

  • 后续逐渐普及Memcached作为分布式缓存,大大提高了系统性能。

4. 后期:水平扩展与集群

  • 业务不断膨胀,最终演变为:

    APP → Middleware → 缓存层(Memcached) → 多个MySQL集群(集群1、集群2、集群3)
  • 水平拆分(分库分表)+ 多实例集群成为标配。

5. 存储引擎演变

  • 早期 MySQL 采用MyISAM引擎(表锁,效率低,事务支持差)。

  • 后来转向InnoDB引擎(行级锁,支持事务、崩溃恢复、外键约束)。

6. 新问题:应对更复杂、变化更快的数据需求

  • 随着移动互联网、社交应用爆发,MySQL遇到瓶颈。

  • 引入NoSQL体系,存储如用户画像、地理位置、社交关系等数据,减轻关系型数据库压力。


二、NoSQL的兴起与应用

1. 什么是NoSQL?

  • NoSQL,全称 Not Only SQL,即“不仅仅是SQL”。

  • 特点:

    • 格式灵活:基于 Key-Value 或文档,数据类型多样。

    • 无需固定表结构:方便迭代开发,支持敏捷开发和极限编程。

    • 高扩展性和高性能:适应海量数据场景。

【扩展:敏捷开发】强调的是快速迭代、小步快跑、持续反馈、持续优化,而不是像传统开发那样一开始就写一大堆文档、一次性做完。项目分成很多小周期(通常2-4周叫做一个Sprint),每个周期都交付一个可以运行的版本。强调人与人的沟通(团队交流比写文档更重要)。

举个例子:

比如开发一个电商网站:

  • 第一个Sprint:只做出首页+商品列表的最小功能;

  • 第二个Sprint:增加商品详情页+简单下单功能;

  • 第三个Sprint:接入支付;

  • 中间每两周就交付一个小版本,客户可以体验,随时调整方向,比如改UI、换支付方式。

这样比起传统一次性做完一整年开发,灵活得多,也风险小得多

【扩展:极限编程】简称 XP,是敏捷开发的一种具体实践方法

2. 关系型数据库(RDBMS)与NoSQL的区别

对比点关系型数据库(RDBMS)NoSQL
数据结构结构化(表)灵活(键值、文档、列存、图)
查询语言SQL多样(API调用、类SQL)
数据一致性强一致性最终一致性(CAP理论)
事务支持支持ACID事务弱化事务以换取扩展性
典型应用金融、传统企业社交、内容分发、日志存储

企业典型组合:MySQL + Redis

3. NoSQL应用示例(以淘宝商品页为例)

  • 商品基本信息、评论(结构化文档) → MongoDB

  • 商品图片(大文件存储) → FastDFSOSS

  • 搜索关键词、商品检索 → ElasticSearch

  • 热门商品、秒杀活动缓存 → Redis、Tair、Memcached

  • 交易、支付系统 → 仍以关系型数据库为主(如MySQL)

4. NoSQL四大主流分类

类型代表产品说明
键值(K-V)存储Redis、Tair、Memcached快速访问,缓存场景最佳
文档型数据库MongoDB类似JSON存储,灵活结构
列式数据库HBase、Cassandra适合大规模写入和分析
图数据库Neo4j适合存储复杂网络关系(社交、推荐系统)

三、Redis详解

1. 什么是Redis?

  • 全称:Remote Dictionary Server(远程字典服务)

  • 特点:

    • 基于内存存储,极致高效

    • 支持持久化

    • 丰富的数据结构

    • 用作缓存、数据库、消息中间件

    • 支持发布订阅、地理位置分析、计时器、计数器等应用

2. Redis安装与使用(快速上手)

  • Windows环境:下载 redis-cli.exe、redis-server.exe、redis-benchmark.exe 等。

  • Linux环境:

    sudo apt-get install redis-server systemctl start redis redis-cli -p 6379
  • 测试性能:

    redis-benchmark -h localhost -p 6379 -c 100 -n 10000

    (测试100个并发连接,每个连接发送10000次请求)

  • 默认端口:6379

  • 测试连接:

    ping → pong

四、Redis基础知识

1. 数据库管理

  • 默认16个逻辑数据库(编号0~15)

  • 常用命令:

    select 0 # 切换数据库 DBSIZE # 查看当前数据库中Key数量 flushdb # 清空当前数据库 flushall # 清空所有数据库

2. 单线程但高性能

  • Redis采用单线程事件循环处理请求,避免多线程锁竞争,效率极高。

  • 性能瓶颈往往在于内存带宽网络带宽,不是CPU!

3. 存储机制

  • 主要存储在内存(RAM),访问速度极快。

  • 持久化方式(可选):

    • RDB快照:周期性生成内存数据快照到磁盘。

    • AOF日志:记录每一次写操作,支持按日志重放恢复。

  • 数据结构组织方式:

    RedisDB └── dict哈希表 ├── key1 → value1 ├── key2 → value2 └── ...

4. 内存管理与淘汰策略

  • 配置 maxmemory 限制最大内存占用。

  • 超出后可按策略淘汰数据:

    • LRU(最近最少使用)

    • LFU(最少访问次数)

    • TTL(按过期时间)

5. Redis的常见误区

误区正确理解
多线程一定比单线程快错!多线程有锁竞争、上下文切换开销
Redis单线程性能不足错!Redis单线程可支撑几十万QPS,瓶颈一般是带宽和内存

五、Redis五大数据类型及常用命令

1. String(字符串类型)

最基础、最常用的数据类型,类似单纯的Key-Value存储。

  • 基本操作

    set name "hh" get name
  • 过期时间设置

    expire name 10 # 设置10秒后过期 ttl name # 查看剩余生存时间
  • 类型查询
  type name
  • 字符串追加

    append name "haha" strlen name
    ---------------------------------------------------------------------------------------------------------------------------------------------------------
     

 

  • 自增/自减
  set views 0    # 初始浏览量设为0
  incr views     # 自增1
  decr views      # 自减1
  INCRBY views 10    # 设置步长为10
  • 范围查询

  getrange key1 0 3    # 截取0-3下标的字符串

  getrange key1 0 -1

  setrange key2 1 xx    # 将下标为1后面插入xx

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

  setex key3 30 "hello"        # 设置过期时间,30秒过期

  setnx mykey "redis"        # 当前值不存在再设置(在分布式锁常试用)若存在值则返回0(创建失败);不存在则创建返回1

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 批量设置/获取值

  mset k1 v1 k2 v2 k3 v3

  mget k1 k2 k3

  msetnx k1 v1 k4 v4    # k1存在,k4成功,但最后还是返回0(是一个原子性操作)

  • 对象

  set user:1 {name: zhangsan, age :3}    # 设置一个user:1对象 值为json字符串来保存对象

  mset user:1:name zhangsan user:1:age 2

  mget user:1:name user:1:age

  getset db redis    # 若不存在值,则返回nil

  get db      # redis

  getset db mongodb    # 若存在值,获取原来的值,redis

  get db        # mongodb

 

2. List数据类型

  

 

作者:筱倩原文地址:https://www.cnblogs.com/xiaoqian01/p/18850070

%s 个评论

要回复文章请先登录注册