Redis入门

基础命令

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

字符串类型命令

基本命令

赋值和取值

SET key value
GET 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 decrement
DECRBY key 5 相当于 INCRBY key -5

增加指定浮点数

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

向尾部追加值

APPEND key value
向键值的末尾追加value, 如果键不存在则将该键的值设为value,相当于SET key value
返回值是追加后字符串的总长度
如果参数值中包含空格,则需要使用双引号进行区分
SET key hello
APPEND 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 BWM
HGET car:1 name

HSET命令不区分插入和更新操作,当字段不存在时则执行新增操作,HSET返回1
当字段存在时,则执行更新操作,HSET返回0

当需要同时设置多个字段的值时可以使用HMSET
HSET key field1 value1
HSET key field2 value2
上述代码可以写成
HMSET key field1 value1 field2 value2

相应的HMGET也可以同时获取多个字段的值
HMGET key field1 field2

获取键中所有字段和字段值
HGETALL key
返回的结果为
field1
value1
field2
value2
在一些编程语言提供的redis客户端会自动将这些数据进行转换

判断字段是否存在

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

当字段不存在时赋值

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

增加数字

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

删除字段

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

实践

存储文章数据

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

HMSET post:1 title "第一篇文章" author mickle time 2017年6月18日 content "文章内容"

存储文章的缩略名

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

// 发布文章的伪代码
// 通过生成器获取文章的id
$postID = INCR posts:count

// 判断输入的缩略名是否存在
$isExistSlug = HSETNX slug.to.id $slug $postID
if $isExistSlug is 0
    // 返回为0代表用户字段已经设置过了,需要重新输入用户名
    // 退出新增
    exit
HMSET post:$postID title $title content $content slug $slug


// 根据文章缩略名获取文章的id
$postID = HGET slug.to.id $slug
if not $postID
    print 文章不存在
    exit
$post = HGEALL post:$postID
print 文章标题: $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
返回列表长度,如果键不存在时返回0
redis会直接读取现成的值,时间复杂度为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的集合来存储相应的文章

// 添加标签下的文章id
SADD 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  最小元素排名为0
ZREVRANK key member 最大元素排名为0

计算有序集合的交集

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
原文地址:https://www.cnblogs.com/Jiangyx/p/7052619.html