Redis实战之Redis命令

Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串),list(列表),set(集合),hash(散列),zset(有序集合),下面将分别对这5种数据类

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串),list(列表),set(集合),hash(散列),zset(有序集合),下面将分别对这5种数据类型的控制命令进行总结,熟话说好记性不如烂笔头,方便以后查看。

1. 字符串命令

  Redis种的字符串有三种类型的值:字节,整数和浮点数

(1)命令列表

  SETSET key value ——设置存储在给定键种的值

  GETGET key value ——获取存储在给定键种的值

  DELDEL key ——删除存储在给定键种的值(这个命令可以用于所有类型)

  INCRINCR key ——将键对应的值加1

  DECRDECR key ——将键对应的值减1

  INCRBYincrby key number ——将键对应的值加number

  DECRBYdecrby key number ——将键对应的值减number

  APPENDappend key value ——将值value追加到给定键key当前村粗的值的末尾

  GETRANGEgetrange key start end ——获取从start到end范围内的字串

  SETRANGEsetrange key offset val ——将从offset偏移量开始的字串设置指定值val

  GETBITgetbit key offset ——返回位串中偏移量为offset的二进制位值

  SETBITsetbit key offset val ——位串中偏移量为offset的二进制位值设置为val

  BITCOUNTbiitcount key [start end] ——统计二进制位串里面值位1的二进制位数量

  BITOPbitop operation dest-key key1 [key2…] ——对一个或多个二进制位串执行包括并、或、异或、非在内的任意一种位运算操作

(2)示例

redis 127.0.0.1:6379> set name zhangsan
OK
redis 127.0.0.1:6379> set age 18
OK
redis 127.0.0.1:6379> get name
"zhangsan"
redis 127.0.0.1:6379> get age
"18"
redis 127.0.0.1:6379> incr age
(integer) 19
redis 127.0.0.1:6379> decr age
(integer) 18
redis 127.0.0.1:6379> incrby age 5
(integer) 23
redis 127.0.0.1:6379> decrby age 5
(integer) 18
redis 127.0.0.1:6379> append name _lisi
(integer) 13
redis 127.0.0.1:6379> get name
"zhangsan_lisi"
redis 127.0.0.1:6379> getrange name 1 0
""
redis 127.0.0.1:6379> getrange name 0 -1
"zhangsan_lisi"
redis 127.0.0.1:6379> setrange name 0 wangmazi
(integer) 13
redis 127.0.0.1:6379> get name
"wangmazi_lisi"
redis 127.0.0.1:6379> del name
(integer) 1
redis 127.0.0.1:6379> get name
(nil)

(3)注意事项

  a. 如果对一个不存在的键或者一个保存了空串的键执行自增或自减操作,那么Redis在执行操作时会将这个键的值当作0来处理

  b. 即使在设置键时输入的值位字符串,但只要这个值可以可以被理解为整数,就可以当作整数来处理

  c. GETRANGE命令由以前的SUBSET命令改名而来的,如果是2.6或以上redis版本,使用getrange()方法来获取字串

2. 列表命令

(1)一些常用的列表命令

  RPUSHrpush key value [value1…] ——将一个或多个值添加到列表的右端

  LPUSHlpush key value [value1…] ——将一个或多个值添加到列表的左端

  RPOPrpop key ——移除并返回列表最右端的元素

  LPOPlpop key ——移除并返回列表最左端的元素

  LINDEXlindex key offset ——–返回列表中偏移量为offset的元素

  LRANGElrange key start end ——返回列表中偏移量在[satrt,end]范围内的元素,包括satrt和end

  LTRIMltrim key start end ——对列表进行修剪,只保留从start到end范围内的元素,包括start和end

redis 127.0.0.1:6379> rpush key 1,2,3
(integer) 1
redis 127.0.0.1:6379> lpush key 4,5,6
(integer) 2
redis 127.0.0.1:6379> lrange key 0 -1
1) "4,5,6"
2) "1,2,3"
redis 127.0.0.1:6379> rpush key hello
(integer) 3
redis 127.0.0.1:6379> lrange key 0 -1
1) "4,5,6"
2) "1,2,3"
3) "hello"
redis 127.0.0.1:6379> lindex key 2
"hello"
redis 127.0.0.1:6379> ltrim key 1 2
OK
redis 127.0.0.1:6379> lrange key 0 -1
1) "1,2,3"
2) "hello"

(2)阻塞式的列表弹出命令以及在列表之间元素的移动

  BLPOP blpop key1 [key2…] timeout ——从一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素

  BRPOP

  BPOPLPUSH bpoplpush source-key dest-key ——从原始列表弹出最右端的元素并压入目标列表左端,并返回这个元素

  BRPOPLPUSH BRPOPLPUSH source-key dest-key timeout ——从原始列表弹出最右端的元素并压入目标列表左端,并返回这个元素,如果source-key为空阻塞等待

3. 集合命令

  Redis的集合以无序的方式来存储多个各不相同的元素,可以快速的对集合进行添加,删除、元素检查、组合和关联等操作

(1)常用集合命令

  SADDsadd key item [item…] ——将一个或多个元素添加到集合中

  SREMsrem key item [item…] ——从集合中移除一个或多个元素

  SISMEMBERsismember key item ——检查item是否存在于集合key里面

  SCARDscard key ——返回集合包含的元素的数量

  SMEMBERSsmembers key ——返回集合包含的所有元素

  SRANDMEMBERsrandmember key [count] ——从集合里随机的返回一个或多个元素

  SPOPspop key ——随机地移除几个中的一个元素,并返回被移除的元素

  SMOVEsmove source-key dest-key item ——如果原集合包含item,从原集合移除item并将item添加到集合目标集合,成功返回1,否则返回0

(2)示例

redis 127.0.0.1:6379> sadd key 1 2 3
(integer) 3
redis 127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> sadd key 3
(integer) 0
redis 127.0.0.1:6379> scard key
(integer) 3
redis 127.0.0.1:6379> srem key 3
(integer) 1
redis 127.0.0.1:6379> smembers key
1) "1"
2) "2"
redis 127.0.0.1:6379> srandmember key
"2"
redis 127.0.0.1:6379> smembers key
1) "1"
2) "2"
redis 127.0.0.1:6379> spop key
"1"
redis 127.0.0.1:6379> smembers key
1) "2"

(2)组合和关联命令

  SDIFFsdiff key1 [key2…] ——返回那些存在于第一集合key1,但不存在于其他集合中的元素

  SDIFFSTOREsdiffstore dest-key key1 [key2…] ——-将SDIFF的结果存到目标集合中

  SINTERsinter key1 [key2…] ——返回那些同时存在于所有集合中的元素

  SINTERSTOREsinterstore dest-key key1 [key2] ——将SINTER的结果放到目标集合中

  SUNIONsunion key1 [key2…] ——返回那些至少存在于一个集合中的元素

  SUNIONSTOREsunionstore dest-key key1 [key2…] ——将SUNION的结果放到表集合中

(3)示例

redis 127.0.0.1:6379> sadd key1 a b c d e
(integer) 5
redis 127.0.0.1:6379> sadd key2 c d e f
(integer) 4
redis 127.0.0.1:6379> smembers key1
1) "c"
2) "d"
3) "e"
4) "a"
5) "b"
redis 127.0.0.1:6379> smembers key2
1) "c"
2) "d"
3) "e"
4) "f"
redis 127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"
redis 127.0.0.1:6379> sinter key1 key2
1) "c"
2) "d"
3) "e"
redis 127.0.0.1:6379> sunion key1 key 2
1) "c"
2) "d"
3) "a"
4) "e"
5) "b"

4. 散列命令

  Redis的散列将多个键值对存储在Redis的键里面

(1)散列常用命令

  HSEThset key-name key value ——为散列添加键值对

  HGEThget key-name key ——得到散列的键值对

  HMSEThmset key-name key value [key name…] ——-为散列设置一个或多个键值对

  HMGEThmget key-name key [key…] –—–得到散列的一个或多个键值对

  HDELhdel key-name key [key…] ——删除散列里面的一个或多个键值对

  HLENhlen key-name ——返回散列包含的键值对数量

  HEXISTShexists key-name key ——检查键值是否在散列中

  HKEYShkeys key-name ——得到散列的所有键值

  HVALShvals key-name ——得到散列的所有键对应的值

  HGETALLhgetall key-name ——得到散列的说有键值对

  HINCRBYhincrby key-name key number ——将键key的值加上整数number

  HINCRBYFLOAThincrbyfloat key-name key number ——将键key的值加上浮点数number

(2)示例

redis 127.0.0.1:6379> hmset person name zhangsan age 17
OK
redis 127.0.0.1:6379> hmget person name age
1) "zhangsan"
2) "17"
redis 127.0.0.1:6379> hset person sex man
(integer) 1
redis 127.0.0.1:6379> hlen person
(integer) 3
redis 127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "17"
5) "sex"
6) "man"
redis 127.0.0.1:6379> hkeys person
1) "name"
2) "age"
3) "sex"
redis 127.0.0.1:6379> hvals person
1) "zhangsan"
2) "17"
3) "man"
redis 127.0.0.1:6379> hincrby person age 8
(integer) 25
redis 127.0.0.1:6379> hget person age
"25"

5. 有序集合命令

  和散列存储着键与值之间的映射类似,有序集合也存储着成员与分值之间的映射,并且提供了分值处理命令,以及和根据分值大小有序地获取或扫描成员和分值的命令

(1)常有有序集合命令

  ZADDzadd key-name score number [score number…] ——将带有分值的成员添加到有序集合

  ZREMarem key-name number [number…] ——从有序集合里面移除指定的成员,并返回被移除成员的数量

  ZCARDzcard key-name ——返回有序集合包含的成员数量

  ZINCRBYzincrby key-name increment number ——将number成员的分值加上increment

  ZCOUNTzcount key-name min max ——返回分值介于min和max之间的成员数量

  ZRANKzrank key-name merber ——返回成员member在有序集合中的排名

  ZRANGEzrange key-name start stop [withscores] ——返回排名介于start和stop之间的成员,如果给定了withscores则分值一起返回

  ZSCOREzscore key-name number ——返回成员number的分值

(2)示例

redis 127.0.0.1:6379> zadd ages 19 person1 20 person2 30 person3
(integer) 3
redis 127.0.0.1:6379> zcard ages
(integer) 3
redis 127.0.0.1:6379> zcount ages 0 40
(integer) 3
redis 127.0.0.1:6379> zrange ages 0 40 withscores
1) "person1"
2) "19"
3) "person2"
4) "20"
5) "person3"
6) "30"
redis 127.0.0.1:6379> zscore ages person2
"20"
redis 127.0.0.1:6379> zincrby ages 10 person3
"40"
redis 127.0.0.1:6379> zscore ages person3
"40"
redis 127.0.0.1:6379> zincrby ages -10 person3
"30"
redis 127.0.0.1:6379> zscore ages person3
"30"

(3)有序集合更高级命令

  ZREVRANKzrevrank key-name number ——返回有序集合里成员number的排名,按照分值从大到小的排列

  ZREVRANGEzrevrange key-name start stop [withscores] —- 返回zrange的反序内容

  ZREVRANGEBYSCOREzrevrangebyscore key-name min max [withscores]  [limit offset count] ——返回有序集合中,分值介于min和max之间的所有成员,并按照分值大小的顺序返回

  ZREMRANGEBYRANKzremrangebyrank key-name satrt stop ——移除有序集合中排名介于satrt和stop之间的所有成员

  ZREMRANGEBYSCOREzremrangebyscore key-name min max ——移除有序集合中分值介于satrt和stop之间的所有成员

  ZINTERSTOREzinterstore dest-key key-count key1 [key2…] [WEIGHTS weight [weight…]] [AGGREGATE SUM|MIN|MAX] ——对给定的有序集合执行类似集合的交集运算

  ZUNIONSTOREzunionstore dest-key key-count key1 [key2…] [WEIGHTS weight [weight…]] [AGGREGATE SUM|MIN|MAX] ——对给定的有序集合执行类似集合的并集运算

(4)示例

redis 127.0.0.1:6379> zrank ages person1
(integer) 0
redis 127.0.0.1:6379> zrevrank ages person1
(integer) 2
redis 127.0.0.1:6379> zrevrange ages 0 40 withscores
1) "person3"
2) "30"
3) "person2"
4) "20"
5) "person1"
6) "19"
redis 127.0.0.1:6379> zcard ages
(integer) 3
redis 127.0.0.1:6379> zrevrangebyscore ages 40 0 withscores
1) "person3"
2) "30"
3) "person2"
4) "20"
5) "person1"
6) "19"

6. 发布与订阅命令

  发布(publish)与订阅(subscribe)的特点是订阅者负责订阅频道(channel),发送者负责向频道发送二进制字符串消息,每当由消息被发送到给定频道时,频道的所有订阅者都会收到消息。

  SUBSCRIBEsubscribe channel [channel] ——订阅给定的一个或多个频道

  UNSUBSCRIBEunsubcribe channel [channel] ——退订给定的一个或多个频道

  PUBLISHpublish channel [channel…] ——向给定频道发送消息

  PSUBSCRIBEpsubscribe pattern [pattern] ——订阅与给定模式相匹配的所有频道

  PUNSUBSCRIBEpunsubscribe pattern [pattern] ——退订给定的模式,如果执行时没有给定任何模式,那退订所有模式

7. 小试牛刀

  简单示例:实现文章发布,获取和投票

(1)文章发布

ONE_WEEK_IN_SECOND = 7*24*60*60
def post_article(conn, user, title, link):
    '''文章发布,实现以下操作:
    (1) 获取文章id
    (2) 初始化集合管理已投票用户
    (3) 初始化文章信息散列表
    (4) 初始化分数有序集合
    (5) 初始化时间有序集合
    '''
    article_id = str(conn.incr('article:')) #得到文章id
    
    voted_key = 'voted:' + article_id  #已投票集合key
    conn.sadd(voted_key,user)  #创建集合管理已投票用户,自己不允许投票
    conn.expire(voted_key,ONE_WEEK_IN_SECOND) #设置键的过期时间
    
    now = time.time()
    article_key = 'article:' + article_id #文章信息散列key
    # 初始化文章信息散列表
    conn.hmset(article_key, {
            'title':title,
            'link:':link,
            'poster':user,
            'time':now,
            'votes':1})
    
    # 初始化分数有序集合
    conn.zadd('score:', {article_key:now+VOTE_SCORE})
    # 初始化时间有序集合
    conn.zadd('time:', {article_key:now})
    return article_id

(2)文章获取

def get_articles(conn, page, order='score:'):
    '''默认根据分数排名获取指定页的文章信息'''
    #设定每页文章数目
    ARTICLES_PER_PAGE = 5
    start = (page-1)*ARTICLES_PER_PAGE
    end = start + (ARTICLES_PER_PAGE -1)
    ids = conn.zrange(order, start, end)
    articles = []
    for id in ids:
        article_data = conn.hgetall(id)
        article_data['id'] = id
        articles.append(article_data)
        
    return articles

(3)投票

def article_vote(conn, id, user):
    '''对文章进行投票,投票规则:
    (1)投票的有效期时间为1周
    (1)一篇文章一周内用户只允许投一次票
    (2)分数计算方式为每投一次票加432分
    '''
    VOTE_SCORE = 432
    # 根据文章ID获取文章的发布时间,判断是否在投票的有效期内
    article_key = 'article:' + id
    publish_time = conn.zcore('time:', article_key)
    if publish_time + ONE_WEEK_IN_SECOND < time.time():
        return 
    else:
        #用户可以投票,用户完成投票后将该用户添加到已投票用户管理集合
        voted_key = 'voted:' + id
        if conn.sadd(voted_key, user):
            #更新score:有序集合列表分数
            conn.zincrby('socre:',article_key, VOTE_SCORE)
            #更新散列表文章信息
            conn.hincr(article_key, 'votes')

(4)对文章获取进行测试

if __name__ == '__main__':
    try:
        conn = redis.Redis()
    except:
        raise 'connect exception'
    else:
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
        
    articles = get_articles(conn, 0)
    for article in articles:
        print('-----article--------')
        for key, val in article.items():
            if isinstance(key,bytes):
                print('{}:{}'.format(key.decode(encoding='utf-8'),val.decode('utf-8')))
            else:
                print('{}:{}'.format(key,val.decode('utf-8')))

  输出:

Redis实战之Redis命令

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120043.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java解析XML文件的四种方法「建议收藏」

    Java解析XML文件的四种方法「建议收藏」【摘要】可扩展标志语言(XML)在实现信息标准化、信息的交流与共享上有其独特的技术优势,因此受到了广泛的重视。本文先简单的介绍了XML基本知识,然后从XML应用入手总结了四种现今最常见的XML的解析方法,介绍了这四种方法的特点,其中包括优点与不足之处。最后给出了一个简单的案例来对这四种解析进行代码介绍。【关键字】XML文件,DOM,SAX,JDOM,DOM4J【引言】XML即可扩展标记语

  • pstack 安装linux_pstack命令[通俗易懂]

    pstack 安装linux_pstack命令[通俗易懂]pstack命令可显示每个进程的栈跟踪。pstack命令必须由相应进程的属主或root运行。可以使用pstack来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的PID。命令软件包下载地址:https://packages.debian.org/sid/pstack实例pstree以树结构显示进程pstree-pwork|grepadsshd(22669)—b…

  • JDBC 1 day 简介及常用接口、类介绍

    JDBC 1 day 简介及常用接口、类介绍

  • java记录访问时间_在java中记录上次访问时间和上次修改时间?

    java记录访问时间_在java中记录上次访问时间和上次修改时间?首先,让我们关注这些事物的含义.访问–上次读取文件的时间,即上次访问文件数据的时间.修改–上次修改文件(内容已被修改),即文件数据上次修改的时间.更改–文件的元数据的最后一次更改(例如,权限),即上次更改文件状态的时间.编辑.访问时间正在改变.我建议你使用Thread.sleep(100)或其他东西,然后看看这个问题是否仍然存在.如果是这样,罪魁祸首就必须是您正在运行的操作系统,因为J…

  • 滑动窗口算法通用思想

    滑动窗口算法通用思想本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道难度较大的子字符串匹配问题:最小覆盖子串找到字符串中所有字母异位词无重复字符的最长子串最后抽象出一个简单的滑动窗口算法框架。LeetCode上至少有9道题目可以用此方法高效解决。但是有几道是VIP题目,有几道题目虽不难但太复杂,所以本文只选择点赞最高,较为经典的,最能够讲明白的三道题来讲解。第一题为了让读者掌握算法模…

    2022年10月29日
  • 随机梯度下降算法原理 知乎_梯度下降算法的正确步骤

    随机梯度下降算法原理 知乎_梯度下降算法的正确步骤目录1.算法目标2.算法描述3.算法推导4.注意1.算法目标逐渐逼近损失函数loss的极小值,简单抽象为求函数的极小值。2.算法描述每次取一个增量,使得,每次向函数值更小的地方前进一小步,多次迭代就能做到逐渐逼近函数的极小值。3.算法推导展开得到公式。其中H为海森矩阵,暂且不考虑。为使成立,只需要保证。即,当时,,如此即可保证每次更新在逐渐逼近函数的极小值。其中为学习率是一个较小的正数。每次更新时做操作,求得的最小值。4.注意上..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号