redis笔记

基本命令

 
1、keys    pattern
获取符合规则的键名列表
使用通配符筛选
?        匹配一个字符
*          匹配任意个(包括0个)字符
[]         匹配括号中任一字符,可以使用‘-’符号表示一个范围,如a[b-d]==a[bcd],可以匹配ab,ac,ad
\x        匹配指定字符,用于转义符号。如要匹配“?”就需要用\?
 
2、del    key
删除指定的键,可以删除一个或多个,返回值是删除键的个数
 
3、exists    key
查看一个键是否存在
    
4、type    key
返回key中存的类型
 
类型
 
一、字符串类型
 
1、incr    key
当存储的值是整形数据时,可以使用incr递增
 
2.incrby    key    increment
增加指定的整数
 
2.1. incrbyfloat     key    incrment
递增指定的浮点数
 
3.decr    key
递减
 
4.decrby    key increment
递减指定的整数
 
5.append    key    value
向键值的末尾追加value,如果键不存在则将该键的值设置为value,相当于set    key    value,返回值是追加后字符串的总长度。
 
6.strlen    key
获取字符串长度,如果键不存在则返回0
 
7.mset    key     value [ key  value  [ key  value ]]
一次设置多个键值对
 
8.mget    key    [key [ key ]]
一次获取多个键的值
 
二、散列类型(hash)
 
散列类型的键值也是一种字典结构,其存储了字段和字段值的映射,但字段只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。最多可以存2^32 -1个字段。
除了散列类型,redis的其他数据类型同样不支持数据类型嵌套。
 
 
 
1.HSET    key    field    value
设置一个hash键的 字段=value值
hset    car    color    red
 
2.hget    key    field
获取一个hash键中的某一个字段
hget    car    color   
 
3.hmset    key    field    value    [    field  value   ]
一次设置多个hash键的字段值
hmset    car    color    red    name       BMW
 
4.hmget    key    field    [ field ]
一次获取多个hash键中的字段
 
5.hgetall    key
获取hash键中所有字段和值
 
6.hexists    key    field
判断hash键中某个字段是否存在,存在返回1,否则返回0
 
7.hsetnx    key    field    value
如果hash键中某个字段不存在,才设置其value,存在则不做任何操作
 
8.hincrby    key   field    incrment
对hash键中的字段自增指定的数
 
9.hdel    key    field    [ field ]
删除hash键中的指定字段,可以删除多个,返回值是删除的个数
 
10.hkeys    key
返回hash键中所有的字段名
 
11.hvals    key
返回hash键中所有的值
 
 
三.列表类型
 
列表类型就是一个双向链表,可以存储一个有序的字符串列表,常用的操作就是向列表两端添加元素,最多可以容纳2^32-1个元素
 
1.lpush    key    value    [  value ]
   rpush    key    value    [ value ]
向列表左右两边插入数据,一次可插入多个
 
2.lpop    key
   rpop    key
 从左右两边弹出一个数据,会从列表中删除
 
3.lrange    key    start    end
显示列表中指定部分的数据
lrange    list    0    10
 
4.llen    key
返回列表中元素的个数
 
5.lrem    key    count    value
当count>0时,lrem命令会从列表的左边开始删除前count个值为value的元素。
当count<0时,lrem命令会从列表的右边开始删除前 |count| 个值为value的元素
当count=0时,会删除所有值为value的元素。
 
6.lindex    key    index
获取索引为index位置上的值
 
7.lset    key    index    value
把列表中索引为index上的值设置为value
 
8.ltrim    key    start    end
只保留指定部分位置的数据,其他的全部删除
ps: 可以用来限制列表中元素的个数一直在某个范围之内
 
9.linsert    key    before|after    value    insertValue
在列表中从左到右查找值为value的元素,然后根据第二个参数before或者after来决定将insertValue插入到该元素的前面还是后面。
 
10.rpoplinsert    list:1    list:2
把list:1中右边的元素移到list:2列表的左边
 
四.集合
 
集合就是高中数学学的那些东西,两个圈的,交集∩,差集,并集∪
 
1.sadd    key    value  [ value ]
添加一个集合,可一次添加多个值
 
2.srem    key    value  [ value ]
删除集合中某个值,可一次删除多个
 
3.smember    key
返回集合中所有元素
 
4.sismember    key    value
判断value在集合中是否存在。存在返回1,不存在返回0
 
A: {  1,2,3  }
B: {  3,4,5  }
 
5.sdiff    setA    setB    setC   ........
计算差集,在A中存在,但不在B中存在的元素,把返回的值再和C比较....
    sdiff    A    B = { 1,2 }
 
6.sinter    setA    setB
计算交集
    sinter    A    B = { 3 }
 
7.sunion    setA    setB   
计算并集
sunion    A    B    ={ 1,2,3,4,5 }
 
8.scard    key
返回元素的总数
 
9.sdiffstore    destination    key    [key    [key]]
   sinterstore    destination    key    [key    [key]]
   sunionstore    destination    key    [key    [key]]
和diff,inter,union功能一样,但是结果不会输出,而是存在了集合destionation中
这些命令常用于需要进行多步集合运算的场景中,如需要先计算差集再计算交集
 
10.srandmember    setA   [ count=1 ]
从集合中随机获取count个元素,默认为1
 
11.spop    key
从集合中随机弹出一个元素,会从集合中删除
 
 
五.有序集合
 
在集合类型的基础上,没有元素都关联了一个分数,然后根据分数可以排序。
这使得我们不仅可以完成插入,删除和判断元素是否存在等操作,加上分数概念,还可以能够获取分数排序后,最高(低)的前N个元素。
获得指定分数范围内的元素等与分数有关的操作!
 
 
1.zadd    key    score    member    [  score    member  ]
增加有序集合元素格式:zadd    键    分数    值
可一次添加多个
 
2.zscore    key    member
获取集合中某个元素的分数
 
3.zrange    key    start    end    [ withscores ]
根据元素的索引,获取指定范围内的元素,按照分数的从小到大排列。如果要一起返回分数需要加上参数withscores 
 
4.zrangebyscore    key    min    max    [  withscores  ]    [  limit    offset  count  ]
根据分数,获取指定分数内的元素。withscores作用同上! limit 同sql中的作用一样。对符合分数要求的元素,进行limit
zrangebyscore    zdemo:1    60    100    limit    1    2
假设下面的符合分数要求
a    b    c    d
limit    1    2
b    c    d
 
 
对分数进行操作
5.zincrby    key    incrment    member
增加一个元素的分数,返回值是更改后的分数。
zincrby    zdemo:1    4    aa
把aa的分数加4
zincrby    zdemo:1    -4    aa
把aa的分数减去4
 
6.zcrad    key    
获得集合中元素的数量
 
7.zcount    key    min    max
获取指定分数内的元素的数量 
 
8.zrem    key    member    [  member  ]
删除集合中指定的元素,可以一次删除多个
 
9.zremrangebyrank    key    start    stop
把元素按照分数从小到大排列后,按照索引,删除索引为start--stop之间的元素。
 
 
10.zremrangebyscore    key    min    max
把元素按照分数从小到大排列后,按照分数,删除分数在min--max之间的元素。
 
11.zrank     key    member
获取元素在集合中的排名(按分数从小到大)
 
12.zrevrank    key    member
获取元素在集合中的排名(按分数从大到小)
 
13.zinterstore    destination    numkeys    key1    key2    [  key.....  ]    [   aggregate    sum|min|max  ]
计算有序集合的交集,把交集数据存在destination有序集合中。返回的数据为交集元素数量
destination交集有序集合中元素的分数,由aggregate参数决定。默认是sum
 
 
当为sum时
 
当为min时
 
当为max时
 
14.zunionstore
计算并集
 
 
进阶
 
一、事务
 
redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单位。一个事务中的命令要么都执行,要么都不执行。
 
1.用法:
 
 
2.watch    key
监控一个key,在watch这个key后。如果这个key被修改,那么在接下来的事务中,是修改不了这个key的。
也就是说watch指定的key后,如果值变了,事务就不能修改这个key的值,没变就可以。watch只针对事务。
 
 
 
在事务执行之后,会取消对所有键的监控。
 
3.unwatch    key
取消对所有键的监控
 
4.expire    key    seconds
设置键的生存时间(单位:秒)
 
5.pexpire    key    micoretime
设置键的生存时间(单位:毫秒)
 
6.ttl    key   
查看键的剩余时间
查看一个没有设置生存时间的键,返回-1
 
7.persist    key
取消键的生存时间,变成长久的
 
8.expireat    key   时间戳
到指定时间过期(单位:秒)
 
9.pexpireat    key    毫秒时间戳
到指定时间过期
 
 
二、SORT
 
1.sort    key    [  desc  ]
对键的值进行排序
一般是列表,集合
redis>LPUSH today_cost 30 1.5 10 8
redis> SORT today_cost
1) "1.5"
2) "8"
3) "10"
4) "30"
redis 127.0.0.1:6379> SORT today_cost DESC
1) "30"
2) "10"
3) "8"
4) "1.5"
2.alpha   
使用此参数可对字符串进行排序
# 默认(按数字)排序

redis> SORT website
1) "www.infoq.com"
2) "www.slashdot.com"
3) "www.reddit.com"

# 按字符排序

redis> SORT website ALPHA
1) "www.infoq.com"
2) "www.reddit.com"
3) "www.slashdot.com"
3.limit    offset    limit
限制返回结果。和sql中一样
 
lpush    demo    1 3 2 4 2 6 6 1 55 1
sort    demo    desc    limit    3    5
 
4.使用外部key排序
列表userID中存的是用户id
lpush    userID    1  2  3
其他的相关数据
set    user_level_1    100
set    user_level_2    20
set    user_level_3    50
 
by参数
    对用户id按level中的值进行排序
    sort    userID    by    user_level_*    [  desc  ]
    输出   1   3   2
    user_level_* 是一个占位符,它先取出uid中的值。然后再用这个值匹配到user_level_*中
    比如在对 uid 列表进行排序时, 程序就会先取出 uid 的值 1 、 2 、 3 、 4 , 然后使用 user_level_1 、 user_level_2 、         user_level_3和 user_level_4 的值作为排序 uid 的权重。
 
 
get参数
使用get选项,可以根据排序的结果来取出相应的键值
sort    userID    by    user_level_*     get    #    get    user_level_*
get   #  获取sort键的值,这次是userID中的值
get    user_level_*    获取user_level_*中的值
SORT uid BY user_level_* GET # GET user_level_* GET user_name_*

 

"3"  #uid

"99999" # level
 

"zhangsan" # name

 


"1"  #uid

"999" # level
 

"wanger" # name



"2"  #uid

"9" # level
 

"lisi" # name


注:如果by一个不存在的键,那么就不会排序
通过将这种用法和 GET 选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的 join 关键字)。
 

将哈希表作为 GET 或 BY 的参数

redis 127.0.0.1:6379> SORT uid BY user_info_*->level GET user_info_*->name
1) "jack"
2) "peter"
3) "mary"
4) "admin"
5.保存排序结果STORE
 SORT numbers STORE sorted-numbers
用 EXPIRE 为结果设置生存时间,以此来产生一个 SORT 操作的结果缓存
 
 
三、任务队列
 
使用场景:当页面需要进行如发送邮件,短信,复杂运算等耗时较长的操作时,为了不阻塞页面的渲染,避免用户等待太久,应该使用独立的线程去处理这些操作。
 
redis队列用到了链表(列表)类型。
 
1. BRPOP    |   BLPOP    key    [  key  ]    time
弹出数据,同lpop,rpop一样,不同的是,如果队列中没有数据,当time=0,则会一直阻塞下去。不然就等待time设置的时长,单位秒
如果有多个列表键,会优先弹出最前面(左边)那个键的值,这就有了队列优先级的概念。
 
 
phpredis使用通道
 1 $redis = new Redis();
 2 
 3 // Opens up the pipeline
 4 $pipe = $redis->multi(Redis::PIPELINE);
 5 
 6 // Loops through the data and performs actions
 7 foreach ($users as $user_id => $username)
 8 {
 9     // Increment the number of times the user has changed their username
10     $pipe->incr('changes:' . $user_id);
11 
12     // Changes the username
13     $pipe->set('user:' . $user_id . ':username', $username);
14 }
15 
16 // Executes all of the commands in one shot
17 $pipe->exec();

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2015-07-31 17:16  悲惨的大爷  阅读(520)  评论(0编辑  收藏  举报