一、reids实践基础
1、缓存系统与Redis
缓存系统:
①请求 =》②业务计算 =》 ③读写数据 (cache <=> db) ④模板渲染 =》 ⑤ 输出
Redis-缓解甚至接管数据库压力
- 能不查数据库就不查数据库
- 存放常用的数据
- 查看数据库进程 show processlist
- 将常用的,查询条件复杂的数据缓存到redis中,可以显著减少数据库的读写,从而降低数据库的压力
- 操作具有原子性特征
- 原子操作:保证了数据的可靠,操作错误的回滚,支持了竞争类业务的实现
Redis的优势:
- 常驻内存 读写性能优越,远胜硬盘IO
- 支持多种数据结构 能实现多种业务需要
- 可以自动保存数据到硬盘 服务重启时恢复 服务稳定持久
daemonize yes 后台启动
port 6379 端口号
pidfile /var/6379.pid
redis-cli 6379 shutdown redis客户端退出
客户端连接redis
安装对应的扩展
操作key value型数据
set get del exists setnx(如果不存在则设置)
键名一般按照模块从大到小来设计,以冒号分隔
hash类型数据
hset hget hdel hexists hsetnx
hash类型键的删除,需要逐个删除每一个field
缓存独立于数据库之外,并不是所有的数据都接受延迟,要始终注意数据的一致性
list类型的数据
lset llen lrange ltrim lpop rpush lpop rpop
实例:操作日志的记录与读取
set类型的数据
sadd smembers scard spop sdiff
2、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的方式
3、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
二、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类型
- 实现方式为双向链表
- 用于存储一个有序的字符串列表
- 从队列两端添加和弹出元素
- 特别适合用于做消息队列
设置秒杀活动
1、设置秒杀状态 ms_status 1描述结束 0 未开启
2、秒杀队列 list
3、判断队列长度,超过长度 设置秒杀状态为结束
4、处理队列,处理之前先设置队列状态为秒杀结束
Set类型
- 集合中每个元素都是不同的
- 元素最多为2^32-1
- 元素没有顺序
差集 sdiff
交集 sinter
并集 sunion
Zset集合
- 集合是有序的
- 支持插入,删除,判断元素是否存在
- 可以获取分数最高/最低的前N个元素
三、Redis 运维
- 持久化
RDB 指定的时间间隔保存数据快照
优点:
适合用于进行备份
fork出子进程进行备份,主进程没有任何IO操作
恢复大数据集时的速度快
缺点:
特定条件下进行一次持久化,易丢失数据
庞大数据时,保存时会出现性能问题
AOF先把命令追加到操作日志的尾部,保存所有历史记录
优点:
数据非常完整,故障恢复丢失数据少
可对历史操作进行处理
缺点:
文件的体积大
速度低于RDB且故障恢复速度慢
- 合理使用Redis
防止内存占满
设置超时时间
不存放过大文件
不存放不常用文件
提高使用效率
合理使用不同的数据结构类型
慎用正则处理或者批量操作Hash,set等
3、Redis Cluster
- 多个Redis实例协同运行
- 采用slot槽分割数据,时CRC16与16384取模后分散
- 主从结构和选举算法,保证每个节点的可靠性
- 客户端可以连接任意一个node进行操作
结构:
- 所有的redis节点彼此互联,内部使用二进制协议优化传输速度和带宽
- 节点的fail是通过集群中超过半数的节点检测失效时才生效
- 客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- redis-cluster把所有的物理节点映射到0-16383slot上,cluster负责维护node<->slot<->value
注意事项:
不完全支持批量操作
事物不能跨界点支持
不支持多实例
key是最小粒度
最少6个才能保证组成完整高可用的集群
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。