php-Redis学习实例

Redis是一个和Memcache类似的NoSQL缓存系统.相比Memcache支持更多的数据类型,并且数据可以持久化,这让他可以储存超过指定内存大小的数据(这是我觉得和Memcache最大的区别).

由于支持的数据格式多,所以操作相比Memcache稍微复杂些.

Redis的各种赋值和取值的操作很多,网上想找个齐全的资料都不太好找.以下整理记录了一些自己常用的操作.

数字/字符串类型

set / mset / setnx / msetnx 赋值操作

    $redis = new redis();

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

    $redis->flushall();//清空所有的key

    var_dump($redis->set('key','a'));//设置一个key-value,如果已存在key,就覆盖

    var_dump($redis->mset(array('key1'=>1,'key2'=>2))); //同时设置多个key-value,如果已存在key,就覆盖.并且这个操作是原子性的,要么都成功,要么都失败

    var_dump($redis->setnx('key','a'))//设置一个key-value,如果已存在key,返回false表示失败

    var_dump($redis->msetnx(array('key1'=>1,'key2'=>2)));//设置多个key-value,如果其中有一个已存在key,则全部失败

get / mget 取值操作

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->get('key')); //获取一个key,如果不存在,返回false

    var_dump($redis->mget(array('key1'=>1,'key2'=>2))); //同时获取多个key,以数组形式返回,不存在的key返回false

incr / decr 自增/自减赋值

    $redis = new redis();

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

    $redis->flushall();//清空所有的key

    $redis->set('key',10);

    var_dump($redis->incr('key')); //结果:int(11)

    var_dump($redis->decr('key')); //结果:int(11)

    //如果key是个字符串:

    $redis->set('key','aa');

    var_dump($redis->incr('key')); //结果:bool(false)

    var_dump($redis->decr('key')); //结果:bool(false)

List类型

lpush /rpush 列表头部/尾部添加一个元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->lpush('key','a')); //结果:int(1)返回列表长度

    var_dump($redis->lpush('key','b')); //结果:int(2) 返回列表长度

    var_dump($redis->rpush('key','c')); //结果:int(3)返回列表长度

    var_dump($redis->rpush('key','d')); //结果:int(4) 返回列表长度

lset / lget 通过下标设置/获取元素值

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->rpush('key','a'));//设置第1个值为a

    var_dump($redis->rpush('key','b')); //设置第2个值为b

    var_dump($redis->lget('key',1)); //下标1的值是 "b"

    var_dump($redis->lset('key',1,'c')); //设置第1个值为c

    var_dump($redis->lget('key',1)); //下标1的值是 "c"

llen返回list的长度

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->rpush('key','a'));

    var_dump($redis->llen('key')); //结果:int(1) 如果key不是list类型,返回false

lrange返回指定区间内的元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->rpush('key','a'));

    var_dump($redis->rpush('key','b'));

    var_dump($redis->rpush('key','c'));

    var_dump($redis->lrange('key',0,1)); //结果array('a','b');

lpop / rpop 从头部/尾部弹出一个元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->rpush('key','a'));

    var_dump($redis->rpush('key','b'));

    var_dump($redis->rpush('key','c'));

    var_dump($redis->lpop('key')); string(1) "a"

    var_dump($redis->rpop('key')); //string(1) "c"

Set类型

set是一种无序集合,用来记录不重复的数据

sadd 添加一个元素到集合中

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));//返回int(1)

smembers 返回set中所有元素(无序)

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->smembers('key'));//array(2) { [0]=> string(1) "a" [1]=> string(1) "b" }

scard 获取set中元素个数

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->scard('key'));//返回int(2)

srem 删除指定的元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->srem('key','b'));//删除成功,返回int(1)

spop 随机弹出set中一个元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->spop('key'));//string(b)

    var_dump($redis->scard('key'));//返回int(1)

spop 随机获取set中一个元素,不删除

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->srandmember('key'));//string(b)

    var_dump($redis->scard('key'));//返回int(2)

sismember 判断set中是否有某个元素

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key','a'));

    var_dump($redis->sadd('key','b'));

    var_dump($redis->sismember('key','a'));//bool(true)

    var_dump($redis->sismember('key','a'));//bool(false)

sinter sinterstore 返回给定key的交集

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key1','a'));

    var_dump($redis->sadd('key1','b'));

    var_dump($redis->sadd('key2','a'));

    var_dump($redis->sadd('key2','c'));

    var_dump($redis->sinter('key1','key2'));//结果:array(1) { [0]=> string(1) "a" }

    var_dump($redis->sinterstore('key3','key1','key2'));//两个集合的交集存入key3,该函数返回int(1)

    var_dump($redis->smembers('key3'));//结果:array('a')

sunion sunionstore 返回给定key的并集

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key1','a'));

    var_dump($redis->sadd('key1','b'));

    var_dump($redis->sadd('key2','a'));

    var_dump($redis->sadd('key2','c'));

    var_dump($redis->sunion('key1','key2'));//结果:array('c','a','b')

    var_dump($redis->sunionstore('key3','key1','key2'));

    var_dump($redis->smembers('key3'));//结果:array('c','a','b')

sdiff sdiffstore 返回给定key的差集

    $redis = new redis();

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

    $redis->flushall();

    var_dump($redis->sadd('key1','a'));

    var_dump($redis->sadd('key1','b'));

    var_dump($redis->sadd('key2','a'));

    var_dump($redis->sadd('key2','c'));

    var_dump($redis->sdiff('key1','key2'));//结果:array('b')

    var_dump($redis->sdiffstore('key3','key1','key2'));//两个集合的交集存入key3,该函数返回int(1)

    var_dump($redis->smembers('key3'));//结果:array('b')

以上是三种Redis常用的数据类型,其他的比如Hash什么的下次再补上.Redis有一个比较让PHPer不适应的地方是,他的底层是强类型的,不同类型数据不能覆盖.比如:

    var_dump($redis->set("key1",'a'));   //结果:bool(true)

    var_dump($redis->sadd("key1",'b'));   //结果:bool(false) 无法赋值

Comments

comments powered by Disqus