redis五大数据类型与三种特殊数据类型

一.五大数据类型

1.String(字符串)

  • set/get key value

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> get name
    "ougaolasi"
    
  • exists key 判断key是否存在,存在返回1,不存在返回0

    127.0.0.1:6379> EXISTS name
    (integer) 1
    127.0.0.1:6379> exists name1
    (integer) 0  
    
  • del key

    127.0.0.1:6379> del name
    (integer) 1
    127.0.0.1:6379> get name
    (nil)
    
  • move key [0~15] 移动key到指定的数据库

  • type key 查看key的数据类型

  • expire key second 设置字段有效时间

  • ttl key 查看字段的有效时间

    127.0.0.1:6379> expire name 20
    (integer) 1 
    127.0.0.1:6379> ttl name --还剩7秒
    (integer) 7
    127.0.0.1:6379> ttl name --小于0表示失效
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    
  • rename key newkey 字段重命名

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> rename name newname
    OK
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> get newname
    "ougaolasi"
    
  • APPEND key value 向指定的key的value后追加字符串

    127.0.0.1:6379> append newname ,hello
    (integer) 15
    127.0.0.1:6379> get newname
    "ougaolasi,hello"
    
  • DECR/INCR key 将指定key的value数值进行+1/-1的原子递增

    127.0.0.1:6379> set num 0
    OK
    127.0.0.1:6379> incr num
    (integer) 1
    127.0.0.1:6379> incr num
    (integer) 2
    127.0.0.1:6379> get num
    "2"
    127.0.0.1:6379> decr num
    (integer) 1
    127.0.0.1:6379> decr num
    (integer) 0
    127.0.0.1:6379> get num
    "0"
    
  • INCRBY/DECRBY key num 按指定的步长对数值进行加减

    127.0.0.1:6379> get num
    "0"
    127.0.0.1:6379> incrby num 10
    (integer) 10
    127.0.0.1:6379> get num
    "10"
    127.0.0.1:6379> decrby num 5
    (integer) 5
    127.0.0.1:6379> get num
    "5"
    
  • STRLEN key 查看key保存值的长度

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> strlen name
    (integer) 9
    
  • GETRANGE key start end 按起止位置获取字符串[start,end] 从0开始

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> strlen name
    (integer) 9
    127.0.0.1:6379> getrange name 0 4
    "ougao"
    127.0.0.1:6379> 
    
    
  • SETRANGE key offset value 用指定的value 替换key中 offset起始位置 或者从尾部拼接,类似前面的APPEND

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> setrange name 9 hello
    (integer) 14
    127.0.0.1:6379> get name
    "ougaolasihello"
    127.0.0.1:6379> 
    
  • GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值。新建的返回null

    127.0.0.1:6379> GETSET newname ougaolasi
    (nil)
    127.0.0.1:6379> get newname
    "ougaolasi"
    127.0.0.1:6379> getset newname helloworld
    "ougaolasi"
    127.0.0.1:6379> get newname
    "helloworld"
    
    
  • SETNX key value 仅当key不存在时进行set

    127.0.0.1:6379> set name ougaolasi
    OK
    127.0.0.1:6379> setnx name hello --name 已经存在了 赋值失败
    (integer) 0
    127.0.0.1:6379> get name 
    "ougaolasi"
    127.0.0.1:6379> setnx name1 hello
    (integer) 1
    127.0.0.1:6379> get name1
    "hello"
    
  • SETEX key seconds value 创建一个键值对并设置它的有效期(秒)

    127.0.0.1:6379> setex name 20 ougaolasi
    OK
    127.0.0.1:6379> get name
    "ougaolasi"
    127.0.0.1:6379> ttl name
    (integer) 8
    127.0.0.1:6379> get name
    (nil)
    
  • MSET(MGET) key1 value1 [key2 value2..] 批量设置(获取)键值对

    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
    OK
    127.0.0.1:6379> mget k1 k2 k3
    1) "v1"
    2) "v2"
    3) "v3"
    
  • MSETNX key1 value1 [key2 value2..] 批量设置键值对,仅当参数中所有的key都不存在时执行(原子性,有一个失败就全部失败)

    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3
    (integer) 0
    127.0.0.1:6379> keys *
    1) "k1"
    
    
    拓展:
    127.0.0.1:6379> msetnx user:1:name zhangsan user:1:age 3
    (integer) 1
    127.0.0.1:6379> mget user:1:name user:1:age
    1) "zhangsan"
    2) "3"
    127.0.0.1:6379> keys *
    1) "user:1:name"
    2) "user:1:age"
    

2.List(列表)

  • LPUSH/RPUSH key value1[value2..]

  • LRANGE key start end 获取list[start,end]的元素

    ##############################
    lpush插入 查询是倒序的。
    127.0.0.1:6379> lpush list one
    (integer) 1
    127.0.0.1:6379> lpush list two
    (integer) 2
    127.0.0.1:6379> lpush list three
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    
    ##############################
    lpush插入 查询是正序的。
    127.0.0.1:6379> rpush list1 one
    (integer) 1
    127.0.0.1:6379> rpush list1 two
    (integer) 2
    127.0.0.1:6379> rpush list1 three
    (integer) 3
    127.0.0.1:6379> lrange list1 0 -1
    1) "one"
    2) "two"
    3) "three"
    127.0.0.1:6379> 
    
  • LINSERT key BEFORE|AFTER pivot value 在指定元素的前面或者后面插入元素

    127.0.0.1:6379>  lrange list1 0 -1
    1) "one"
    2) "two"
    3) "three"
    127.0.0.1:6379> linsert list1 before two four  
    (integer) 4
    127.0.0.1:6379>  lrange list1 0 -1
    1) "one"
    2) "four"
    3) "two"
    4) "three"
    
  • LLEN key 查看list的长度

  • LINDEX key index 通过索引获取list的元素

  • LSET key index value 根据索引更新元素的值,不存在会报错。

    127.0.0.1:6379>  lrange list1 0 -1
    1) "one"
    2) "four"
    3) "two"
    4) "three"
    
    127.0.0.1:6379> llen list1
    (integer) 4
    
    127.0.0.1:6379> lindex list1 1
    "four"
    
    127.0.0.1:6379> lset list1 1 five
    OK
    127.0.0.1:6379> lrange list1 0 -1
    1) "one"
    2) "five"
    3) "two"
    4) "three"
    
    
  • LPOP/RPOP key 移除list左边或者右边的元素

  • RPOPLPUSH source destination 移除目标列表的右边的元素并添加到到x新列表的第一个元素

    127.0.0.1:6379> lrange list1 0 -1
    1) "one"
    2) "five"
    3) "two"
    4) "three"
    127.0.0.1:6379> lpop list1
    "one"
    127.0.0.1:6379> lrange list1 0 -1
    1) "five"
    2) "two"
    3) "three"
    
    127.0.0.1:6379> rpoplpush list1 list2 
    "three"
    127.0.0.1:6379> lrange list1 0 -1
    1) "five"
    2) "two"
    127.0.0.1:6379> lrange list2 0 -1
    1) "three"
    
  • LTRIM key start end 通过list的下标截取元素并改变原来的list

    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    2) "two"
    3) "three"
    4) "four"
    5) "five"
    127.0.0.1:6379> ltrim list 1 3
    OK
    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    2) "three"
    3) "four"
    
    
  • 拓展 实现消息队列 lpush 与 rpop

    127.0.0.1:6379> lpush mq v1
    (integer) 1
    127.0.0.1:6379> lpush mq v2
    (integer) 2
    127.0.0.1:6379> lpush mq v3
    (integer) 3
    127.0.0.1:6379> rpop mq
    "v1"
    127.0.0.1:6379> rpop mq
    "v2"
    127.0.0.1:6379> rpop mq
    "v3"
    这样就能现实消息队列了。按先进先出的顺序取到消息。
    

3.set(无序不可重复)

  • SADD key member1[member2..] 向集合set中添加一个或多个不重复的元素

  • SCARD key 获取set集合中元素的个数

  • SMEMBERS key 返回set集合中的所有元素

  • SISMEMBER key member 判断某个元素是否是set集合中的元素

    127.0.0.1:6379> sadd set1 one
    (integer) 1
    
    127.0.0.1:6379> sadd set1 two three four
    (integer) 3
    
    127.0.0.1:6379> scard set1
    (integer) 4
    
    127.0.0.1:6379> smembers set1
    1) "four"
    2) "three"
    3) "one"
    4) "two"
    
    127.0.0.1:6379> sismember set1 one --1是存在 0是不存在
    (integer) 1
    127.0.0.1:6379> sismember set seven
    (integer) 0
    
    
  • SRANDMEMBER key [count] 随机返回set集合中的count个元素 ,count 默认为1

    127.0.0.1:6379> smembers set1
    1) "four"
    2) "three"
    3) "one"
    4) "two"
    127.0.0.1:6379> srandmember set1
    "one"
    127.0.0.1:6379> srandmember set1
    "four"
    127.0.0.1:6379> srandmember set1 2
    1) "three"
    2) "two"
    
    
  • SPOP key [count] 随机弹出并删除set集合中的count个元素,count的默认值为1

    127.0.0.1:6379> smembers set1
    1) "four"
    2) "three"
    3) "one"
    4) "two"
    127.0.0.1:6379> spop set1
    "two"
    127.0.0.1:6379> spop set1 2
    1) "three"
    2) "one"
    127.0.0.1:6379> SMEMBERS set1
    1) "four"
    
  • SMOVE source destination member 将source集合的元素member移动到destination集和中

  • SREM key member1[member2..] 移除指定的一个或多个元素

    127.0.0.1:6379> smembers set1
    1) "four"
    2) "three"
    3) "one"
    4) "two"
    5) "five"
    127.0.0.1:6379> smove set1 set2 three --set2不存在就新建
    (integer) 1
    127.0.0.1:6379> smembers set2
    1) "three"
    127.0.0.1:6379> smembers set1
    1) "one"
    2) "two"
    3) "four"
    4) "five"
    127.0.0.1:6379> srem set1 one four
    (integer) 2
    127.0.0.1:6379> smembers set1
    1) "two"
    2) "five"
    
    
  • SDIFF key1[key2..] 获得以key1为参照,取差集

  • SDIFFSTORE destination key1[key2..] 将key1和key2…的差集保存在destination集合中,destination原有的数据会被删除,只保留差集的结果

    127.0.0.1:6379> sadd set a b c d
    (integer) 4
    127.0.0.1:6379> sadd set1 a b e f
    (integer) 4
    127.0.0.1:6379> sdiff set set1
    1) "c"
    2) "d"
    
    127.0.0.1:6379> sadd set a b c d
    (integer) 4
    127.0.0.1:6379> sadd set1 a b e f
    (integer) 4
    127.0.0.1:6379> sdiff set set1
    1) "c"
    2) "d"
    
    
  • SINTER key1 [key2..] 交集

  • SINTERSTORE destination key1[key2..] 和SDIFFSTORE一样,返回的交集的结果覆盖到集合destination里面去

    127.0.0.1:6379> sinter set set1
    1) "b"
    2) "a"
    127.0.0.1:6379> sinterstore set3 set set1
    (integer) 2
    127.0.0.1:6379> smembers set3
    1) "b"
    2) "a"
    
  • SUNION key1 [key2..] 并集

  • SUNIONSTORE destination key1 [key2..] 取得多个集合并集的结果覆盖到destination集合中

    127.0.0.1:6379> sunion set set1
    1) "b"
    2) "e"
    3) "c"
    4) "a"
    5) "d"
    6) "f"
    
    127.0.0.1:6379> sunionstore set4 set set1
    (integer) 6
    127.0.0.1:6379> smembers set4
    1) "b"
    2) "e"
    3) "c"
    4) "a"
    5) "d"
    6) "f"
    

###4.Hash(哈希)

Hash的存储结构为:key-map,与String的命令大多相似

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。重复设置同一个field会覆盖,返回0

  • HGET key field value 获取存储在哈希表中指定字段的值

    127.0.0.1:6379> hset myhash name ougaolasi
    (integer) 1
    127.0.0.1:6379> hset myhash name ougao
    (integer) 0
    127.0.0.1:6379> hget myhash name
    "ougao"
    
  • HMSET key field1 value1 [field2 value2..] 和String一样,同时设置多个字段的值

    127.0.0.1:6379> hmset myhash age 18 sex 1
    OK
    127.0.0.1:6379> hget myhash
    127.0.0.1:6379> hmget myhash age
    1) "18"
    
  • HSETNX key field value 当field不存在的时候才会添加成功

  • HMGET key field1 [field2..] 获取存储在哈希表中多个指定字段的值

  • HGETALL key 获取在哈希表key 的所有字段和值

    127.0.0.1:6379> hgetall myhash
    1) "name"
    2) "ougao"
    3) "age"
    4) "18"
    5) "sex"
    6) "1"
    
  • HKEYS key 获取哈希表key中所有的字段

  • HVALS key 获取哈希表中所有值

  • HLEN key 获取哈希表中字段的数量

  • HDEL key field1 [field2..] 删除哈希表key中一个/多个field字段

    127.0.0.1:6379> hdel  myhash age sex
    (integer) 2
    127.0.0.1:6379> hgetall myhash
    1) "name"
    2) "ougao"
    
  • HINCRBY key field n 和String一样这个数值加n

    127.0.0.1:6379> hset myhash num 1
    (integer) 1
    127.0.0.1:6379> hincrby myhash num 5
    (integer) 6
    127.0.0.1:6379> hincrby myhash num -3
    (integer) 3
    
  • 可以使用hash来存储对象

    127.0.0.1:6379> hmset user:1 name gsh age 26 height 173
    OK
    127.0.0.1:6379>  hmget user:1 name age height
    1) "gsh"
    2) "26"
    3) "173"
    

5.ZSet(有序集合)

ZSet 和Set差不多,ZSe的每个元素都会关联一个double类型的分数(score)。

  • ZADD key score member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的值

  • ZCARD key 查看有序集合中的元素数量

  • ZCOUNT key min max 返回有序集合中指定区间score的成员数

  • ZINCRBY key n member 有序集合中对指定成员的分数加上增量 n

  • ZSCORE key member 返回有序集中,指定元素的分数值

  • ZRANK key member 返回有序集合中指定成员的索引

    127.0.0.1:6379> zadd myset 2000 zhangsan 3000 lisi 4000 zhaoliu
    (integer) 3
    
    127.0.0.1:6379> zcard myset
    (integer) 3
    
    127.0.0.1:6379> zcount myset 2000 3000
    (integer) 2
    
    127.0.0.1:6379> zincrby myset 600 zhaoliu
    "4600"
    
    127.0.0.1:6379> zscore myset zhaoliu
    "4600"
    
    127.0.0.1:6379> zrank myset zhaoliu
    (integer) 2
    
  • ZRANGE key start end 根据索引区间查看元素

    127.0.0.1:6379> zrange myset 0 -1  --查看所有元素
    1) "zhangsan"
    2) "lisi"
    3) "zhaoliu"
    127.0.0.1:6379> zrange myset 0 -1 withscores -查看元素以及他们的值
    1) "zhangsan"
    2) "2000"
    3) "lisi"
    4) "3000"
    5) "zhaoliu"
    6) "4600"
    
  • ZRANGEBYSCORE key min max 升序通过分数返回有序集合指定区间内的成员 -inf 和 +inf分别表示最小最大值

  • ZREVRANGEBYSCORRE key max min 降序根据给定的scores的区间的值按照降序排序 -inf 和 +inf

  • ZREVRANGE key start end 返回有序集中指定区间内的成员,通过索引,分数从高到底

    升序:
    127.0.0.1:6379> zrangebyscore myset -inf +inf
    1) "zhangsan"
    2) "lisi"
    3) "zhaoliu"
    127.0.0.1:6379> zrangebyscore myset -inf +inf withscores --带上他们的分数
    1) "zhangsan"
    2) "2000"
    3) "lisi"
    4) "3000"
    5) "zhaoliu"
    6) "4600"
    
    降序:
    127.0.0.1:6379> zrevrangebyscore myset +inf -inf withscores
    1) "zhaoliu"
    2) "4600"
    3) "lisi"
    4) "3000"
    5) "zhangsan"
    6) "2000"
    也是降序:
    127.0.0.1:6379> zrevrange myset 0 -1 withscores
    1) "zhaoliu"
    2) "6000"
    3) "lisi"
    4) "5000"
    5) "zhangsan"
    6) "4000"
    
  • ZREMRANGEBYLEX key - + 删除所有的成员

  • ZREMRANGEBYRANK key start stop 在升序好了的数据根据下标的索引区间删除数据

  • ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员

    127.0.0.1:6379> zremrangebyrank myset 0 1 --根据下标来删除
    (integer) 2
    127.0.0.1:6379> zrevrangebyscore myset +inf -inf withscores
    1) "zhaoliu"
    2) "4600"
    
    

二.三种特殊数据类型

1.Geospatial(地理位置)

将指定的地理空间位置(经度、纬度、名称)添加到指定的key中

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

基本命令

  • geoadd key longitud latitude member [..] 将具体经纬度的坐标存入一个有序集合

  • geopos key member [member..] 获取集合中的一个/多个成员坐标

  • georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] 以给定的经纬度为中心, withcoord 经纬度,withdist 距离 withhash 哈希值 越相近距离越近 count 取出最近的个数 。

  • GEORADIUSBYMEMBER key member radius... 功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。

  • geohash key member1 [member2..] 返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。

    127.0.0.1:6379> geoadd fujian  119.303 26.071 fuzhou
    (integer) 1
    127.0.0.1:6379> geoadd fujian  118.07 24.445 xiamen
    (integer) 1
    127.0.0.1:6379> geoadd fujian  119.533 26.683 ningde
    (integer) 1
    127.0.0.1:6379> geoadd fujian  119.022 25.451 putian
    (integer) 1
    
    127.0.0.1:6379> geopos fujian fuzhou # 获得一个或多个城市的经纬度
    1) 1) "119.30300205945968628"
       2) "26.07099995307816442"
       
    127.0.0.1:6379> georadius fujian 119 26 100 km withcoord 
    1) 1) "putian"
       2) 1) "119.02199774980545044"
          2) "25.4509995533403881"
    2) 1) "fuzhou"
       2) 1) "119.30300205945968628"
          2) "26.07099995307816442"
    3) 1) "ningde"
       2) 1) "119.53300148248672485"
          2) "26.68300077283708305"
          
    127.0.0.1:6379> georadius fujian 119 26 100 km withcoord withdist  
    1) 1) "putian"
       2) "61.1031"
       3) 1) "119.02199774980545044"
          2) "25.4509995533403881"
    2) 1) "fuzhou"
       2) "31.2946"
       3) 1) "119.30300205945968628"
          2) "26.07099995307816442"
    3) 1) "ningde"
       2) "92.7017"
       3) 1) "119.53300148248672485"
          2) "26.68300077283708305"
          
    127.0.0.1:6379> geohash fujian fuzhou putian  -- 返回一个城市的hash编码,编码越相似表示距离越近
    1) "wssu6f1f960"
    2) "wss8u3jnvd0"
    
    

2.Hyperloglog(基数统计)

HyperLogLog 是用来做基数(去重后的元素个数)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

基本命令:

  • PFADD key element1 [elememt2..] 添加指定元素到 HyperLogLog 中

  • PFCOUNT key [key] 返回给定 HyperLogLog 的基数估算值。

  • PFMERGE destkey sourcekey [sourcekey..] 将多个 HyperLogLog 合并为一个 HyperLogLog

    127.0.0.1:6379> pfadd hlist a b c d e f
    (integer) 1
    127.0.0.1:6379> pfadd hlist1 e f g h i j k
    (integer) 1
    127.0.0.1:6379> pfcount hlist
    (integer) 6
    127.0.0.1:6379> pfmerge hlist2 hlist hlist1 --取并集
    OK
    127.0.0.1:6379> pfcount hlist2
    (integer) 11
    
    

3.BitMaps(位图)

使用位存储,信息状态只有 0 和 1

Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset)。多用于打卡签到之内的统计事情。

基本命令:

  • setbit key offset value 为指定key的offset位设置值

  • getbit key offset 获取offset位的值

  • bitcount key [start end] 统计字符串被设置为1的bit数,也可以指定统计范围按字节

    127.0.0.1:6379> setbit week 1 1 
    (integer) 0
    127.0.0.1:6379> setbit week 2 0
    (integer) 0
    127.0.0.1:6379> setbit week 3 0
    (integer) 0
    127.0.0.1:6379> setbit week 4 0
    (integer) 0
    127.0.0.1:6379> setbit week 5 1
    (integer) 0
    127.0.0.1:6379> setbit week 6 1
    (integer) 0
    127.0.0.1:6379> setbit week 7 1 -- 看周天的打卡情况
    (integer) 0
    127.0.0.1:6379> getbit week 5
    (integer) 1
    127.0.0.1:6379> bitcount week 0 -1 统计非0数据 可以用来统计打卡
    (integer) 4
    
    127.0.0.1:6379> setbit week 0 2  -- 非 0 1 的数据   会报错
    (error) ERR bit is not an integer or out of range
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值