Redis基础语法入门

版权声明:嘟嘟嘟,转发记得提一下 https://blog.csdn.net/ticktak/article/details/82229639

通用命令

  1. 通用命令
    • keys
    • dbsize
    • exists key
    • del key [key…]
    • expire key seconds
    • type key
  2. keys(一般不在生产环境中使用)

    keys *
    
    # 遍历所有key
    
    
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> set php good
    OK
    127.0.0.1:6379> set java best
    OK
    127.0.0.1:6379> keys *
    1) "hello"
    2) "java"
    3) "php"
    
    
    keys [pattern]
    
    # 使用通配符
    
    127.0.0.1:6379> mset hello world heh haha php good phe his
    OK
    127.0.0.1:6379> keys he*
    1) "heh"
    2) "hello"
    127.0.0.1:6379> keys he[h-l]*
    1) "heh"
    2) "hello"
    127.0.0.1:6379> keys ph?
    1) "php"
    2) "phe"
    
    由于redis是基于单线程,在生成环境中使用keys命令会造成其他线程的阻塞,如果需要使用keys的话可以使用一下方式代替(以后的博客会补充)
    
    1. 热备从节点
    2. 使用scan
  3. dbsize

    dbsize
    
    #计算key的总数
    
    
    127.0.0.1:6379> dbsize
    (integer) 5
  4. exists

    exists key
    
    #检查key是否存在
    
    
    127.0.0.1:6379> set a b
    OK
    127.0.0.1:6379> exists a
    (integer) 1   (1代表存在)
    127.0.0.1:6379> del a
    (integer) 1
    127.0.0.1:6379> exists a
    (integer) 0   (0代表不存在)
  5. del

    
    del key
    
    #删除指定的key-value
    
    127.0.0.1:6379> set c d
    OK
    127.0.0.1:6379> del a c
    (integer) 1  (1代表删除成功)
    127.0.0.1:6379> exists c
    (integer) 0
  6. expire,ttl,persist

    expire key seconds
    
    #key在seconds秒后过期
    
    
    ttl key
    
    #查看key剩余的过期时间
    
    
    persist key
    
    #清除key的过期时间
    
    
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> expire hello 10
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) 7
    127.0.0.1:6379> ttl hello
    (integer) -2   (-2代表已经过期,被删除)
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> expire hello 20
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) 16
    127.0.0.1:6379> persist hello
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) -1   (-1代表没有设置过期时间)
    
  7. type

    type key
    
    #返回key的类型
    
    
    127.0.0.1:6379> set str stri
    OK
    127.0.0.1:6379> type str
    string
    127.0.0.1:6379> sadd myset 1 2 3
    (integer) 3
    127.0.0.1:6379> type myset
    set
    
    
    redis的type有string,hash,list,set,zset,none
  8. 时间复杂度
命令 时间复杂度
keys O(n)
dbsize O(1)
del O(1)
exists O(1)
expire O(1)
type O(1)

数据结构

  1. 字符串

    • 键值对 key-value
    • API

      
      get key
      
      # 获取key对应的value
      
      
      set key value
      
      # 设置key-value
      
      
      del key
      
      # 删除key-value
      
      
      incr key
      
      # key自增1,如果key不存在,自增后get(key)=1
      
      
      decr key
      
      # key自减1,如果key不存在,自减后get(key)=-1
      
      
      incrby key k
      
      # key自增k,如果key不存在,自增后get(key)=k
      
      
      decr key k
      
      # key自减k,如果key不存在,自减后get(ke  y)=-k
      
      
      set key value
      
      # 不管key是否存在,都设置
      
      
      setnx key value
      
      # key不存在,才设置
      
      
      set key value xx
      
      # 当key存在,才设置
      
      
      mget key1 key2 key3 ...
      
      # 批量获取key,原子操作(相较之于多次执行单次查询,
      
      每次查询都会连接一次网络,批量操作节约了大量的网络时间)
      
      
      mset key1 value1 key2 value2 ...
      
      # 批量设置key-value
      
      
      getset key newvalue
      
      # set key newvalue并返回旧的value
      
      
      append key value
      
      # 将value追加到旧的value
      
      
      strlen key
      
      # 返回字符串的长度(注意中文)
      
      
      incrbyfloat key 3.5
      
      # 增加key对应的值3.5
      
      
      getrange key start end
      
      # 获取字符串指定下标所有的值
      
      
      setrange key index value
      
      # 设置指定下标所有对应的值
      
  2. 实战:

    1. 记录网站每个用户个人主页的访问量

      incr userid:pageview(单线程:无竞争)
    2. 缓存视频的基本信息(数据源在mysql中)伪代码

      
      public VideoInfo get(long id){
         String redisKey = redisPrefix + id;
         VideoInfo videoInfo = redis.get(redisKey);
         if(videoInfo == null){
           videoInfo = mysql.get(id);
           if(videoInfo!=null){
              //序列化
              redis.set(redisKey,serialize(videoInfo));
           }
         }
      }
    3. 分布式id生成器

      
      incr id(原子操作)
  3. 哈希

    1. key-field-value(相当于map中存的是map)
    2. API

      hget key field
      
      # 获取hash key对应的field的value
      
      
      hset key field value
      
      # 设置hash key对应的field的value
      
      
      hdel key field
      
      # 删除hash key对应的field的value
      
      
      hexists key field
      
      # 判断hash key是否有field
      
      
      hlen key
      
      # 获取hash key field的数量
      
      
      hmget key field1 field2...
      
      # 批量获取hash key的一批field对应的值
      
      
      hmset key field1 value1 field2 value2...
      
      # 批量设置hash key的一批field value
      
      
      hgetall key
      
      # 返回hash key对应所有field的和value
      
      
      hvals key
      
      # 返回hash key对应所有field的value
      
      
      hkeys key
      
      # 返回hash key对应所有的field
      
      
      hsetnx key field value
      
      # 设置hash key对应的field的value(如果field已经存在,则失败)
      
      
      hincrby key field intCounter
      
      # hash key 对应的field的value自增intCounter
      
      
      hincrbyfloat key field floatCounter
      
      # 自增浮点数
      
    3. 实战

      1. 记录个人网站主页访问量
          hincrby user:1:info pageview count
      1. 缓存视频的基本信息(数据源在mysql中)伪代码

        
        public VideoInfo get(long id){
            String redisKey = redisPrefix + id;
            Map<String,String> hashMap = redis.hgetAll(redisKey);
            VideoInfo videoInfo = transferMapToVideo(hashMap);
            if(videoInfo == null){
               videoInfo = mysql.get(id);
               if(videoInfo!=null){
              redis.hmset(redisKey,transferVideoToMap(videoInfo));     
               }
            }
            return videoInfo;
        }
  4. list

    1. key-elements
    2. API

      rpush key value1 value2...valueN
      
      # 从列表右端插入值(1-N)个
      
      
      lpush key value1 value2...valueN
      
      # 从列表左端插入值(1-N)个
      
      
      lpop key
      
      # 从列表左侧弹出一个item
      
      
      rpop key
      
      # 从列表右侧弹出一个item
      
      
      lrem key count value
      
      # 根据count值,从列表中删除所有value相等的项
      
      (1)count>0,从左到右,删除最多count个value相等的项
      (2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
      (3)count=0,删除所有value相等的项
      
      ltrim key start end
      
      # 按照索引范围修剪列表
      
      
      lrange key start end(包含end)
      
      # 获取列表指定索引范围所有item
      
      
      lindex key index
      
      # 获取列表指定索引的item
      
      
      llen key
      
      #获取列表长度
      
      
      lset key index newValue
      
      # 设置列表指定索引值为newValue
      
      
      blpop key timeout
      
      # lpop阻塞版本,timeout是阻塞超市时间,timeout=0是永远不阻塞
      
      
      brpop key timeout
      
      # rpop阻塞版本,timeout是阻塞超市时间,timeout=0是永远不阻塞
      
      
  5. 集合

    1. key-values(无序,不允许有重复元素,相当于set)
    2. API

      sadd key element
      
      # 向集合key添加element(如果element已经存在,添加失败)
      
      
      srem key element
      
      # 将集合key中的element移出掉
      
      
      scard key 
      
      # 计算集合大小
      
      
      sismember key item
      
      # 判断item是否属于集合(1存在,0不存在)
      
      
      srandmember key count
      
      # 从集合中随机取出count个元素
      
      
      spop key
      
      # 从集合中随机弹出一个元素
      
      
      smembers key
      
      # 取出集合中所有的元素(返回结果是无序的,涉及到遍历,小心使用)
      
      
      
      假设存在两个集合:
          1. s1:a,b,c
          2. s2:a,c,d
      sdiff(差集):
      sdiff s1 s2 = b
      sdiff s2 s1 = d
      
      sinter(交集):
      sinter s1 s2 = a c
      
      sunion(并集):
      sunion s1 s2 = b a d c
      
      将以上结果存储在指定集合(destkey):
      
      sdiff|sinter|sunion + store destkey
  6. 有序集合

    1. key-value(score-value)本身无序,使用score排序
    2. API

      zadd key score element(可以是多对)
      
      # 添加score和element
      
      
      zrem key element(可以是多个)
      
      # 删除元素
      
      
      zscore key element
      
      # 返回元素的分数
      
      
      zincrby key increScore element
      
      # 增加或减少元素的分数
      
      
      zcard key
      
      # 返回元素的总个数
      
      
      zrange key start end[WITHSCORES](zrevrange 倒序)
      
      # 返回指定索引范围内的升序元素[分值]
      
      
      zrangebyscore key minScore maxScore[WITHSCORES](zrevrangebyscore 倒序)
      
      # 返回指定分数范围的升序元素[分值]
      
      
      zcount key minScore maxScore
      
      # 返回有序集合内在指定分数范围内的个数
      
      
      zremrangebyrank key start end
      
      # 删除指定排名内的升序元素
      
      
      zremrangebyscore key minScore maxScore
      
      # 删除指定分数内的升序元素
      
      
      zrank key member
      
      # 获取memeber元素对应的排名(升序,zrevrank倒序)
      
      
      zinterstore destination numkey key[key...] [WEIGHTS weight] [AGGREGATE sum|min|max]
      
      # 用于对给定的有序集合执行交集运算,运算结果集存储到DESTINATION中
      
      
      # numkey是有序集合的数量;
      
      
      # WEIGHTS选项,用于指定一个乘法因子,有序集合中每个成员的SCORE值乘以该因子后,结果传递给聚合函数。并且,乘法因子的设置需要根据有序集合的个数分别指定。默认为1。
      
      
      
      # AGGREGATE选项,用于指定该交集的结果集的聚合方式。默认使用的是SUM。
      
      
      ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
      
      # 求并集
      

猜你喜欢

转载自blog.csdn.net/ticktak/article/details/82229639