Redis

孤人 提交于 2019-12-06 08:45:12

一,为什么要是用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>

五. redis 内存淘汰机制。
redis 提供 6 种数据淘汰策略:
1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的).
5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!