浏览模式: 标准 | 列表Tag:yiiredis
Submitted by gouki on 2012, July 11, 3:39 PM
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
PHP | 评论:0
| 阅读:14395
Submitted by gouki on 2012, June 5, 9:23 PM
Yiiredis是Yii的一个插件。用来方便我们对redis进行操作。封装了一些常用的list,hash之类的操作,对于Cache也做了一个封装,但在方便之余,问题也还是不少。比如说,我们要对数据sort,取出平均值,取出最大值之类的。默认的方法就不能用了。虽然yiiredis的类用了Array的interface,但利用php的操作,总归不如redis自身的操作。
一些参考资料上就写的比较详细:
典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:
-列出前100名高分选手
-列出某用户当前的全球排名
这些操作对于Redis来说小菜一碟,即使你有几百万个用户,每分钟都会有几百万个新的得分。
模式是这样的,每次获得新得分时,我们用这样的代码
- ZADD leaderboard <score> <username>
你可能用userID来取代username,这取决于你是怎么设计的。
得到前100名高分用户很简单:ZREVRANGE leaderboard 0 99。
用户的全球排名也相似,只需要:ZRANK leaderboard <username>。
看上去也比较方便,不过我没有仔细看究竟是因为phpredis的实现有问题还是yiiredis的问题。等晚上睡不着的时候看看伦家的源码先
Tags: yiiredis
PHP | 评论:0
| 阅读:16336
Submitted by gouki on 2012, March 13, 9:28 AM
说白了,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
PHP | 评论:0
| 阅读:15159
Submitted by gouki on 2012, March 11, 11:07 AM
该死的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代码
- apt-get update
- apt-get upgrade
- apt-get install build-essential
完事之后,接着:
XML/HTML代码
- cd /opt/
- mkdir /opt/redis
- wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz
- tar -zxvf /opt/redis-2.4.8.tar.gz
- cd /opt/redis-2.4.8/
- make
make完后做如下操作,将一些配置文件拷贝到/opt/redis目录下:
XML/HTML代码
- cp /opt/redis-2.4.8/redis.conf /opt/redis/redis.conf.default
- cp /opt/redis-2.4.8/src/redis-benchmark /opt/redis/
- cp /opt/redis-2.4.8/src/redis-cli /opt/redis/
- cp /opt/redis-2.4.8/src/redis-server /opt/redis/
- cp /opt/redis-2.4.8/src/redis-check-aof /opt/redis/
- cp /opt/redis-2.4.8/src/redis-check-dump /opt/redis/
- cp /opt/redis/redis.conf.default /opt/redis/redis.conf
接着,更新/opt/redis/redis.conf:
XML/HTML代码
- daemonize yes
- pidfile /var/run/redis.pid
- logfile /var/log/redis.log
-
- port 6379
- bind 127.0.0.1
- timeout 300
-
- loglevel notice
-
- ## Default configuration options
- databases 16
-
- save 900 1
- save 300 10
- save 60 10000
-
- rdbcompression yes
- dbfilename dump.rdb
-
- dir /opt/redis/
- appendonly no
以上是linode里的配置,你可以参考一下做处理。大部分都一样,但timeout/loglevel/dir这三个参数不太一样。可以看着注释改一下。 linode 中有一个:glueoutputbuf yes ,这个在2.4.8下面会出错,所以我就没有启用它。
接着是加入启用脚本,既然linode有配置参考,那么它就有启动脚本,默认redis是没有给你这些启动脚本的,所以偷懒一下吧,下载linode的脚本:
XML/HTML代码
- cd /opt/
- wget -O init-deb.sh http://library.linode.com/assets/630-redis-init-deb.sh
- adduser --system --no-create-home --disabled-login --disabled-password --group redis
- mv /opt/init-deb.sh /etc/init.d/redis
- chmod +x /etc/init.d/redis
- chown -R redis:redis /opt/redis
- touch /var/log/redis.log
- chown redis:redis /var/log/redis.log
- 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代码
- phpize
- ./configure
- 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代码
- "components" => array(
- "redis" => array(
- "class" => "packages.redis.ARedisConnection",
- "hostname" => "localhost",
- "port" => 6379
- ),
- //...
- ),
加完它之后就可以写上一段测试代码了:
PHP代码
- Yii::import("ext.yiiredis.*");
- $list = new ARedisList("aNameForYourListGoesHere");
- $list->add("cats");
- $list->add("dogs");
- $list->add("goods");
- foreach($list as $i => $val) {
- print_r($val) ;
- echo "<br />";
- }
- $list->clear();
直接输出在浏览器中。是不是很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
PHP | 评论:2
| 阅读:45501