reids实践基础

1、reids实践基础

一、缓存系统与Redis

缓存系统:node

①请求 =》②业务计算 =》 ③读写数据 (cache <=> db) ④模板渲染 =》 ⑤ 输出
Redis-缓解甚至接管数据库压力 mysql

  • 能不查数据库就不查数据库
  • 存放经常使用的数据
  • 查看数据库进程 show processlist
  • 将经常使用的,查询条件复杂的数据缓存到redis中,能够显著减小数据库的读写,从而下降数据库的压力
  • 操做具备原子性特征
  • 原子操做:保证了数据的可靠,操做错误的回滚,支持了竞争类业务的实现

Redis的优点:redis

  • 常驻内存 读写性能优越,远胜硬盘IO
  • 支持多种数据结构 能实现多种业务须要
  • 能够自动保存数据到硬盘 服务重启时恢复 服务稳定持久
daemonize yes 后台启动
port 6379 端口号
pidfile /var/6379.pid

redis-cli 6379 shutdown redis客户端退出算法

客户端链接redis
安装对应的扩展
操做key value型数据
set get del exists setnx(若是不存在则设置)
键名通常按照模块从大到小来设计,以冒号分隔sql

hash类型数据
hset hget hdel hexists hsetnx
hash类型键的删除,须要逐个删除每个field
缓存独立于数据库以外,并非全部的数据都接受延迟,要始终注意数据的一致性数据库

list类型的数据
lset llen lrange ltrim lpop rpush lpop rpop
实例:操做日志的记录与读取json

set类型的数据
sadd smembers scard spop sdiff缓存

二、Redis缓存案例

缓存天气
常规缓存,设置key weaher:city:date 查询时先查key是否存在,存在直接返回,不存在先请求接口,再缓存 该key能够设置一个同步接口,每10分钟调用一次,保持和远程接口数据的同步
pv&uv
incrBy 自增
pv自增:使用string key value 设置key 接口调用一次incrBy 加1 获取 get($key)
uvset:使用set 设置 key 调用接口,使用ip地址,添加ip地址到set中,计算set元素的个数服务器

脚本同步数据:第一次从mysql同步数据到redis,后期防止redis数据的丢失,能够考虑增量计算加到mysql中,屡次累加一次操做

分页优化:基于id区分页而不是使用limit的方式数据结构

三、Redis 消息队列

简介:消息队列时消息的顺序集合
场景:网站首页的PV统计和查看
传统直接update表,大并发状况下容易锁表,
redis消息队列:Redis每次请求rpush 脚本匀速处理pvlog set pv查看get pv

应对流量峰值
异步消费(不定速的插入,生产 和 匀速的处理,消费)
解耦应用(不一样来源的生产和不一样去向的消费)

消息队列的实现方式有不少,使用redis实现的最主要的优点是简单快捷
redis实现消息队列有两种方式:

  • 基于list
  • 基于publish/subscribe

redis实现消息队列
基于list的消息队列实现方式
特色:

  • redis的容量决定业务承载能力
  • 每条信息只能被一个消费者消费
  • 通常要把消息所有消费掉
  • 处理失败的消息要作容错

基于publish/subscribe的消息队列实现方式
基于发布订阅实现pv统计
在订阅模式下,只能执行subscribe、psubscribe等和订阅相关的操做,想执行其余操做须要从新实例化一个redis实例

总结:
消息队列的实现方式有不少
使用redis实现的最主要优点是简单快捷
redis实现消息队列有两种方式:
基于list 
基于subscribe/publish

2、Redis缓存简介

Redis时彻底免费的,遵照BSD协议,是一个高性能的key-value数据库

  • 简单的key-value存储,性能极高
  • Redis拥有更多的数据结构并支持更丰富的数据结构
  • Redis支持数据持久化和数据恢复
  • Redis的全部操做都是原子性的
  • 服务器支持AUTH密码验证

Redis字段类型

  • String 字符串
  • Hash 散列/哈希
  • List 列表
  • Set 无序集合
  • Zset 有序集合

String类型

最多见的数据类型
能够为任何类型的字符串,好比二进制,json对象
最大容量 512M
通常会用做缓存使用

Hash类型

  • 与PHP的array类似
  • 能够保存多个key-value,每一个k-v都是字符串类型
  • 最多2^32-1个字段

通常用来存储我的信息缓存

List类型

  • 实现方式为双向链表
  • 用于存储一个有序的字符串列表
  • 从队列两端添加和弹出元素
  • 特别适合用于作消息队列
设置秒杀活动
 一、设置秒杀状态 ms_status 1描述结束 0 未开启
 二、秒杀队列 list
 三、判断队列长度,超过长度 设置秒杀状态为结束
 四、处理队列,处理以前先设置队列状态为秒杀结束

Set类型

  • 集合中每一个元素都是不一样的
  • 元素最多为2^32-1
  • 元素没有顺序
差集 sdiff
 交集 sinter
 并集 sunion

Zset集合

  • 集合是有序的
  • 支持插入,删除,判断元素是否存在
  • 能够获取分数最高/最低的前N个元素

3、Redis 运维

  1. 持久化

RDB 指定的时间间隔保存数据快照
优势:
适合用于进行备份
fork出子进程进行备份,主进程没有任何IO操做
恢复大数据集时的速度快
缺点:
特定条件下进行一次持久化,易丢失数据
庞大数据时,保存时会出现性能问题

AOF先把命令追加到操做日志的尾部,保存全部历史记录

优势:
数据很是完整,故障恢复丢失数据少
可对历史操做进行处理
缺点:
文件的体积大
速度低于RDB且故障恢复速度慢

  1. 合理使用Redis

防止内存占满
设置超时时间
不存放过大文件
不存放不经常使用文件
提升使用效率
合理使用不一样的数据结构类型
慎用正则处理或者批量操做Hash,set等

三、Redis Cluster

  • 多个Redis实例协同运行
  • 采用slot槽分割数据,时CRC16与16384取模后分散
  • 主从结构和选举算法,保证每一个节点的可靠性
  • 客户端能够链接任意一个node进行操做

结构:

  • 全部的redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
  • 节点的fail是经过集群中超过半数的节点检测失效时才生效
  • 客户端与redis节点直连,不须要中间proxy层,客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可
  • redis-cluster把全部的物理节点映射到0-16383slot上,cluster负责维护node<->slot<->value

注意事项:

不彻底支持批量操做
事物不能跨界点支持
不支持多实例
key是最小粒度
最少6个才能保证组成完整高可用的集群
相关文章
相关标签/搜索