zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    case when then用法
    查询后n条记录
    自定义函数
    字符函数
    数字运算符和函数
    时间日期函数
    mysql加密函数
    比较运算符和函数
    文件夹中的文件以目录的形式呈现
    错误提示:通过 Web 服务器的身份验证的用户无权打开文件系统上的文件
  • 原文地址:https://www.cnblogs.com/Jiangyx/p/7052619.html
Copyright © 2011-2022 走看看