1.一台远程服务器,通过sokect连接客户端,并向客户端提供缓存服务(缓存的数据结构类似Map)
2.为什么客户端不在本地用Map缓存数据,而需要一台独立的服务器做缓存?
1)因为分布式和集群概念兴起,一个应用,需要多台服务器协同工作,多台服务器意味着多个JVM
2)多个JVM意味着跨JVM,跨JVM意味着我们要如何保证不同JVM的本地缓存数据保持最终一致性?
3)为了绕开这个问题,redis另起炉灶做了个客户端共用的缓存服务器,并向多个客户端提供缓存服务
4)缓存服务器就类似一个远程Map,多个客户端向服务器发送读写命令,都是读写同一个Map里面的数据
3.redis缓存比本地缓存(Map)的优势
1)redis和Map一样,是key,value结构,而redis的key只支持string,value支持string,list,set,zset,hash
2)redis作为一个完整的缓存中间件,实现了很多实用的功能,而这些功能Map都是不具备的,若要具备,需要Map独立实现
3)例如持久化,zset排序功能,set并差集操作,string的自增功能,一些统计功能,以及一些缓存失效策略
4)读写命令操作都是原子操作,不需要像HashMap一样手动保证线程安全
5)支持分布式的数据分片功能,高可用的主从配置以及数据备份功能
4.redis和mysql的区别
1)redis追求性能的最大化,牺牲了一定的持久性,mysql追求数据的持久性,也牺牲了一定的性能
2)两者架构有些类似,也有不同,但是数据存放的架构模式类似:内存+磁盘
3)redis内存:操作的内存很大,空间容量单位为G,内存数据命中率很高,并且使用hash(key)方式定位数据,追求极致的性能
4)mysql内存:操作的内存很小,空间容量单位为M,内存数据命中率较低,并且使用B+树索引方式定位数据,放弃了部分性能追求
5)redis磁盘:redis的内存是按(key,value)结构组织的,有两种磁盘文件:RDB(复制内存数据的方式)和AOF(追加命令的方式)
5)mysql磁盘:mysql的行数据是按一定表结构组织的,所以数据的持久化是按一定结构进行整理保存的,并保证Commit的数据不会丢失