这是我参与「第五届青训营」笔记创作活动的第17天
一、本堂课重点内容
- 为什么需要Redis,Redis的基本工作原理
- Redis应用案例
- 在字节跳动,使用Redis有哪些注意事项
二、详细知识点介绍
redis简介
1.redis简介 --数据结构服务器:value可以是字符串(String),哈希(Map),列表(list),集合(sets)和有序集合(sorted sets)等类型 --key-value存储系统:REmote DIctionary Server。 --是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2.redis的特点:(Redis 与其他 key - value 缓存产品区别) --Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 --Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 --Redis支持数据的备份,即master-slave模式的数据备份
3.redis优势 --读写性能极高: 读-110000次/s,写-81000次/s --支持多种数据类型:支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作 --原子性: 即事务性,要么执行要么都不执行 --很多拓展特性: Redis还支持 publish/subscribe, 通知, key 过期等等特性。 缺点: --(1)单线程 (2)耗内存
4.Redis与其他key-value存储有什么不同? --1.支持原子性操作(事务) --2.运行在内存中,但可持久化到磁盘(因此要权衡数据量不能大于硬件内存) --3.内存中操作复杂数据结构,相比于磁盘中效率要高很多 --4.磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
5.BSD协议: --1.代码开源 --2.可进行二次开发 --3.注明原作者BSD协议
三、实践练习例子
1.redis-使用最广泛的基于k/v存储的nosql-非关系型数据库
特性:
·使用简单
·高性能 : 万+处理量每秒
·支持多种数据结构:
1.String
2.Hash
3.List
4.Set
5.Sorted Set(Zset)
·方案成熟:分布式/高可用等场景下游刃有余
1.存储在内存中,可持久化到磁盘,重启时加载使用
2.存储海量数据时,单个redis做不到
·支持集群分片存储-redis cluster/Codis/Twemproxy
·HA高可用 sentinel
·主从复制:master/slave模式
2.使用场景:1.2.3使用较多
1.热点数据:读多写少的-
2.用户信息:根据userid缓存起来
3.分布式锁
4.轻量级的mq
5.发布订阅等机制
3.redis客户端和服务端通信:RESP
1.redis客户端常用;jedis,redission,现自己开发
2.通信是基于tcp协议的
http基于tcp的一个应用层协议
resp也是基于tcp的一个应用层协议:
·resp协议官方解释:redis.io/topics/protocol
·特性:
-1.simple to implement 实现简单
-2.fast to parse 快速解析
-3.human readable 人可读
\r\n换行作为每段数据的分隔方式
* + 单行信息
* - 错误信息
* : 整形数字
* $ 多行字符串
* * 数组
redis高级
·比如1000w使用redis存储
·200w距离占2G内存
1.假设5台机器,每台2G内存,现做以上模拟:
2.单台无法存储,所以数据分开存放至多台服务器上
3.根据key的不同自动存到不同的redis服务中---分布式、分片存储
redis代理
1. 自动对数据进行分配存储:分别存储在A,B,C,D,E五台服务器
-启动三个redis:
C:\Users\cjh>h:
H:\>cd redis
H:\redis>redis-server --port 6380
redis-server --port 6381
redis-server --port 6382
-四套数据分散存储在不同服务器:
-由代理服务和具体的redis-server进行交互
哨兵机制
-前提:主从复制
-redis-master挂掉以后,哨兵会选择一个slave节点晋升为master,以实现集群的高可用
1.redis主从:
C:\Users\cjh>h:
H:\>cd redis
H:\redis>redis-server --port 6380
redis-server --port 6381 --slaveof 127.0.0.1 6380
redis-server --port 6382 --slaveof 127.0.0.1 6380
2.启动redis自带哨兵:
哨兵配置详解:doc.redisfans.com/topic/sentinel.html
./redis-server ./sentinel.conf --sentinel
3.自己实现一个java版的哨兵服务:sentinel
* 哨兵机制具体实现:
* ·选举机制:轮询
* ·实现:
* 1.启动定时:N秒执行一次
* ·检查master是否可用(ping通)
* ·可用:
* 1.更新slave列表
* 2.检查bad server列表
* ·循坏ping,通则正常,不通则跳出
* ·正常后挂载到当前master
* ·更新slave列表
*
* ·不可用:
* 1.将当前redis实例划入bad server
* 2.从slave中选举一个座位master
* 3.现有的slave切换到新的master
* 4.继续走可用流程
redis相关开源项目
-1.Jedis:github.com/xetorthio/jedis
-2.Redission:github.com/redission/redission
-3.推特开源:../twitter/twemporxy
-4.豌豆荚团队开源:../CodisLabs/codis
-5.官方高可用:sentinel(哨兵)
电商网站常用技术:高可用分布式系统做支撑
1.搜索引擎:Elasticsearch,solr,lucene
2.日均PV(访问量)上亿:cdn,降级,lvs负载,nginx反向代理...
3.账户系统
4.交易系统:订单,支付,购物车,秒杀
——————————————————————————————
1.商品详情页:
·剖析一线电商商品详情页亿级PV应对策略
·动静分离,缓存更新,服务降级,限流,CDN加速
2.商品搜索:
·Elasticsearch,solr,lucene
·索引更新,分词算法,搜索命中率提升
·订单实时统计
3.交易保证:
·添加购物车,提交订单,秒杀等核心功能
·订单可靠性保证:避免重复订单,避免漏单,要能够有补单功能
·缓存设计,缓存击穿,缓存雪崩的出现场景及解决方案
·mongodb,memcached,kafka,zookeeper,分布式调度