21.0 Redis
本地缓存,当前进程的内存,把数据存起来,下次直接用,可以提升效率
1 容量有限,window下面,32位一个进程最多2G,或者3G 64位最多也就4G
2 多服务器直接需要缓存共享
需要分布式缓存---远程服务器内存管理数据,提供读写接口,效率高
分布式缓存:Memcached 最早流行
Nosql--Redis 主流方案
NoSql:非关系型数据库,Not Only Sql
web1.0--服务端提供数据客户端看,只能看新闻
web2.0--客户端可以向服务端互动了,还能评论了(。。。。)
数据的关系复杂:好友关系(张三有100个好友,映射表,其实就冗余了,关系型数据开始累赘)
再就是数据读取和写入压力,硬盘的速度满足不了,尤其是一些大数据量
所以产生了NoSql了,
特点:基于内存;
没有严格的数据格式,不是一行数据的列必须一样
丰富的类型,满足web2.0的需求
Redis:REmote DIctionary Server 远程字典服务器
基于内存管理(数据存在内存),实现了5种数据结构(分别应对各种具体需求),单线程模型的应用程序(单进程单线程),对外提供插入-查询-固化-集群功能
Redis-----SqlServer
redis-cli---SqlClient
REDIS支持N多个命令---Sql语句
RDM---可视化SQLClient
ServiceStack(1小时3600次请求--可破解)----Ado.Net
StackExchange 免费
其实更像ORM,封装了链接+命令
基于内存管理:速度快!不能当数据库; Redis还有个固化数据的功能,VitualMemory,把一些不经常访问是会存在硬盘 可以配置的;down掉会丢失数据,snapshot可以保存到硬盘,
AOF:数据变化记录日志,很少用
Redis毕竟不是数据库,只能用来提升性能,不能作为数据的最终依据
5种数据结构,分别应对各种具体需求,下文详细分解
多线程模型:.Net应用都是的,尤其网站,可以更好的发挥硬件的能力,
但是也有线程冲突的问题和调度的成本
单线程模型:nodejs单线程,整个进程只有一个线程,线程就是执行流,性能低?实际上并非如此!一次网络请求操作==正则解析请求+加减乘除计算+数据库操作(发命令--等结果)+读文件(发命令--等结果)+调用接口(发命令---等结果),单线程都是事件驱动,发起命令就做下一件事儿,这个线程是完全不做等待的,一直在计算,单线程非常高;
单线程多进程的模式来提供集群服务
单线程最大的好处就是原子性操作,就是要么都成功,要么都失败,不会出现中间状态
redis每个命令都是原子性(因为单线程),不用考虑并发,不会出现中间状态
Redis就是为开发而生,会为各种开发需求提供对应的解决方案
只是为了提升性能,不做数据标准! 任何的数据固化都是数据库完成的,不能代替数据库
五大结构理解:
String: key-value的缓存,支持过期 value不超过512M
Redis是单线程的,比如SetAll&AppendToValue&GetValues&GetAndSetValue&IncrementValue&IncrementValueBy,这些看上去是组合命令,但实际上是一个具体的命令,是一个原子性的命令,不可能出现中间状态,可以应对一些并发情况
Hash:key--Dictionary,1 节约空间(zipmap的紧密摆放的存储模式)
2 更新/访问方便(hashid+key)
Hash数据很像关系型数据库的表的一行数据,
但是字段是可以随意定制的,没有严格约束的,非常灵活
Set:就是数据集合,无序,去重
ZSet:是一个有序集合,去重
List 分页
队列,生产者消费者,一个数据,只有一个消费对象
一个程序写入,一个程序即时读取消费
还可以多个程序读取消费
按照时间顺序,数据失败了还可以放回去下次重试
这种东西,在项目中有什么价值呢?!
发布订阅:发布一个数据,全部的订阅者都能收到
1 List结构
2 分布式异步队列
3 发布订阅