redis 数据缓存技术

最近在研究数据缓存技术,了解缓存技术什么?有什么优势?有什么劣势?怎么去使用缓存技术?
我主要研究的产品是redis 缓存技术(因为网上好多人都说redis 比 memcahed 好,因为支持读写分离和集群)

缓存技术是什么?
传统的数据存储是将数据存储到磁盘上的一种持久化存储(比如Mysql),而redis 是将数据存储在内存当中。

有什么优势?
读写性能上,在内存中读写数据比在磁盘上读写数据快的多,支持的迸发量也大得多(大多数服务宕机,首先的原因就是数据库挂了,将数据存储到内存当中,在内存上读写数据消耗的性能比直接向磁盘上读写数据消耗的性能小)

有什么劣势?
一旦存储的键值对数据超出了内存的大小(内存溢出)或其它原因导致redis宕机了(可能是物理原因,也可能是连接数太多,也可能是迸发量超高的时候redis的读写性能消耗殆尽了)会导致redis的数据丢失或脏数据的情况。

怎么去使用缓存技术?
个人觉得敏感的数据读写还是在磁盘上进行,不敏感的数据可以酌情的做redis数据缓存(比如新闻发布系统中,新闻内容不需要实时更新的数据。投票系统中每个选手的票数每隔3分钟从数据库中同步一次)。当然针对于敏感的数据,如果在写的时候(更新操作)每次都是先写持久化数据层,然后再回过来变更缓存层也是可以的,也能保证数据的实时安全性。

以下实例均为实际测试内容
服务器端环境 linunx + nginx + php-fpm + mysql + redis

pconnect("127.0.0.1",6379);
$redis->auth("xxxxx");


$key = "test";
$test = $redis->get("test");
if($redis->exists($key) && !empty($test))
{
    echo $test;
}else{
    $redis->set($key,"test_data",5);
    echo "save test key success";
}

$redis->del($key);

//$redis->exists("name")
/*
if($redis->exists("name") && $redis->get("name"))
{
    echo $redis->get("name");
}else{
    $redis->set("name","谭勇");
    echo "save success";
}

$age = $redis->get("age");

if(empty($age))
{
	echo "age is empty";
}

echo $age;
*/
?>

上面的代码我运行了 20多次左右,第一次运行的时候redis 服务显示有两个连接。然后后面多次重复运行,就稳定在了40个链接数上。 为什么呢?我检查了下原因,因为我的php-fpm 进程有21个,其中一个进程是守护进程,不对php代码进行解析。
也就是说一个php-fpm连接了两个redis连接,为啥呢?为啥不是一个连接?查了些资料,我采用的连接redis 的方法是pconnect 长链接模式,第一次请求到php-fpm后创建了redis 连接,当程序执行完毕后,redis连接并不会被释放,而是由php-fpm进程去维护这两个连接,一个连接是数据通道(与redis进行数据交互用的),一个连接是守护连接,检测当前数据通道是否超时断连。一旦超时断连,那么下次服务器发起redis连接请求后,就会重新开一个redis连接。
redis 数据缓存技术_第1张图片
这样就减少了与redis数据库在创建连接的过程中所产生的消耗,提升了使用性能。

再来谈谈如何去使用redis,何时去使用redis。

  • 某次请求,首先从redis中查询是否有个对应键值的数据,如果有就返回。如果没有执行下一步
  • 如果redis没有返回数据,那么就去数据库中查询对应数据,查询出来后,缓存进redis,并设置生命周期,并返回数据。

看到这个流程步骤我想你应该对实际线上的业务需求应该有一个了解了,怎么去使用这款产品了。因为很多的应用对读的要求很高,反而对些的要求不高。

redis 数据缓存技术_第2张图片

你可能感兴趣的:(技术开发文档)