Redis入门

来源:互联网 发布:眼睛颜色 知乎 编辑:程序博客网 时间:2024/06/06 00:34

redis常用命令

标签(空格分隔): redis


基础命令

  • 获得符合规则的键名列表
KEYS pattern
  • 判断一个键是否存在
EXISTS key存在返回1,否则返回0
  • 删除键(可以删除一个或多个键)
DEL key [key...]返回删除的键的个数
  • 获取键值的数据类型
TYPE key返回值可能为string(字符串类型)、hash型(散列类)、list(列表类型)、set(集合类型)、zset(有序集合类型)

字符串类型命令

基本命令

赋值和取值

SET key valueGET key当键值不存在的时候会返回空

递增数字

INCR num当存储的字符串是整数形式时,通过此命令能让当前键值递增,并返回递增后的值当操作的键不存在的时候默认为0,所以第一次递增后的结果是1当键值不是整数时会报错

递减数字

DECR key

实践

文章访问量统计

可以为每篇文章使用 post:文章ID:page.view作为键,当每次用户访问文章的时候可以使用

INCR post:文章ID:page.view获取其返回值作为文章的浏览次数

生成自增ID

可以对于每一类对象使用名为对象类型(复数):count的键,例如(users:count),当每增加一个新对象时使用INCR命令递增该键的值,然后将其值返回作为对象的id

INCR posts:count将其返回自赋给新增对象的id属性中

存储文章数据

// 下面是PHP相关伪代码$postID = INCR posts:count// 将博客文章的其他元素转为json$postContent = json_encode([title'=>$title, 'content'=>$content, 'author'=>$author, 'time'=>$time])// 新增文章SET post:$postID:data $postContent

命令拾遗

增加指定的整数

INCRBY key increment可以通过指定increment的值来指定一次增加的数值

减少指定的整数

DECRBY key decrementDECRBY key 5 相当于 INCRBY key -5

增加指定浮点数

INCRBYFLOAT key increment类似于INCRBY, 只不过其可以递增一个双精度浮点数

向尾部追加值

APPEND key value向键值的末尾追加value, 如果键不存在则将该键的值设为value,相当于SET key value返回值是追加后字符串的总长度如果参数值中包含空格,则需要使用双引号进行区分SET key helloAPPEND key " world"

获取字符串长度

STRLEN key返回键值的长度,不存在则返回0

同时获得/设置多个键值

MGET key [key ...]MSET key value [key value ....]

位操作

GETBIT key offset可以获得一个字符串类型键指定位置的二进制的值(从0开始)SETBIT key offset可以设置一个字符串类型键指定位置的二进制的值(从0开始)BITCOUN key可以获取字符串类型键中值为1的二进制位个数BITOP operation destkey key [key ...]对对个字符串类型键进行位运算BITPOS key offset可以获取指定键的第一个位置是0或者1的位置

散列类型命令

基本命令

赋值和取值

HSET key field value用于给字段复制HGET key field获取字段的值HSET car:1 name BWMHGET car:1 nameHSET命令不区分插入和更新操作,当字段不存在时则执行新增操作,HSET返回1当字段存在时,则执行更新操作,HSET返回0当需要同时设置多个字段的值时可以使用HMSETHSET key field1 value1HSET key field2 value2上述代码可以写成HMSET key field1 value1 field2 value2相应的HMGET也可以同时获取多个字段的值HMGET key field1 field2获取键中所有字段和字段值HGETALL key返回的结果为field1value1field2value2在一些编程语言提供的redis客户端会自动将这些数据进行转换

判断字段是否存在

HEXISTS key field判断一个字段是否存在,存在返回1,否则返回0(如果键不存在也返回0

当字段不存在时赋值

HSETNX key field valueHSETNX和HSET相似,区别在于如果字段已经存在,HSETNX命令不做任何操作

增加数字

HINCRBY key field increment给字段值增加指定的整数如果key不村子,则会自动简历该键,并在进行增加操作之前创建该字段,并将其值设为1返回值是增值后的字段值

删除字段

HDEL key field [field ..]可以删除一个或多个字段,返回值是被删除的字段个数

实践

存储文章数据

如果向上述的将文章的所有信息已json的方法存储,在修改文章时必须全部修改,因此可以采用散列的方式进行存储。

HMSET post:1 title "第一篇文章" author mickle time 2017618日 content "文章内容"

存储文章的缩略名

一般发布文章时,会需要提供文章的缩略名(唯一),我们可以提供一个散列,来存储缩略名和文章id的关系

// 发布文章的伪代码// 通过生成器获取文章的id$postID = INCR posts:count// 判断输入的缩略名是否存在$isExistSlug = HSETNX slug.to.id $slug $postIDif $isExistSlug is 0    // 返回为0代表用户字段已经设置过了,需要重新输入用户名    // 退出新增    exitHMSET post:$postID title $title content $content slug $slug// 根据文章缩略名获取文章的id$postID = HGET slug.to.id $slugif not $postID    print 文章不存在    exit$post = HGEALL post:$postIDprint 文章标题: $post.title

命令拾遗

只获取字段名或者字段值

HKEYS key获取键中的所有字段名HVALS key获取键中的所有字段值

获取字段数量

HLEN key获取键中字段的数量

列表类型命令

命令

向列表两端增加元素

LPUSH key value [value ...]向列表左边添加元素,返回值为增加元素后列表长度RPUSH key value [value ...]向列表右边添加元素,返回值为增加元素后列表长度

从列表两端弹出元素

LPOP key从列表左边弹出一个元素,并返回弹出元素的值RPOP key从列表右边弹出一个元素,并返回弹出元素的值想要实现队列可以使用加入队列 RPUSH  移除队列 LPOP(常用)加入队列 LPUSH  移除队列 RPOP

获取列表中元素的个数

LLEN key返回列表长度,如果键不存在时返回0redis会直接读取现成的值,时间复杂度为O(1)

获得列表片段

LRANGE key start stop返回索引从start到stop之间的所有元素(包含头和尾),索引值从0开始redis同时支持负索引,负数表示从右边开始计算可以使用LRANGE 0 -1 获取列表中所有的元素如果start的位置在stop后,则会返回空列表,例如 LRANGE 5 2如果stop大于实际的索引返回,则只会返回到列表最右边的数据

删除列表中指定的值

LREM key count value删除列表中前count个值为value的元素, 返回实际删除的元素个数根据count值的大小,redi会做出不同的处理count = 0, 删除所有值为value的元素count > 0, 从左边删除前count个值为value的元素count < 0, 从右边删除前count个值为value的元素

实践

存储文章列表ID

前面使用散列类型存储了文章的详情,现在使用列表存储文章的ID,使其能够达到分页的效果

// 文章分页的伪代码$postID = INCR posts:count// 插入文章,同上// 将id插入到列表中LPUSH posts:list $postID// 分页$postPerPage = 10$start =  ($current - 1) * $postPerPage$end = $current * $postPerPage - 1$postId = LRANGE posts:list $start $stop// 通过ID获取文章详情for $item in $posts :    $post = HGETALL post:$item    print '文章标题', $post.title

存储文章评论列表

如果评论不修改的话,可以使用列表能够进行有效的存储

$comment = json_encode(['author' => $author, 'time' => $time, 'content' => $content, 'email' => $email])LPUSH post:42:comment $comment读取评论直接使用LRANGE 即可

命令拾遗

获得/设置指定索引的元素值

LINDEX key index获取指定索引的元素值LSET key index value设置指定索引的元素值

保留列表指定的片段

LTRIM key start stop删除start到stop(包含两端)之外的所有元素,使用方法和LRANGE一致

向列表中插入元素

LINSERT key BEFORE/AFTER pivot value先从左到右查找pivot,找到之后 根据BEFORE/AFTER来进行向前或向后插入value,返回插入后列表的长度

将元素从一个列表转移到另一个列表

RPOPLPUSH source destination先从source列表中右边POP一个元素,然后加入destination的左边,并返回该元素的值当source和destination相同时,会将元素从末尾移到头部

集合类型命令

命令

增加/删除元素

SADD key member [member]相机和中增加一个或多个元素, 如果键不存在则会自动创建,如果元素已存在则不会加入返回值是成功加入的个数SREM key member [member]从集合删除一个或多个元素,并返回成功删除的个数

获得集合中的所有元素

SMEMBERS key返回集合中所有的元素

判断元素是否存在于集合中

SISMEMBER key member当值存在返回1,键或值不存在时返回0

集合间运算

SDIFF key [key ...]执行多个集合之间的差集例如SDIFF setA setB setC首先计算setA-setB,将其结果于setC在做差集SINTER key [key ..。]执行多个集合之间的交集,效果同上SUNION key [key ...]执行多个集合之间的并集,并自动去除相同元素

实践

存储文章标签

// 新增标签SADD post:42:tags PHP JAVA PYTHON// 删除标签SREM post:42:tags PHP// 显示所有标签SMEMBERS post:42:tags

通过标签搜索文章

可以通过建立一个tag:标签名称:posts的集合来存储相应的文章

// 添加标签下的文章idSADD tag:JAVA:posts 1,11,32// 获取JAVA标签的所有普文章SMEMBERS tag:JAVA:posts

命令拾遗

获取集合中元素个数

SCARD key

进行集合运算并将结果存储

SDIFFSTORE destination key [key ...]SINTERSTORE destination key [key ...]SUNIONSTORE destination key [key ...]

上述命令和集合的运算一致,不过此命令会将结果存入destination中

随机获得集合中的元素

SRANDMEMBER key [count]

用来随机从集合中获取一个元素,而且根据传递的count参数,返回也不同
count为正数时,会随机从集合中去除count个不重复的元素,如果count大于集合的元素个数,则会取出全部元素
count为负数时,会从随机从集合中取出|count|个元素的值。这些元素可能相同

从集合中弹出一个元素

SPOP key

从集合中随机弹出一个数(即返回元素的值并删除他)

有序集合类型命令

命令

增加元素

ZADD key score member [score member]

向有序集合中加入一个元素和该元素的分数。如果该元素已经存在则会用新分数替换旧分数
返回值是新加入到集合中的元素个数

获得元素的分数

ZSCORE key member

获取排名在某个返回的元素列表

ZRANGE key start stop [WITHSCORES]ZREVRANGE key start stop [WITHSCORES]

ZRANGE 从小到大的顺序返回索引start到stop之间所有的元素(包含两端),如果想同时获取分数,则加上WITHSCORES
ZREVRANGE 则是按从大到小的顺序

获得指定分数范围的元素

ZRANGBYSCORE key min max [WITHSCORES] [LIMIT offset count]ZREVRANGBYSCORE key min max [WITHSCORES] [LIMIT offset count]ZRANGBYSCORE scoreboard 60 +inf LIMIT 1 3 获得分数高于60分从第二人开始的三个人

元素按照从小到大的顺序返回分数在min到max(包含两端)之间的元素

如果希望不包含端点值,可以在分数前面加上(
ZRANGBYSCORE scoreboard 80 (100
包含80但不包含100

-inf和+inf表示负无穷和正无穷

ZREVRANGBYSCORE 中的min和max是相反的

增加某个元素的分数

ZINCRBY key increment member

增加一个元素的分数,返回值是更改后的分数, increment为负表示减分
如果元素不存在,则会在进行操作前建立元素并赋值为0后再进行操作

实践

实现点击量的排序

我们可以使用post:page.view 来作为点击量的排行榜键// 每当有文章被点击了ZINCRBY post:page.view 1 文章ID// 再通过下面命令获取点击量在前10的文章ZREVRANGE post:page.view 0 9 WITHSCORES  

改进文章发布时间

可以存入文章发布时间的时间戳作为文章的分数值,这样可以快速的使用有序集合来获取最近发布的时间

命令拾遗

获得集合中元素的数量

ZCARD key

获得指定分数范围内的元素个数

ZCOUNT key min max

删除一个或多个元素

ZREM key member [member ...]

按照排名范围删除元素

ZREMRANGEBYRANK key start stop

命令按照元素分数从小到大排序,删除指定排名范围的元素(索引从0开始),返回值时被删除元素的数量

按照分数范围删除元素

ZREMRANGEBYSCORE key min max

删除指定分数范围内的所有元素,返回被删除元素的数量

获得元素的排名

ZRANK key member  最小元素排名为0ZREVRANK key member 最大元素排名为0

计算有序集合的交集

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
原创粉丝点击