简单了解下缓存

前言

部门培训的时候让我讲缓存,然而平时用缓存也比较少,这边特意整理下相关的资料,仅概念性的,不深入

一、什么是缓存

缓存就是数据交换的缓冲区,位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构。
软件中的缓存就是指,将会被频繁使用的数据保存到内存上,加快读取速度。

二、为什么要使用缓存

  1. 减少交互的通讯量——缓存数据能有效减少在进程和机器间的传输量
  2. 降低系统中的处理量——减少处理次数
  3. 降低需要做的磁盘访问次数——比如缓存在内存中的数据

IO的读写速度相对内存来说是比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上。

一般情况下,一个网站或者应用的形式是这样的,用户的请求通过用户层来到业务层,业务层再从数据层获取数据,返回给用户层。在用户量和数据量不大的情况下,这个系统运行得很顺畅。但是随着用户量越来越大,数据库中的数据越来越多,系统的响应速度就越来越慢。系统的瓶颈一般都在数据库访问上。


那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端由请求到达的时候,直接从内存中获取相应的数据,这样一来可以降低服务器的压力,二来,可以提高请求的响应速度,提升用户体验。

综上,使用缓存是为了提高系统运行速度,将用户频繁访问的内容存放在访问速度快的地方,来提高系统的响应速度。

三、缓存的属性

  1. 命中率
    命中率是指请求缓存次数和缓存返回正确结果次数的比例,比例越高,就证明缓存的使用率越高。

  2. 最大元素
    缓存中可以存放得最大元素得数量,一旦缓存中元素数量超过这个值,那么将会起用缓存清空策略,根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率,从而更有效的时候缓存。

  3. 清空策略

  • FIFO ,first in first out ,最先进入缓存得数据在缓存空间不够情况下被首先清理出去。
  • LFU , Less Frequently Used ,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。
  • LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

四、哪些数据需要被缓存

查询比较高的热点数据、可以允许丢失的。
比如:平台管理中的平台配置、配置文件里的配置项、热门文章、点赞、阅读数等。

五、实现缓存的方式

java应用的缓存分两种,一是进程内缓存,就是使用java应用的虚拟机内存来进行缓存;另一个是进程外缓存,比如:redis。

相比较而言,进程内缓存比进程外缓存快很多,而且编码也简单;但是,进程内缓存的存储量有限,使用的是java应用虚拟机的内存,而且每个应用都要存储一份,有一定的资源浪费。进程外缓存相比进程内缓存,会慢些,但是,存储空间可以横向扩展,不受限制。

5.1 进程内缓存

Ehcache
Cacheonix
ASimpleCache
JBoss Cache
Voldemort

5.2 进程外缓存

Redis
Mencached

六、ehcache

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
主要的特性有:

  1. 快速、简单,提供多种缓存策略
  2. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  3. 缓存数据会在虚拟机重启的过程中写入磁盘
  4. 可以通过RMI、可插入API等方式进行分布式缓存
  5. 具有缓存和缓存管理器的侦听接口
  6. 支持多缓存管理器实例,以一个实例的多个缓存区域

七、Redis

redis是一个远程内存数据库,可以存储键(key)与5种不同类型的值(value)之间的映射,可以将存储在内存中的键值对数据持久化到硬盘,可以使用复制特性扩展读性能,还可以使用客户端分片来扩展写性能。

主要的特性有:

  1. redis的数据完全存储在内存中,磁盘只用于持久性,所以redis的速度非常快;
  2. redis拥有较为丰富的数据类型;
  3. redis的操作都是原子性的,所以在异步的时候也是安全的;
  4. redis可以将数据复制到任意数量的从机。

7.1 redis数据类型

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增或者自减
LIST 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或者多个元素;根据值查找或者移除元素
SET 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围或者成员来获取元素

7.2 使用场景

STRING

String是最常用的一种数据类型,普通的key/value存储都可以使用此类型。比如分布式系统下,用户登录信息的共享,使用userguid

userid token

LIST

List就是链表,可以存储有先后顺序的数据,比如:文章列表、最新消息。也可以基于此实现消息队列。

msglist {msg1, msg2,...}

SET

与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。比如:用户关注

userid [followid1, followid2,...]

HASH

存储一些结构化的数据,比如:用户信息

userid {"name":"n", "age":"20"}

ZSET

sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如:文章热度排行

hot_article [(id1, 20), (id2, 30),...]

附录

测试代码:https://github.com/muyi911/px

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • 分布式缓存技术PK:选择Redis还是Memcached? 经平台同意授权转载 作者:田京昆(腾讯后台研发工程师)...
    meng_philip123阅读 68,926评论 7 60
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 原帖地址:https://www.jianshu.com/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul阅读 2,168评论 0 28
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,980评论 2 27
  • 过年意味着即将结束了一年,又将踏入新的一年,在过年那一天,妈妈们做在一起,边说边笑,而我们也可以轻轻松松的玩...
    郑潇榕阅读 249评论 0 1