Redis相关知识

作者: ropon 分类: 经验分享 发布时间: 2020-06-20 08:45

Redis

  • redis中字符串

    #设置值
    set key val
    #获取值
    get key
    #删除值
    del key
    #自增
    INCR key-name
    #自减
    DECR key-name
    #将存储值加上整数
    INCRBY key-name amount
    #将存储值减去整数
    DECRBY key-name amount
    #将存储值加上浮点数
    INCRBYFLOAT key-name amount
    #将值value追加到给定键key-name当前存储的值的末尾
    APPEND key-name value
    #获取从偏移量start至偏移量end范围内的子串
    GETRANGE key-name start end
    #将start偏移量开始的子串设置为给定值
    SETRANGE key-name offset value
    #将字节串看作二进制串 并返回字串中offset的二进制位的值
    GETBIT key-name offset
    #将字节串看作二进制串 并将字串中offset的二进制位的值设置为value
    SETBIT key-name offset value
    BITCOUNT key-name [start end]
    BITTOP operation dest-key key-name
  • redis中的列表

    LPUSH 将元素推入列表左端
    lpush lstkey lval1
    RPUSH 将元素推入列表右端
    rpush lstkey rval1
    LPOP 从列表左端弹出元素
    lpush lstkey
    RPOS 从列表右端弹出元素
    rpush lstkey
    LINDEX 获取列表在给定位置上的一个元素
    lindex lstkey 1
    LRANGE 获取列表在给定范围上的所有元素
    lrange lstkey 0 2
    LTRIM 对列表进行修剪 只保留start偏移量到end偏移量范围内的元素
    ltrim lstkey 0 2
    BLPOP 从非空列表中弹出位于最左端的元素
    BRPOP 从非空列表中弹出位于最右端的元素
    RPOPLPUSH 
    rpoplpush source-key dest-key
    BRPOPLPUSH
    brpoplpush source-key dest-key
  • redis的集合

    SADD 将元素添加到集合
    sadd setkey val22
    SREM 从集合移除元素
    srem setkey val22
    SISMEMBER 检查集合中是否存在此元素
    sismember setkey val22
    SMEMBERS 获取集合中所有元素
    smembers setkey
    SCARD 获取集合包含元素的数量
    scard setkey
    SRANDMEMBER 从集合里面随机返回一个或多个元素
    srandmember setkey 2
    SPOP 随机从集合中移除一个元素 并返回被移除的元素
    spop setkey
    SMOVE 如果item存在source-key集合中 移除此元素添加到dest-key集合
    smove source-key dest-key item 
    
    #额外还支持
    SINTER 交集
    SUNION 并集
    SDIFF 差集
  • redis的散列

    HSET 散列中关联给定的键值对
    hset hashkey key1 val1
    HGET 获取指定散列键的值
    hget hashkey key1
    HGETALL 获取散列中所有键值对
    hgetall hashkey
    HDEL 删除散列中指定键值对
    hdel hashkey key1
    HMSET 为散列里一个或多个键设置值
    hmset hashkey key1 val1 key2 val2
    HLEN 获取散列包含键值对的数量
    hlen hashkey
    HEXISTS 检查给定键是否存在于散列中
    hexists hashkey key1
    HKEYS 获取散列包含的所有键
    hkeys hashkey
    HVALS hashkey 获取散列包含的所有值
    hvals hashkey
    HINCRBYFLOAT 将key存储的值加上浮点数
    hincrbyfloat hashkey key1 increment
  • redis的有序集合

    ZADD 将一个给定分值的成员添加到有序集合
    zadd zsetkey 90 zhansan
    ZRANGE 从有序集合李获取多个元素
    zrange zsetkey 0 2 withscores
    ZRANGEBYSCORE 获取给定分值范围内的所有元素
    zrangebyscore zsetkey 82 95 withscores
    ZREM 移除成员
    zrem zsetkey zhansan
    ZCARD 获取有序集合包含成员的数量
    zcard zsetkey
    ZCOUNT 返回分值介于min和max之间的成员数量
    zcount zsetkey 80 90
    ZRANK 返回某个成员在集合中的排名
    zrank zsetkey zhangsan
    ZSCORE 返回某个成员的分值
    zscore zsetkey lisi
    ZINCRBY 将某个成员的分值加上increment
    zincrby zsetkey 2 lisi
  • 案例:投票

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2020/6/5 11:17
    # @Author  : Ropon
    # @File    : test.py
    
    import time, redis
    
    pool = redis.ConnectionPool(host="172.16.7.127", port=6379, password="", max_connections=1024)
    conn = redis.Redis(connection_pool=pool)
    
    ONE_WEEK_IN_SECONDS = 7 * 86400
    VOTE_SCORE = 200
    
    def article_vote(conn, user, article):
      """
      投票函数
      """
      # 计算投票截止时间
      cutoff = time.time() - ONE_WEEK_IN_SECONDS
      if conn.zscore('time:', article) < cutoff:
          return
      article_id = article.split(':')[-1]
      if conn.sadd('voted:' + article_id, user):
          # ZINCRBY 对有序集合成员的分值执行自增
          conn.zincrby('score:', article, VOTE_SCORE)
          # HINCRBY 对散列存储的值进行自增
          conn.hincrby(article, 'vote', 1)
    
    def post_article(conn, user, title, link):
      """
      新增文章函数
      """
      # INCR 计数器自增
      article_id = str(conn.incr('article:'))
      voted = 'voted:' + article_id
      conn.sadd(voted, user)
      conn.expire(voted, ONE_WEEK_IN_SECONDS)
    
      now = time.time()
      article = 'article:' + article_id
      conn.hmset(article, {
          'title': title,
          'link': link,
          'poster': user,
          'time': now,
          'votes': 1,
      })
      conn.zadd('score:', {article: now + VOTE_SCORE})
      conn.zadd('time:', {article: now})
    
      return article_id
    
    ARTICLES_PER_PAGE = 25
    
    def get_articles(conn, page, order='score:'):
      """
    获取所有文章
      """
      start = (page - 1) * ARTICLES_PER_PAGE
      end = start + ARTICLES_PER_PAGE - 1
      ids = conn.zrevrange(order, start, end)
      articles = []
      for id in ids:
          article_data = conn.hgetall(id)
          article_data['id'] = id
          articles.append(article_data)
      return articles
    
    def add_remove_groups(conn, article_id, to_add=None, to_remove=None):
      """
      添加或删除分类
      """
      if to_remove is None:
          to_remove = []
      if to_add is None:
          to_add = []
      article = 'article:' + article_id
      for group in to_add:
          conn.sadd('group:' + group, article)
      for group in to_remove:
          conn.srem('group:' + group, article)
    
    def get_group_articles(conn, group, page, order='score:'):
      """
      通过分类获取所有文章
      """
      key = order + group
      if not conn.exists(key):
          conn.zinterstore(key, ['group:' + group, order], aggregate='max')
          conn.expire(key, 60)
      return get_articles(conn, page, key)
    
    # post_article(conn, "Ropon", "Python从入门到放弃", "https://www.ropon.top/1.html")
    article_vote(conn, "Ropon", "article:5")

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!