问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Redis 都有哪些应用场景?

发布网友 发布时间:2022-04-24 16:11

我来回答

3个回答

懂视网 时间:2022-04-28 15:35

$redis->connect('127.0.0.1', 6379);$strCacheKey = 'Test_bihu';

//SET 应用$arrCacheData = [	'name' => 'job',	'sex' => '男',	'age' => '30'];$redis->set($strCacheKey, json_encode($arrCacheData));$redis->expire($strCacheKey, 30); # 设置30秒后过期$json_data = $redis->get($strCacheKey);$data = json_decode($json_data);
print_r($data->age); //输出数据

//HSET 应用$arrWebSite = [	'google' => [		'google.com',		'google.com.hk'
	],
];$redis->hSet($strCacheKey, 'google', json_encode($arrWebSite['google']));$json_data = $redis->hGet($strCacheKey, 'google');$data = json_decode($json_data);
print_r($data); //输出数据复制代码

简单队列实战

$redis->connect('127.0.0.1', 6379);$strQueueName = 'Test_bihu_queue';

//进队列$redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job']));$redis->rpush($strQueueName, json_encode(['uid' => 2,'name' => 'Tom']));$redis->rpush($strQueueName, json_encode(['uid' => 3,'name' => 'John']));echo "---- 进队列成功 ---- <br /><br />";

//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);

//出队列$redis->lpop($strQueueName);echo "<br /><br /> ---- 出队列成功 ---- <br /><br />";

//查看队列$strCount = $redis->lrange($strQueueName, 0, -1);echo "当前队列数据为: <br />";
print_r($strCount);复制代码

简单发布订阅实战

//以下是 pub.php 文件的内容 cli下运行
ini_set('default_socket_timeout', -1);$redis->connect('127.0.0.1', 6379);$strChannel = 'Test_bihu_channel';

//发布$redis->publish($strChannel, "来自{$strChannel}频道的推送");echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>";$redis->close();复制代码
//以下是 sub.php 文件内容 cli下运行
ini_set('default_socket_timeout', -1);$redis->connect('127.0.0.1', 6379);$strChannel = 'Test_bihu_channel';

//订阅echo "---- 订阅{$strChannel}这个频道,等待消息推送...---- <br/><br/>";$redis->subscribe([$strChannel], 'callBackFun');function callBackFun($redis, $channel, $msg)
{
	print_r([		'redis' => $redis,		'channel' => $channel,		'msg' => $msg
	]);
}复制代码

简单计数器实战

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_comments';

//设置初始值$redis->set($strKey, 0);$redis->INCR($strKey); //+1$redis->INCR($strKey); //+1$redis->INCR($strKey); //+1$strNowCount = $redis->get($strKey);echo "---- 当前数量为{$strNowCount}。 ---- ";复制代码

排行榜实战

$redis->connect('127.0.0.1', 6379);$strKey = 'Test_bihu_score';

//存储数据$redis->zadd($strKey, '50', json_encode(['name' => 'Tom']));$redis->zadd($strKey, '70', json_encode(['name' => 'John']));$redis->zadd($strKey, '90', json_encode(['name' => 'Jerry']));$redis->zadd($strKey, '30', json_encode(['name' => 'Job']));$redis->zadd($strKey, '100', json_encode(['name' => 'LiMing']));$dataOne = $redis->ZREVRANGE($strKey, 0, -1, true);echo "---- {$strKey}由大到小的排序 ---- <br /><br />";
print_r($dataOne);$dataTwo = $redis->ZRANGE($strKey, 0, -1, true);echo "<br /><br />---- {$strKey}由小到大的排序 ---- <br /><br />";
print_r($dataTwo);复制代码

简单字符串悲观锁实战

解释:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观。

每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。

场景:如果项目中使用了缓存且对缓存设置了超时时间。

当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,

大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。

/**
 * 获取锁
 * @param String $key 锁标识
 * @param Int $expire 锁过期时间
 * @return Boolean
 */
public function lock($key = '', $expire = 5) {	$is_lock = $this->_redis->setnx($key, time()+$expire);
	//不能获取锁	if(!$is_lock){
		//判断锁是否过期		$lock_time = $this->_redis->get($key);
		//锁已过期,删除锁,重新获取		if (time() > $lock_time) {
			unlock($key);			$is_lock = $this->_redis->setnx($key, time() + $expire);
		}
	}	return $is_lock? true : false;
}

/**
 * 释放锁
 * @param String $key 锁标识
 * @return Boolean
 */
public function unlock($key = ''){	return $this->_redis->del($key);
}

// 定义锁标识$key = 'Test_bihu_lock';

// 获取锁$is_lock = lock($key, 10);if ($is_lock) {	echo 'get lock success<br>';	echo 'do sth..<br>';
	sleep(5);	echo 'success<br>';
	unlock($key);
} else { //获取锁失败	echo 'request too frequently<br>';
}复制代码

简单事务的乐观锁实战

解释:乐观锁(Optimistic Lock), 顾名思义,就是很乐观。

每次去拿数据的时候都认为别人不会修改,所以不会上锁。

watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。

也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。

注意watch的key是对整个连接有效的,事务也一样。

如果连接断开,监视和事务都会被自动清除。

当然了exec,discard,unwatch命令都会清除连接中的所有监视。

$strKey = 'Test_bihu_age';$redis->set($strKey,10);$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>";$redis->watch($strKey);

// 开启事务$redis->multi();

//在这个时候新开了一个新会话执行$redis->set($strKey,30); //新会话echo "---- Current Age:{$age} ---- <br/><br/>"; //30$redis->set($strKey,20);$redis->exec();$age = $redis->get($strKey);echo "---- Current Age:{$age} ---- <br/><br/>"; //30

//当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败复制代码

Thanks ~


推荐教程:《php教程》

热心网友 时间:2022-04-28 12:43

缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。

共享Session:对于一些依赖 session 功能的服务来说,如果需要从单机变成集群的话,可以选择 redis 来统一管理 session。

消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功 能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功 能基本可以满足。比如在分布式爬虫系统中,使用 redis 来统一管理 url队列。

分布式锁:在分布式服务中。可以利用Redis的setnx功能来编写分布式的锁,虽然这个可能不是太常用。
当然还有诸如排行榜、点赞功能都可以使用 Redis 来实现,但是 Redis 也不是什么都可以做,比如数据量特别大时,不适合 Redis,我们知道 Redis 是基于内存的,虽然内存很便宜,但是如果你每天的数据量特别大,比如几亿条的用户行为日志数据,用 Redis 来存储的话,成本相当的高。


------------------------------------------------


缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。

共享Session:对于一些依赖 session 功能的服务来说,如果需要从单机变成集群的话,可以选择 redis 来统一管理 session。

消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功 能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功 能基本可以满足。比如在分布式爬虫系统中,使用 redis 来统一管理 url队列。

分布式锁:在分布式服务中。可以利用Redis的setnx功能来编写分布式的锁,虽然这个可能不是太常用。 当然还有诸如排行榜、点赞功能都可以使用 Redis 来实现,但是 Redis 也不是什么都可以做,比如数据量特别大时,不适合 Redis,我们知道 Redis 是基于内存的,虽然内存很便宜,但是如果你每天的数据量特别大,比如几亿条的用户行为日志数据,用 Redis 来存储的话,成本相当的高。

热心网友 时间:2022-04-28 14:01

redis适合什么场景
1、缓存。 缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。(推荐:《 Redis视频教程 》)
2、排行榜。 很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。
3、计数器。 什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。
4、分布式会话。 集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
5、分布式锁。 在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
万能粉碎机清洁规程 中药粉碎机如何清洗比较好 磨粉机能用水洗吗 正确的家用粉碎机清洗方法 粉碎机清洗不干净粉碎机怎么清洗才干净 励志语句长句精选123句 caxa如何保存图幅模板 美迪特MDT-IN158重要参数 打玻尿酸已一个月眼睛疼,会不会打玻尿酸一个月,突然眼睛疼会不会... 玻尿酸失明概率真的小吗-玻尿酸失明有光感还能恢复吗 陈华军人物简介 能够用qq登录的软件有哪些? 怎样查看redis使用配置文件 如何查看redis最近使用的命令 redis的五种数据类型是什么? 厨柜门用UV板好还是烤漆板好 橱柜门板用烤漆的好还是亚克力的好 烤漆板__木_粒的_比 什么是烤漆板 橱柜的烤漆板和吸塑板有什么区别啊 什么是烤漆门板?有什么特点? 烤漆板与吸塑板有什么区别? 实木烤漆板和生态板的区别是什么? UV门板与烤漆门板有什么区别? 实木烤漆板和烤漆板有什么区别 家里装修想用白色烤漆板,白色烤漆板的特性是什么? 买家具,是免漆板的好,还是烤漆的好呀? 什么是烤漆板?烤漆板有什么优缺点?该如何选购和保养 西瓜怎么吃最甜 想要提高西瓜甜度,应该怎么做呢? 西瓜能做什么甜品 能登陆qq的软件,除了qq软件还有哪些? Redis是什么,用来做什么 除了腾讯QQ软件,还能用什么软件登陆QQ啊! 所有软件都可以用QQ登录吗? redis怎么用?前景如何? 为什么其他软件都可以用qq登录 为什么要使用Redis QQ国际版可以用来登录其他软件么? Redis目前在绝大多数的项目中扮演怎样的角色 沧州的特产有哪些? 沧州有什么特色 好吃的东西吗 凉拌土豆丝好吃吗? 沧州有什么好吃好玩的呀? 凉拌土豆丝最正宗的做法 凉拌土豆丝都哪些家常做法?可以放芥末吗? 怎么在设置的文本框里打字 怎样在文本框中输入多个文字? 凉拌土豆丝做法大全家常 文本框怎么打字 在文本框中如何输入箭头符号