快捷搜索:  汽车  科技

缓存和中间件的区别:一篇文章教你搞定缓存中间件

缓存和中间件的区别:一篇文章教你搞定缓存中间件$ wget http://download.redis.io/releases/redis-4.0.10.tar.gz $ tar xzf redis-4.0.10.tar.gz $ cd redis-4.0.10 $ make(2)启动redis服务下载地址:http://redis.io/download (1)下载并安装:优点:缺点: redis(ACID)处理非常简单

MemCached总结有福利

1、MemCached介绍
MemCached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。它便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题,本质上,它是一个简洁的key-value存储系统

2、MemCached工作原理
主要通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度。见下图:

缓存和中间件的区别:一篇文章教你搞定缓存中间件(1)

1、Redis简介

Redis 是完全开源免费的,是一个高性能的key-value数据库。

是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求。

优点:

  • 对数据高并发读写
  • 对海量数据的高效率存储和访问
  • 对数据的可扩展性和高可用行

缺点:

redis(ACID)处理非常简单

  • 无法做到太复杂的关系数据库模型
  • Redis 是以key-value store存储,data structure service 数据结构服务器,键可以包含:(string)字符串、哈希、链表(list)、(set)集合。(Zset)有序集合。这些数据结合都支持pysh/pop、add/remove
2、Linux下安装Redis

下载地址:http://redis.io/download
(1)下载并安装:

$ wget http://download.redis.io/releases/redis-4.0.10.tar.gz $ tar xzf redis-4.0.10.tar.gz $ cd redis-4.0.10 $ make

(2)启动redis服务

$ cd src $ ./redis-server

(3)使用redis客户端

$ cd src $ ./redis-cli redis> set companyName G7 OK redis> get companyName "G7"3、Java使用Redis

import redis.clients.jedis.Jedis; import java.util.*; /** * Created by pc on 2018/7/23. * Redis数据类型 */ public class RedisDemo { //String public static void redisString(){ //连接 Redis 服务 System.out.println("连接成功"); //查看服务是否运行 System.out.println("Server is running: " jedis.ping()); //设置 redis 字符串数据 jedis.set("runoobkey" "www.runoob.com"); // 获取存储的数据并输出 System.out.println("redis 存储的字符串为: " jedis.get("runoobkey")); } //l ist public static void redisList(){ //连接 Redis 服务 Jedis jedis = new Jedis("172.16.*.**" 6379); System.out.println("连接成功"); //存储数据到列表中 jedis.lpush("site-list" "Baidu"); jedis.lpush("site-list" "Google"); jedis.lpush("site-list" "Taobao"); // 获取存储的数据并输出 List<String> list = jedis.lrange("site-list" 0 2); for(int i=0; i<list.size(); i ) { System.out.println("列表项为: " list.get(i)); } } //set public static void redisSet(){ //连接 Redis 服务 Jedis jedis = new Jedis("172.16.*.**" 6379); System.out.println("连接成功"); //存入set的值 Long mySet = jedis.sadd("websites" "Baidu" "Taobao" "Google"); //获取set的值 Set<String> website = jedis.smembers("websites"); Iterator<String> it = website.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } //hash public static void redisHash(){ //连接 Redis 服务 Jedis jedis = new Jedis("172.16.*.**" 6379); System.out.println("连接成功"); Map<String String> hashMap = new HashMap<>(); hashMap.put("Baidu" "www.baidu.com"); hashMap.put("Taobao" "www.taobao.com"); hashMap.put("Google" "www.google.com"); jedis.hmset("website" hashMap); System.out.println(jedis.hgetAll("website")); } public static void main(String[] args) { redisString(); // redisList(); // redisSet(); // redisHash(); } }

运行后,如下图:

缓存和中间件的区别:一篇文章教你搞定缓存中间件(2)

4、Redis缓存策略

(比较常用的缓存策略,同样这也是facebook的缓存策略:
1. 读:应用程序从cache中取数据,取到后返回。
2. 读:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
3. 增删改:先把数据存到数据库中,成功后,再让缓存失效。
这里针对第3点,会有一些其他的用法,乍一看都是很正常的,但后来细细一想其实都是有问题的。
比如(1)“先更新redis,然后更新DB”
(2)“先更新DB,然后更新缓存”
(3)“先删除缓存,然后再更新数据库”

5、有问题的几种更新缓存策略

(1)先更新缓存,然后更新DB。见下图

缓存和中间件的区别:一篇文章教你搞定缓存中间件(3)

从图中可以看出,两个并发写操作,由于某些原因(io阻塞,cpu时间片分配,协程调度,网络原因等等),导致Thread2的更新DB晚于Thread1的更新DB,但是Redis中此时的数据Thread1的,而DB中的数据时Thread2的,这就出现了不一致的问题,DB中是脏数据

(2)先更新DB,然后更新缓存。见下图:

缓存和中间件的区别:一篇文章教你搞定缓存中间件(4)

从图中可以看出,两个并发写操作,由于某些原因导致Thread2的更新Redis晚于Thread1的更新Redis ,但是DB中此时的数据Thread1的,而Redis中的数据时Thread2的,这就出现了不一致的问题

(3)先删除缓存,然后再更新数据库。见下图:

缓存和中间件的区别:一篇文章教你搞定缓存中间件(5)

两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,会把老数据读出来后放到缓存中,然后更新操作更新了DB。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的

(4)先数据库,成功之后,让缓存失效,下次请求时从缓存中拿不到,则查询数据库,再放入缓存。见下图:

缓存和中间件的区别:一篇文章教你搞定缓存中间件(6)

这种更新策略是我们实际最常用的,但也可能出现问题。实际上出现问题的概率可能非常低,因为这个条件需要发生在读缓存时缓存失效,而且并发着有一个写操作。而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。

6、Redis与MemCached的区别

传统MySQL Memcached架构遇到的问题

  实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

  1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。

  2.Memcached与MySQL数据库数据一致性问题。

  3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。

  4.跨机房cache同步问题。

  众多NoSQL百花齐放,如何选择

  最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短

总结;文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

不积跬步无以至千里,学习C/C ,Linux,Nginx,golang,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,ffmpeg,流媒体, 音视频,CDN,P2P,K8S,Docker,Golang TCP/IP,协程,嵌入式,ARM,DPDK等等。。。

可以后台私信‘资料’即可领取相关学习资料

猜您喜欢: