今天学的比较少,心态累了
例如,08年北京奥运,网上售票崩溃,12306购票崩溃
像一些网站的崩溃,都是因为,高并发,用户量比较大,而当时使用的是关系型数据库。关系型数据库,存在于磁盘中,那么要到cpu中计算需要
cpu—catch —-内存—–磁盘
而磁盘的io性能较低,
关系型数据库的数据逻辑关系复杂,不是适合做大规模集群
解决思路
降低磁盘IO次数,越低越好
去除数据关系。
故出现了在内存中存储,且不存数据关系,这就是Nosql,泛指非关系型的数据库,是对关系型数据库的补充。
常见的Nosql数据库
redis,hbase,MongoDB,memcache
1.数据间没有必然的关联关系。
2.内部采用单线程机制进行工作。
3.高性能。
4.多数据类型支持 String,list, hash, set, sorted_set
5.持久化支持,可以进行数据灾难恢复
为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯
任务队列,秒杀,抢购,购票排队
即时信息查询,如各种排行帮,网站访问统计,公交到站信息,在线人数信息,设备信号等
时效信息控制,如验证码控制,投票控制
分布式数据共享,分布式集群架构中session分离
消息队列
分布式锁
信息添加
--设置Key,value 数据 --set key value set name zhangsan
信息查询
--查询命令 如果空值 查询出 nil值 --get key get name Copy
在window
--清除屏幕 clear Copy
获取命令帮助
--help 命令名 可以help 加群组 help get Copy
quit exit <ESC>
业务数据的特殊性
1.原始业务功能设计
秒杀
618活动
双十一
排队购票
2.运营平台监控到的突发高频访问数据
突发时政要闻,娱乐大瓜
3.高频复杂的统计数据
在线人数
投票排行榜
4.系统功能优化升级
单服务升级
对tocken的管理
Redis 是基于上述的功能需要设计出数据类型,推出了主要的5种数据类型。也是常用的五种数据类型,但其中数据类型并不止五种。
Redis 自身是一个Map,其中的所有数据都是采用Key:value的形式进行存储的
数据类型指的是存储的数据类型 Value部分,key部分永远都是字符串
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间一个数据
存储内容:字符串,若字符串按照整数的形式展示、可以作为数字操作使用
--添加修改数据 set key value --获取数据 get key --删除数据 del key --添加多个数据 mset key1 value1 key2 value2 key --获取多个数据 mget key1 key2 --获取数据字符个数 strlen key --追加信息,有就追加,没有就新建 append key value --键key不存在时将key的值设置为value 若存在则不变 setnx key value Copy
对于单数据操作和多数据操作,多数据操作节省,数据发送传递时间。
--增长指令,只有当value为数字时才能增长 incr key incrby key increment incrbyfloat key increment --减少指令,有当value为数字时才能减少 decr key decrby key increment Copy
按照数值进行操作,如果原始数据无法转换成数值,或超越了redis数值的上限范围,将报错。 9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)
--设置时间 为values秒过期 setex key seconds value --设置时间 为values毫秒过期 psetex key milliseconds value Copy
后续的向相同的key中放值 会覆盖他的值 和过期时间,
数据最大的存储量 512MB
场景一:“最强女生”,启动海选投票,只能通过微信投票,每个微信号每4个小时只能投1票。
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数。
key的设置约定,在数据库中的表明:主键名:主键值:字段名
key的设置约定,在数据库中的表明:主键名:主键值:字段名
对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
一个存储空间保存多个键值对数据,
底层使用哈希表结构实现数据存储
--添加数据 hset key field value --获取数据 hget key field hgetall key --删除数据 hdel key field Copy
hash操作实例
--添加多个 hmset key field1 value1 field2 value2 --获取多个 hmget key field1 field2 --获取哈希表中字段的数量 hlen key --获取哈希表中是否存在指定的字段 hexists key field Copy
hash操作实例2
--获取哈希表中所有的字段名或字段值 hkeys key hvals key --设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment --指定字段如果不存在,就增加,存在就不变, hsetnx key field value Copy
hash操作实例3
hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
每个hash可以存储232-1个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初中不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall操作可以获取全部属性,如果内部fiekd过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
将用户的id当成key
将商品编号当成 field
将商品购买数量当成 value,对value进行操作
取值 hget,
增加 hincrby
设值 hset
删除 hdel
全选 hgetall
总量 hlen
清空购物车 删除key
购物车模型
思考,当前设计是否增加购物车的呈现,
我们看上面的这张图时,我们主要看的商品信息,而不是数量,用户真正看的是,商品,然后再下单。商品的信息还要去查询数据库。
改进,我们将商品记录保存成两条field
field1:保存购买数量, value 数值
field2:保存用于购物车中显示的信息,文字,图片,商家
value json存储
不过一般购物车不持久化
抢购设计
商家id当成key
参与抢购的商品id当成field
参与抢购商品的数量当成value
抢购时使用降值得方式控制产品数量,
尽量不要让redis去做 业务是否存在得判断
String整体型,读为主
hash分块,更新比较灵活
数据存储需求:存储多个数据,并对数据进入存储空间得数据进行区分。
需要得存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
底层使用双向链表存储结构进行实现
--添加修改数据 左添加,右添加 lpush key value1 [value2] rpush key value1 [value2] --获取数据 lrange key start stop lindex key index llen key --获取并移除数据 lpop key rpop key Copy
List操作
体会一下左进得顺序。
规定时间获取并移除数据
blpop key1 [key2] timeout brpop key1 [key2] timeout Copy
再timeout 时间内取数据,有数据就取无数据就等待,
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息,如果取消点赞,移除对应好友信息。如果取消点赞,则移除指定数据
微信朋友圈
--移除指定数据 lrem key count value Copy
注意这个数量,因为队列中得数列可以有重复值故要制定其个数,l是left从左边开始删除,count的值为value的元素
list 中保存的数据都是string类型的,数据总容量是有限制的,最多232-1个元素(4294967295)
list具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,或以栈的形式进入栈出栈的操作
获取全部数据操作结束索引设置为-1
list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载
存储需求:存储大量数据,再查询方面提供更高的效率
需要的结构:能保存大量的数据结构,高效的内部的存储机制,便与查询。
set类型:与hash存储结构完全相同,仅存储键,不存储值,
--添加数据 sadd key member1 [member2] --获取全部数据 smembers key --删除数据 srem key member1 [member2] --获取集合数据总量 scard key --判断集合中是否包含指定数据 sismember key member Copy
捕获2
随机推荐
每位用户首次使用今日头条时会设置3项爱好的内容,但是后期为了增加用户的活跃度、兴趣点,必须让用户对其他信息类别产生兴趣,增加客户留存度,如何实现。
系统分析出各类最新的数据或最热的信息条目组成set集合
随机条选其中部分信息
配合用户关注的信息分类中的热点信息,组合抽取成全信息集合,例如:前6条你关注的第7条随机抽取的热点信息。
--随机获取集合中指定数量的数据 srandmember key [count] --随机获取集合中的某个数据并将该数据移出集合 spop key Copy
--求两个集合的交、并、差集 sinter key1 [key2] sunion key1 [key2] sdiff key1 [key2] --求两个集合的交并差集并存储到指定集合中 sinterstore destination key1 [key2] sunionstore destination key1 [key2] sdiffstore destination key1 [key2] --将指定数据从原始集合移动到目标集合中 smove source destination member Copy
set类型不允许数据重复,如果添加的的数据已经存在将只保存一份
权限控制
这个场景只为举例,具体的权限控制,有具体的权限框架。
解决方案
依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询
根据用户id获取用户所有角色
根据用户所有角色获取用户所有操作权限放入set集合
根据用户所有角色获取用户所有数据全选放入set集合
网站的访问数据
解决方案
利用set集合的数据去重,记录各种访问数据
建立String类型数据,利用incr统计日常访问量(PV)
建立set模型记录不同cookie(UV)
建立set模型,记录不同IP数量(IP)
存储需求:数据排序有利于数据的有效展示,需要一种可以提供自身特征进行排序的方式
存储结构,在set存储结构基础上添加可排序字段。根据排序字段进行排序。