redis篇(理论篇)

打印 上一主题 下一主题

主题 1812|帖子 1812|积分 5436

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录


  • mysql的演进
  • NoSQL
  • redis概述
  • redis安装
  • redis根本知识
  • redisKey根本命令
  • 八种数据结构
  • redis根本事务操作
  • 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数据范例

  
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表