一,为什么要是用Redis?(为什么要使用缓存)
主要从高性能和高并发两方面讨论
高性能:
当用户第一次访问数据库中的某些数据的时候,数据是从硬盘中获取的,速度比较慢,如果将数据存储到缓存中,下一次用户查数据时就可以直接从缓存中获取,而操作缓存,将相当于操作内存,速度非常快,如果数据 库中数据之后发生改变,同步改变缓存中的数据就可以了
高并发:
直接操作缓存的能够承受的请求是远远大于直接操作数据库的,如果将数据库中的一部分数据转存到缓存中,那么用户的一部分请求就会直接到缓存中查询数据,而不是数据库
二,为什么使用redis而不用map做缓存?
缓存分为本地缓存和分布式缓存。以Java为例,使用map和guava实现的属于本地缓存,最主要特点是轻量以及快速,生命随着JVM的销毁而结束,当有很多实例的时候,每个实例都需要为各自保存一份缓存,缓存不具有一致性
使用redis和memcached之类的成为分布式缓存,在多实例的情况下,各实例共用一份缓存,缓存具有一致性。缺点是需要保证redis或memcached服务的高可用,整个程序结构比较复杂。
三,redis和memcached的区别
redis支持跟丰富的数据类型,redis不仅仅支持简单的k/v类型的数据,同时还提供了list,set,hash,zset等数据结构的存储,memcached支持简单的数据类型String
redis支持数据的持久化,可以将内存中的数据存储到磁盘中,重启的时候能够再次加载进行使用,memecached的数据全部存储在内存中
集群模式:memcached没有原生的集群模式,需要依赖客户端实现集群中分片写入数据,但是redis目前是原生支持集群模式
memcached是多线程,非阻塞IO复用的网络模型,redis使用单线程的多路IO复用模型
四,redis常见数据结构以及使用场景分析
String:
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字,常规key-value缓存应用,常规计数:微博数,粉丝数等
Hash:
Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值,比如我们可以Hash数据结构来存储用户信息,商品信息等等
List:
list就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的list结构来实现
Redis list 的实现为一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,
另外可以通过lrang命令,就是从某个元素开始读取多少个元素,可以基于list实现分页查询,这个很棒的一个功能,基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能很高
Set:
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。
当你需要 存储一个列表数据,又不希望出现重复数据的时候,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于set轻易实现交集,并集,差集的操作
比如:zai微博应用中,可以将一个用户所有的关注人存在存在一个集合中,将其所有粉丝存在一个集合,Redis可以非常方便的实现如共同关注,共同粉丝,共同喜好等功能。这个过程也就是求交集的过程,具体命令如下:sinterstore key1 key2 key3 将交集存在key1内
ZSet:
和set相比,zset增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息等信息,适合使用Redis中的SortedSet结构进行存储
v>