php redis Hash 怎么通过 一个指定的value 查找到对应的 key 值

weer在2016-04-2112:05:25说道:

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系很有用;

phpredis扩展 phpredisadminphpredis扩展 phpredisadmin


phpredis扩展 phpredisadmin


if ($ok) {

如果对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大数据和小数据,另一种是按数据的冷热程度划分,分成冷数据和热数据,热数据是指读或写比较频繁的数据,反之则是冷数据。

可以举一些具体的例子来说明数据的大小和冷热属性。比如网站总的注册用户数,这明显是一个小而热的数据,小是因为这个数据只有一个值,热是因为注册用户数随时间变化很频繁。再比如,用户访问时间数据,这是一个量比较大,冷热不均的数据,大是数据的粒度是用户级别,每一个用户都有数据,如果有一千万用户,就意味着有一千万的数据,冷热不均是因为活跃用户的访问时间变化很频繁,但是可能有很大一部非活跃用户访问时间长时间不会发生变化。

大体而言,Redis 最适合处理的是小而热,而且是写频繁,或者读写都比较频繁的热数据。对于大而热的数据,如果其它方式很难解决问题,也可以考虑使用 Redis 解决,但是一定要非常谨慎,防止数据无限膨胀。原因如下:

首先,对于冷数据,无论大小,都不建议放在 Redis 中。Redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种浪费,冷数据放在普通的存储比如关系数据库中就好了。

其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到 Redis 中的。比如上面提到的网站总的注册用户数,就是典型的 Redis 用做计数器的例子。再比如最$result = $redis->set('9639002718',"comment"); // 设置键值新发表列表,报名列表,可以控制数量在几百到一千的规模,也是典型的 redis 做列表的使用方式。

另外,对于量比较大的热数据(或者冷热不均数据),使用 Redis 时一定要比较谨慎。这种类型数据很容易引起数据膨胀,导致 Redis 消耗内存巨大,让系统难以承受。薄荷的一个惨痛教训是把用户关注(以及被关注)数据放在 Redis 中,这是一种数据量极大,冷热很不均衡的数据,在几百万的用户级别就占用了近 10 GB左右内存,让 Redis 变得难以应付。应对这种类型的数据,可以用普通存储 + 缓存的方式。

如果用对了地方,比如在小而热的数据情形,Redis 表现很棒,如果用错了地方,Redis 也会带来昂贵的代价,所以使用时务必谨慎。

php频繁刷新网页运行一段时间后出现数据库连接错误?

回复 ↓

接,但是mysql有一个设置的连接数据,

linux中安装扩展出现问题怎么解决?

echo $result = $redis->get('9639002缓存过期时,通过 SetNX 获取锁,如果成功了,那么更新缓存,然后删除锁。看上去逻辑非常简单,可惜有问题:如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测:718'); // 获取键值

1、安装redisx0dx0ax0dx0a上传phpredis-2.2.4.tar.gz到/usr/local/src目录x0dx0acd /us这个可以看下你的mysql连接数据,如果设置小了可以调整大点!r/local/src #进入软件包存放目录x0dx0atar zxvf phpredis-2.2.4.tar.gz #解压x0dx0acd phpredis-2.2.4 #进入安装目录x0dx0a/usr/local/php/bin/phpize #用phpize生成configure配置文件x0dx0a./configure --with-php-config=/usr/local/php/bin/php-config #配置x0dx0amake #编译x0dx0amake install #安装x0dx0a安装完成之后,出现下面的安装路径x0dx0a/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/x0dx0a2、配置php支持x0dx0i /usr/local/php/etc/php.ini #编辑配置文件,在一行添加以下内容x0dx0a添加x0dx0aextension="redis.so"x0dx0a:wq! #保存退出x0dx0ax0dx0a3 重启服务x0dx0asudo serv nginx restartx0dx0asudo /etc/init.d/php-fpm restart

如何在CentOS 6.5上升级PHP版本

if 在 Redis 里,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候SET 涵盖了 SETEX 的功能,不会在发生雪崩了才设置,可以利用它来实现锁的效果,不过很多人没有意识到 SETNX 有陷阱!($ok) {

如果你的数据库搭建好了就简单了,用PHP来连接你的数据库!$link = mysql_connect('localhost','user','pwd');//你的数据库用户名和密码mysql_query('set names utf8'); 设置字符集mysql_select_db('db');//选择你的数据库$sql="这里是你的sql语句";mysql_query($sql);//发送sql语句mysql_close();//关闭连接

php redis 如何解决回复功能

随机数加的是value不是key

redis会将数据存储在内存中,断电丢失。这个要注意一大概是这样的,建议你去后盾人那学习最近他们在搞实训班培训的活动下,如有必要就做个持久化。持久化的方法一言难尽,可以参考网上的文章。

另外就是在程序里面一定要在程序结束的地方调用关闭连接mysql的方法,断开连接释放mysql的连接数

php的redis扩展叫php-redis。网上有php-redis的中文手册,下面给你一个示例:

$result = $redis->connect('127.0.0.1', 6379); // 6379是默认端口

// 没有提供获得所有键值的方法。下面这句我不确定是否能用,你可以试一试。

$all = $redis->getMultiple(array(''));

望采纳,谢谢支持!

PHP DUXCMS如何开启页面缓存

回复 $redis = new 不会发生雪崩redis();↓

1.页面缓存。页面缓存指之前加载过的页面以文件方式缓存在中,在一段时间内再次加载相同页面时无需重新执行页面逻辑直接加载静态页面。rubyPHP的页面缓存是自动进行的,在config/tpl.php中可配置是否启用缓存以及缓存文件的有效期。当然这仅仅是全局设置,在调用视图时可重新指定是否启用缓存以及缓存有效期。

如何在linux下安装redis及客户端的连接

}}$all = $redis->getMultiple(array('9639002718', '9639002718')); // 同时获得多个键值

1、安装编译工具2、安装tcl组件包(安装Redis需要tcl支持)3、安装Redis4、设置redis开机启动 5、设置redis配置文件参数6、回复 ↓测试redis数据库7、通过php程序连接redis数据库 #php必须先安装Redis扩展至此,Linux下Redis安装配置完成。转载,

redis setnx 是原子的吗

谈谈Redis的SETNX

比如说:某个查询数据库的接口,因为调用量比较大,所以加了缓存,并设定缓存过期后刷新,问题是当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,大量并发请求会穿透缓存直接查询数据库,造成雪崩效应,如果有锁机制,那么就可以控制只有一个请求去更新缓存,其它的请求视情况要么等待,要么使用过期的缓存。

下面以目前 PHP 社区里的 PHPRedis 扩展为例,实现一段演示代码:

$cache->update();

$redis->del($key);

$redis->multi();

$redis->setNX($key, $value);

$redis->expire($key, $ttl);

$redis->exec();

?>

因为 SetNX 不具备设置过期时间的功能,所以我们需要借助 Expire 来设置,同时我们需要把两者用 Multi/Exec 包裹起来以确保请求的原子性,以免 SetNX 成功了 Expire 却失败了。 可惜还有问题:当多个请求到达时,虽然只有一个请求的 SetNX 可以成功,但是任何一个请求的 Expire 却都可以成功,如此就意味着即便获取不到锁,也可以刷新过期时间,如果请求比较密集的话,那么过期时间会一直被刷新,导致锁一直有效。于是乎我们需要在保证原子性的同时,有条件的执行 Expire,接着便有了如下 Lua 代码:

local key = KEYS[1]

local value = KEYS[2]

local ttl = KEYS[3]

local ok = redis.call('setnx', key, value)

if ok == 1 then

redis.call('expire', key, ttl)

end

return ok

没想到实现一个看起来很简单的功能还要用到 Lua 脚本,着实有些麻烦。其实 Redis 已经考虑到了大家的疾苦,从 2.6.12 起,SET 涵盖了 SETEX 的功能,并且 SET 本身已经包含了设置过期时间的功能,也就是说,我们前面需要的功能只用 SET 就可以实现。

$ok = $redis->set($key, $value, array('nx', 'ex' => $ttl));

$cache->update();

$redis->del($key);

如上代码是完美的吗?是还一点!设想一下,如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值:

$ok = $redis->set($key, $random, array('nx', 'ex' => $ttl))启动iptables;

$cache->update();

if ($redis->get($key) == $random) {

$redis->del($key);

?>

如此基本实现了单机锁,如要实现分布锁,请参考:Distributed locks with Redis,不过分布式锁需要注意的地方更多:How to do distributed locking,Is Redlock safe。

此条目由老王发表在Technical分类目录,并贴了Redis标签。将固定链接加入收藏夹。

《谈谈REDIS的SETNX》上有21条评论

评论导航

较新评论 →

木子李在2015-09-1509:56:13说道:

伪代码:

$lock = 0

while($lock != 1){

$timestamp = time() + $timeout + 1;

$lock = SETNX(‘lock.foo’,$timestamp);

if($lock == 1 or (time() > (GET(‘lock.foo’) and time() > (GETSET(‘lock.foo’,timestamp))){

break;

}else{

sleep(10ms);

do_job()

# release

if(now() < GET('lock.foo')){

DEL('lock.foo');

}回复 ↓

robbinhan在2015-09-1611:35:41说道:

一个情况我认为其实也有问题,如果同时有很多请求,而每次请求都遇到了锁过期,但更新还没执行完的情况,也可能会产生雪崩吧

猫特在2016-02-1717:05:32说道:

frank在2015-10-3010:12:12说道:

lua脚本和种php实现有同样的隐患吧?能解释lua不会在设置过期时间前中断么

老王在2015-11-0317:17:53说道:

lua 脚本在 redis 中执行的时候是原子的,要成功都成功,要失败都失败,不会出现成功一部分的情况,所以没问题。

Pingback引用通告: [狗尾续貂第二篇]Redis内存锁的实现方法 - IT大道

tim在2016-03-0309:48:47说道:

一个情况也是有问题的

当key加了随机数之后,这个key就变成了另一个key了,这样每个请求生成的key就不一致了,那setnx 这个函数就没意义了。

jewelknife在2016-04-0615:06:16说道:

php脚步里面,加上条件判断后,再去更新过期时间,应该也没问题吧?

weer在2016-04-2112:07:53说道:

在加mutil的情况下

天涯逐梦在2016-05-2819:10:48说道:

不行,muti/exec模式,后一条命令不能依赖前一条命令的输出结果

的在2016-05-0617:19:54说道:

不错

Pingback引用通告: (转)谈谈Redis的SETNX - xwuxin

Pingback引用通告: [转]谈谈Redis的SETNX – 王春伟的技术博客

liaomengge在2016-05-2619:35:40说道:

一个情况如果没有iptables 可先进行安装升级 apt-get:

赵振佐在2016-10-0617:45:46说道:

这里的删除作还是需要的,不删除的话后续需要更新缓存的作就必须等到缓存失效才能做更新了

考虑下一个业务上的更新要求缓存失效更新其值为新的值的情况

因为有失效时间,设show variables like '%max_connections%';是5分钟,那5分钟之内只有一个更新请求会进来

windows怎么连接虚拟机上的redis

如果update时间很长,超过过期时间,此时,redis应该会自动帮你删除这个key吧,此时的手动删除,没任何意义吧!!!也会导致同样的问题,不知道我的理解正确不?个人觉得楼给出的,还是比较完善的,但是也会有这类问题。。。

1、首先确保虚拟机redis这样不会在5分钟之内有大量访问更新db的作,但会存在大量访问db作(目标缓存已经失效)安装成功并可以在单独虚拟机上进行set get存取值

$ok = $redis->setNX($key, $value);

2、本机连接虚拟机redis,确保虚拟机redis的 6379对外打开

modprobe ip_tables

iptables -A INPUT -p tcp -i 0 --dport 6379 -j ACCEPT

sudo apt-get install iptables

3、windows下安装phpredis模块 (注,本次用的php5.3 并且扩展是vc9编译的)