您的位置:首页 > 数据库 > Redis

redis笔记

2015-07-31 17:16 706 查看
基本命令

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设置的时长,单位秒
如果有多个列表键,会优先弹出最前面(左边)那个键的值,这就有了队列优先级的概念。



[b]phpredis使用通道[/b]

$redis = new Redis();

// Opens up the pipeline
$pipe = $redis->multi(Redis::PIPELINE);

// Loops through the data and performs actions
foreach ($users as $user_id => $username)
{
// Increment the number of times the user has changed their username
$pipe->incr('changes:' . $user_id);

// Changes the username
$pipe->set('user:' . $user_id . ':username', $username);
}

// Executes all of the commands in one shot
$pipe->exec();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: