Memcache
使用多线程I/O 充分利用CPU多核优势
功能简单,使用内存存储
key不能超过250个字节
value不能超过1M
key最大失效期是30天
只支持K-V结构,不提供持久化和主从同步功能
Redis
Redis主要采用单线程模式处理请求
Redis支持持久化
支持多种数据类型。
- 五种基本的数据类型:K-V,List,Set,ZSet,Hash
- 三种特殊的数据类型:
- GeospatialL:地理位置
- Hyperloglog :技术统计
- Bitmap:位图
使用场景
- String:缓存功能、计数器、共享用户Session
- Hash:存对象(没有嵌入其他对象)产品属性单一,使用场景少
- List:粉丝列表、文章评论、命令Lrange基于list分页,基于Redis实现高性能分页、简单的消息队列
- Set(无序集合、去重):基于Redis Set的全局去重:微博的共同好友
- ZsSet(有序集合、去重):排行榜、热搜
Redis提供了主从同步机制,以及Cluster集群部署能力
应用场景:
Geospatial :
场景应用:可用于 实现 获取某个地点的坐标、计算两个地点的直接距离、某个地点坐标多少范围内的地点有哪些等等
(类似现实生活中的附近的人功能)
底层:Geospatial 底层其实是 zset 可以用zset命令操作geo
Hyperloglog:
场景应用: 比如用于统计 UV(网页访问量,一个人访问一个网站多次,但是还是算作一个人),容许误差。
优点: 占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的话 Hyperloglog 首选!
Bitmap:
场景应用: 统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用Bitmaps!
优点: Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
Redis是单线程的!!
明白Redis是很快的,官方表示,Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽
Redis是C语言写的,官方提供的数据为 100000+ 的QPS,完全不比Memcache差
Redis为什么单线程还这么快?
读取速度:CPU > 内存 > 硬盘
核心:redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率是最高的。
注意:多线程的话,和CPU调度有关,多线程会产生CPU上下文切换,是一个耗时的操作,对于内存系统来说,没有上下文切换效率就是最高的