Redis系列从入门到精通 大合集

本文日常更新,迟早会写完它

(1) Redis基础

(1.1) Redis入门

Redis要解决的问题:
关系型数据库的毛病:

  1. 性能瓶颈:磁盘io性能低下
  2. 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群

解决思路:

  1. 降低磁盘io次数,越低越好 — 内存存储
  2. 去除数据间关系,越简单越好 —不存储关系,仅存储数据

于是就产生了Nosql:非关系型数据库,来作为关系型数据库的补充,应用于海量数据前提下的数据处理问题

应用场景:电商

  1. MySQL:商品基本信息,比如名称、价格、厂商
  2. Mongodb:商品附加信息,比如描述、详情、评论
  3. 分布式文件系统:图片信息
  4. ES,Lucene,solr:搜索关键字
  5. Redis:热点信息,如高频信息、波段性信息

Redis系列从入门到精通 大合集_第1张图片
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,有以下特征:

  1. 数据间没有必然的关联关系
  2. 内部采用单线程机制进行工作
  3. 高性能、官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s
  4. 多数据类型支持
    - 字符串类型 string
    - 列表类型 list
    - 散列类型 hash
    - 集合类型 set
    - 有序集合类型 sorted_set
  5. 持久化支持,可以进行数据灾难恢复

Redis的应用

  • 为热点数据加速查询(主要场景),如热点商品,热点新闻、热点资讯、推广类等高访问量信息
  • 任务队列,如秒杀、抢购、购票排队等
  • 计实信息查询,如各类排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
  • 时效性信息控制,如验证码控制、投票控制等
  • 分布式数据共享,如分布式集群架构中的session分离

初始阶段,我使用windows平台的3.2版本作为入门学习使用,后面再改用linux版本

(1.2) Redis数据类型

Redis自身是一个map,其中所有的数据都是采用key-value的心事存储,数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串

(1.2.1) string类型

最简单的数据类型,一个存储空间保存一个数据,如果字符串以整数或小数的形式展示,可以作为数字操作使用
基本操作:

  1. 添加修改数据
    set key value
    mset key1 value1 key2 value2 …
    *讨论1

  2. 获取数据
    get key
    mget key1 key2 key3 …

  3. 删除数据(返回删除的key的个数)
    del key1 key2 …

  4. 获取数据字符个数(失败则返回0)
    strlen key

  5. 追加信息到原始信息后(如果有则追加,否则新建,返回值为总的长度)
    append key value

string类型扩展操作
业务场景1:分表操作,就是说使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复。Oracle数据库有sequence设定,那么不具类似操作的mysql该如何解决呢?
解决办法:使用Redis来提供主键生成策略,保障主键唯一性,此方案适用于所有数据库,且支持数据库集群。在Redis中有如下指令

  1. 设置数值数据增加指定范围的值

    • incr key 自增1
    • incrby key increment 自增x
    • incrbyfloat key increment 自增x(x为小数)
  2. 设置数值数据减少指定范围的值

    • decr key
    • decrby key increment
    • 没有小数的自减,但是可以对前面小数自增取负数,实现相同功能

tips:redis数值上限为Java中的Long.MAX_VALUE,超出上限范围或者原始数据不能转化为数值进行计算会报错

业务场景2:

  • “最强女生”启动微信海选投票,每个微信号每四小时只能投一票
  • 电商商家开启热门商品推荐,每种商品热门期维持三天,三天后取消热门
  • 新闻网站出现热点新闻,如何自动控制热点新闻的时效性

解决方案:

  • 设置数据具有指定的生命周期
    • setex key seconds value 以秒为单位
    • psetex key milliseconds value 以毫秒为单位
    • ttl key 查看剩余时间(返回值-2表示已过期,即查不到该key,-1表示永久有效,0及以上表示的就是剩余时间)

string类型应用场景
业务场景: 高频访问信息显示控制,如微博大V主页显示粉丝数与微博数量
命名规范问题:

  • 以用户主键和属性值作为key,后台设定定时刷新策略即可

    • eg:user:Id:3506728370:fans -> 12210947
    • eg:user:Id:3506728370:blogs -> 6164
    • eg:user:Id:3506728370:focuss -> 83
  • 还可以用json格式存储

    • eg:

数据库中热点数据key命名惯例:表明:主键名:主键值:字段名
tips:redis应用于各种结构型和非结构型高热度数据访问加速

讨论1:单数据操作与多数据操作的选择:
首先操作耗时为:发送(给redis)指令时间(st)+执行指令时间(et)+返回结果时间(rt)
假设要执行x条指令
单数据操作:发送x次,执行x次,返回x次,总耗时为 xst + xet + xrt
多数据操作:发送1次,执行x次,返回1次,总耗时为 st + x
et + rt,(其实此处的st和rt其实应该比上一行的st和rt大一些,毕竟将x次要发送的数据糅合在一起发送肯定比分开发送时发送一条要久一点,但是影响不大,就忽略一下,当作相等。)
则由上述内容推出,单数剧操作的耗时 > 多数据操作的耗时,那么操作时改如何进行指令的选择呢,其实,应该就实际情况,比如x=50时,那么应该一次发50个比较好,但是如果x=10^8,也就是一亿条数据的时候呢,如果一起发的话,那么就会阻塞住,因为redis是单线程的,此时可以选择将一亿条数据分为100份,每次发送一百万条数据,也可以继续分割测量,看什么样的规模对性能影响最小。

(1.2.2) hash类型

(1.3) Redis通用命令

(1.4) Jedis

(2) Redis高级

(2.1) 持久化

(2.2) redis.conf

(2.3) 事务

(2.4) 集群

(3) Redis应用

(3.1) 企业级解决方案

你可能感兴趣的:(redis,数据库)