手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:yiiredis

yiiredis的一个小BUG

yiiredis是基于phpredis的一个YII组件。平时用的话确实也挺方便,但偶尔还是会有一些小BUG,比如说:
yiiredis自带了计数器的功能,嗯,它是调用了phpredis裏的代碼:
$counter = new ARedisCounter($key);
$counter->increment();  //表示每次加1
echo $counter->getValue();

這樣的代碼是沒有任何問題的,但問題卻出現在了:
$counter = new ARedisCounter($key);
echo $counter->getValue();

上面的代碼好象沒有任何問題?但就因為這樣寫,程序崩潰了。。
NND,你不先加1,就不能取$counter->getValue();
這尼瑪也太坑爹了吧。。。。。你好歹默認一個0嘛。

Tags: yiiredis

yiiredis不足之处

Yiiredis是Yii的一个插件。用来方便我们对redis进行操作。封装了一些常用的list,hash之类的操作,对于Cache也做了一个封装,但在方便之余,问题也还是不少。比如说,我们要对数据sort,取出平均值,取出最大值之类的。默认的方法就不能用了。虽然yiiredis的类用了Array的interface,但利用php的操作,总归不如redis自身的操作。

一些参考资料上就写的比较详细:

典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:

-列出前100名高分选手

-列出某用户当前的全球排名

这些操作对于Redis来说小菜一碟,即使你有几百万个用户,每分钟都会有几百万个新的得分。

模式是这样的,每次获得新得分时,我们用这样的代码

  1. ZADD leaderboard <score> <username> 

你可能用userID来取代username,这取决于你是怎么设计的。

得到前100名高分用户很简单:ZREVRANGE leaderboard 0 99。

用户的全球排名也相似,只需要:ZRANK leaderboard <username>。

看上去也比较方便,不过我没有仔细看究竟是因为phpredis的实现有问题还是yiiredis的问题。等晚上睡不着的时候看看伦家的源码先

 

Tags: yiiredis

Using Redis as a backend for Active Record

说白了,yiiredis中的AR功能的model其实就是一个hash,只是稍作封装了而已

官方有例子:

Using Redis as a backend for Active Record

It is possible to store active record like structures in redis using ARedisRecord.

Note: this is experimental functionality and may be subject to change

$record = ARedisRecord::model()->findByPk(1); // loads a record with a unique id of 1 $record->name = "a test name"; // sets the name attribute on the record $record->somethingElse = "some other value"; $record->save(); // saves the record to redis $record->delete(); // deletes the record from redis

不过,上面的例子不能直接拿来用,因为ARedisRecord是一个abstract类,所以你得写一个类继承于他才行。
顺便,如果用setAttributes的时候,记得加第二个参数(除非你写了rules),否则一定要加第二个参数,不然save不成功哦。
昨天被它折腾了好久才发现
----
笔记而已

Tags: redis, yiiredis, phpredis

开始启用Yii的redis插件

该死的command+左箭头。。。写了十分钟的东西全没了。
-------重新开始-----
由于目前的一个项目涉及到的数据库需要跨库跨表操作,而且该库会被频繁的插入、更新、删除,所以相对速度会较慢。但查询量又较大,在一台服务器的情况下,怎么办?分端口主从吧,意义不大,因为某些操作会导致CPU瞬间100%。
这时候我想到了key/value的数据库,想用它来做中间处理,比如大量的内容先经过它,再真正入库,毕竟我不需要过分实时,也不涉及到金钱交易。于是乎就在redis和mongo中间犹豫了。
在这期间咨询了三个人:老王(基于博客http://huoding.com/2012/02/29/146,基于Redis消息系统实现);11爷(redis有pub/sub功能);烂桔(mongo不太适用于单机,redis有内存模式)

基于上述原因,于是选择了redis,那么就开始我的Redis之旅吧
1、安装 Redis ,参考:http://library.linode.com/databases/redis/ubuntu-10.10-maverick(如果我没记错,这应该是11爷推荐的地址,他本来推荐的是Centos下的,但我用的是ubuntu,所以就参考这个了)
  先来三个常规操作

XML/HTML代码
  1. apt-get update  
  2. apt-get upgrade  
  3. apt-get install build-essential  

 完事之后,接着:

XML/HTML代码
  1. cd /opt/  
  2.     mkdir /opt/redis  
  3. wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz  
  4. tar -zxvf /opt/redis-2.4.8.tar.gz  
  5. cd /opt/redis-2.4.8/  
  6. make  

make完后做如下操作,将一些配置文件拷贝到/opt/redis目录下:

XML/HTML代码
  1. cp /opt/redis-2.4.8/redis.conf /opt/redis/redis.conf.default  
  2. cp /opt/redis-2.4.8/src/redis-benchmark /opt/redis/  
  3. cp /opt/redis-2.4.8/src/redis-cli /opt/redis/  
  4. cp /opt/redis-2.4.8/src/redis-server /opt/redis/  
  5. cp /opt/redis-2.4.8/src/redis-check-aof /opt/redis/  
  6. cp /opt/redis-2.4.8/src/redis-check-dump /opt/redis/  
  7. cp /opt/redis/redis.conf.default /opt/redis/redis.conf  

接着,更新/opt/redis/redis.conf:

XML/HTML代码
  1. daemonize yes  
  2. pidfile /var/run/redis.pid  
  3. logfile /var/log/redis.log  
  4.   
  5. port 6379  
  6. bind 127.0.0.1  
  7. timeout 300  
  8.   
  9. loglevel notice  
  10.   
  11. ## Default configuration options  
  12. databases 16  
  13.   
  14. save 900 1  
  15. save 300 10  
  16. save 60 10000  
  17.   
  18. rdbcompression yes  
  19. dbfilename dump.rdb  
  20.   
  21. dir /opt/redis/  
  22. appendonly no  

以上是linode里的配置,你可以参考一下做处理。大部分都一样,但timeout/loglevel/dir这三个参数不太一样。可以看着注释改一下。 linode 中有一个:glueoutputbuf yes ,这个在2.4.8下面会出错,所以我就没有启用它。
接着是加入启用脚本,既然linode有配置参考,那么它就有启动脚本,默认redis是没有给你这些启动脚本的,所以偷懒一下吧,下载linode的脚本:

XML/HTML代码
  1. cd /opt/  
  2. wget -O init-deb.sh http://library.linode.com/assets/630-redis-init-deb.sh  
  3. adduser --system --no-create-home --disabled-login --disabled-password --group redis  
  4. mv /opt/init-deb.sh /etc/init.d/redis  
  5. chmod +x /etc/init.d/redis  
  6. chown -R redis:redis /opt/redis  
  7. touch /var/log/redis.log  
  8. chown redis:redis /var/log/redis.log  
  9. update-rc.d -f redis defaults  

在这一步之后,你就可以直接用/etc/init.d/redis 来 start和stop redis服务了。

2、安装phpredis(https://github.com/nicolasff/phpredis)
在安装之前,先看readme:https://github.com/nicolasff/phpredis/blob/master/README.markdown
看完readme之后你会发现,原来一切是这样的简单啊
OK,先wget 回源代码,然后tar解开目录。。
接着3步搞定:

XML/HTML代码
  1. phpize  
  2. ./configure  
  3. make && make install  

速度超快,make install后,会告诉你redis.so生成在哪里,你将这extension=redis.so,加入到你的php.ini中即可。

3、下载YiiRedis项目。(由于我是用Yii的,所以直接用这个插件了,否则,还是参考一下phpredis的一些用法)
同样,在这里有readme:https://github.com/phpnode/YiiRedis/blob/master/README.md
项目地址:https://github.com/phpnode/YiiRedis(请自行下载)
使用方法也很简单,和db一样,在components下加一个组件:

XML/HTML代码
  1. "components" => array(  
  2.     "redis" => array(  
  3.         "class" => "packages.redis.ARedisConnection",  
  4.         "hostname" => "localhost",  
  5.         "port" => 6379  
  6.     ),  
  7.     //...  
  8. ),  

加完它之后就可以写上一段测试代码了:

PHP代码
  1. Yii::import("ext.yiiredis.*");  
  2. $list = new ARedisList("aNameForYourListGoesHere");  
  3. $list->add("cats");  
  4. $list->add("dogs");  
  5. $list->add("goods");  
  6. foreach($list as $i => $val) {  
  7.     print_r($val) ;  
  8.     echo "<br />";  
  9. }  
  10. $list->clear(); // delete the list  

直接输出在浏览器中。是不是很HIGH?
------
OK,就介绍到这里,请试用吧。

=------

备注:

$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE);   // don't serialize data
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);    // use built-in serialize/unserialize
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY);   // use igBinary serialize/unserialize

$redis->setOption(Redis::OPT_PREFIX, 'myAppName:'); // use custom prefix on all keys

由于redis默认不做序列化,因此如果要存储PHP的数据,如:数组、对象,那就必须用第二个setOption进行设置,以便 让数据自动序列化

Tags: redis, yiiredis, phpredis