概述
/// 缓存优化性能,降低负载
/// 1 本地缓存空间有限,也无法共享 所以需要分布式缓存:memcached/redis
/// 2 NoSQL:泛指非关系型数据库,web2.0 网站越来越复杂,流量越来越高 数据量越来越大,数据不再是严格的关系型的
/// NoSQL不是严格的面向对象式,类型(key-value hashtable list set)更灵活,
/// 而且通常用内存管理,速度也更快
///
/// REDIS: REmote DIctionary Server 远程字典(内存)服务器
/// 基于内存管理(数据全部存在内存),实现了多种数据结构的,单线程模型的应用程序,提供插入-查询-固化-集群功能
///
/// 内存管理:速度快,数据可能丢失,只能做缓存,而不是存储
/// redis有两种固化到硬盘的方式,
/// snapshot(常用的,类似于快照),速度快,但是可能丢失一段数据
/// 例如数据库可以配置一些自动保存策略:1分钟只要有修改就保存 30分钟 修改多少次就保存
/// save/bgsave 主动save阻塞(单线程) bgsave非阻塞(子进程)的
/// AOF:通过日志来恢复数据,任何操作都需要日志,这个效率太低;数据不会丢失;
///
/// 多种数据结构:string hashtable set zset list 丰富的数据结构带来了灵活性,可以应对特殊的应用场景
///
/// 单线程:线程安全 web就是多线程 sqlserver多线程 memcached多线程的
/// 多线程可以提升性能,充分利用硬件资源
/// nodejs redis 单线程
/// Redis:内存数据结构操作,很长的链表,如果多个线程同时来操作,
/// 为了保证线程安全,不得不加锁,锁多了之后,多线程没有优势,甚至可能更低
/// 全部是内存操作,其实一个线程就够快了,
/// (单线程的性能极致是要输给多线程的,CPU调度时,同一进程的线程切换肯定切换进程快)
/// 原子性:因为全程只有一个线程可以操作数据,完全没有冲突的概念
/// 就是一个不可分割的整体,要么都成功,要么都失败,不会出现中间状态
///
/// Redis每一个命令都是原子性的
///
/// VirtualMemory:Redis会自动把一些冷门数据存到硬盘,可以存储超过内存的数据
作为缓存数据库来使用
这样分三层–配置,基类,每种数据结构相对应的具体服务
key-value:单线程,
实际应用:秒杀程序
//key-value局限性:一个对象序列化保存–读出来反序列化–修改—序列化保存
//空间浪费问题:默认空间 即使value就是一个1 也要那么多空间
//缓存用户id-name
hashtable:一个解决序列化的问题
//可以更节约内存空间,一个hash保存多个key-value IdNameMapping----id-name
Set:key-List 去重 用户ip记录; 关键词;
实际应用:共同好友 共同关注
ZSet:去重 而且自带排序
实际应用:排行榜/统计全局排行榜
list:内存操作,分页 最新微博 最新评论 最近登录用户(一个list可以放入2的32次方 20亿条数据)
又可以分为栈和队列
队列实现生产者,消费者
类似于rabitmq,实现一个消息队列