zoukankan      html  css  js  c++  java
  • reids学习redis的五种基本数据类型

    前言

    前面学习了redis的安装,今天来学习redis的基本数据类型。

    基本数据类型

    redis有5种基本数据类型:String、Hash、List、Set、ZSet,下文将对5种基本数据类型的特性和常用方法进行学习。

    String

    String类型是包含很多种数据类型的特殊类型,并且是二进制安全的。可以是简单的字符串、数值等,也可以是序列化对象或者图片的二进制存储。基本操作包含以下方法,更多方法参考官方文档

    • get/set/del

      设置值:set key value

      获取值:get key

      删除值:del key

      127.0.0.1:6379> keys *
      (empty list or set)
      127.0.0.1:6379> set name zmc
      OK
      127.0.0.1:6379> get name
      "zmc"
      127.0.0.1:6379> del name
      (integer) 1
      127.0.0.1:6379> keys *
      (empty list or set)
      
    • setnx key value ()

      即set not exist 设定未存在,后设定的值会替换先设定的值。使用setxn,当key不存在时进行设置,存在时返回0 。

      127.0.0.1:6379> set name zmc
      OK
      127.0.0.1:6379> get name 
      "zmc"
      127.0.0.1:6379> set name RzZ
      OK
      127.0.0.1:6379> get name
      "RzZ"
      127.0.0.1:6379> get name 
      "RzZ"
      127.0.0.1:6379> setnx name zmc
      (integer) 0
      127.0.0.1:6379> get name
      "RzZ"
      127.0.0.1:6379> 
      
    • setex key seconds value

      即expired 设置过期时间,超过过期时间后返回nil

      127.0.0.1:6379> setex name 10 zmc
      OK
      127.0.0.1:6379> get name
      "zmc"
      #等10秒
      127.0.0.1:6379> get name
      (nil)
      
    • setrange key offset value

      替换字符串,从下标offset开始替换为value值(下标从0 开始)

      127.0.0.1:6379> set id_no 412728202008031234 
      OK
      127.0.0.1:6379> get id_no
      "412728202008031234"
      127.0.0.1:6379> setrange id_no 6 ********
      (integer) 18
      127.0.0.1:6379> get id_no
      "412728********1234"
      127.0.0.1:6379>
      
    • mset/mget

      一次性设置或获取多个值

      127.0.0.1:6379> mset name zmc age 0 id_no 1234567
      OK
      127.0.0.1:6379> keys *
      1) "id_no"
      2) "age"
      3) "name"
      127.0.0.1:6379> mget name age id_no
      1) "zmc"
      2) "0"
      3) "1234567"
      
    • getset key value

      获取旧值并设置新值(理解不到有什么使用场景?)

      127.0.0.1:6379> set name RzZ
      OK
      127.0.0.1:6379> get name
      "RzZ"
      127.0.0.1:6379> getset name zmc
      "RzZ"
      127.0.0.1:6379> get name
      "zmc"
      
    • incr/decr/incr by/decr by

      incr/decr key数值递增/递减。

      incr by/decr by key increment/decrement带步长的递增/递减。

      127.0.0.1:6379> incr age
      (integer) 1
      127.0.0.1:6379> decr age
      (integer) 0
      
      127.0.0.1:6379> incrby age 10
      (integer) 10
      127.0.0.1:6379> decrby age 10
      (integer) 0
      
    • append

      字符串追加方法。

      127.0.0.1:6379> append id_no ch
      (integer) 9
      127.0.0.1:6379> get id_no
      "1234567ch"
      
    • strlen

      获取字符串长度。

      127.0.0.1:6379> strlen id_no
      (integer) 9
      

    Hash

    Hash可以理解为Java中的Map类型,是一种String类型的字段field和值value的映射表。基本操作包含以下方法,更多方法参考官方文档

    • hset/hget

      和String数据类型一样,设定和获取值。

      #hset key field value设定对象key的field字段值为value。
      127.0.0.1:6379> hset usr1 name zmc
      (integer) 1
      127.0.0.1:6379> hset usr1 age 10
      (integer) 1
      
      #hget key field 获取对象key的field字段值。
      127.0.0.1:6379> hget usr1 name
      "zmc"
      127.0.0.1:6379> hget usr1 age
      "10"
      
    • hmset/hmget

      同上,使用hmset和hmget批量操作Hash数据。

      #hmset key field value [field value ... ]
      127.0.0.1:6379> hmset usr2 name RzZ age 9
      OK
      
      #hmget key field [field ... ]
      127.0.0.1:6379> hmget usr2 name age
      1) "RzZ"
      2) "9"
      
    • hincrby/hdecrby key field increment/decrement 字段递增/递减,用法同String。

    • hsetnx key field value 不存在则设定值,用法同String。

    • hexists key field 判断该字段是否存在。

    • hlen key 获取hash值对数。

    • hdel key field [field ... ]删除指定hash的指定field,可批量删除。

    • hkeys key 返回hash的键集合。

    • hvals key 返回hash的值集合。

    • hgetall key 返回hash的所有键值对,注意查询结果奇数结果为键,偶数为值。

      127.0.0.1:6379> hgetall usr1
      1) "name"
      2) "zmc"
      3) "age"
      4) "10"
      

    List

    list是一个链表结构的集合,类似于Java中的Queue,主要有push、pop、获取元素等操作。list中元素是可以重复的。基本操作包含以下方法,更多用法参考官方文档

    • lrange key start stop

      获取list的指定元素。lrange 0 -1可以获取list所有元素。

    • lpush key value [value ... ]

      从头部插入元素,先进后出(栈)。

    • rpush key value [value ...]

      从尾部插入元素,先进先出(队列)。

      # lpush,先进后出
      127.0.0.1:6379> lpush list1 one
      (integer) 1
      127.0.0.1:6379> lpush list1 two
      (integer) 2
      
      # lrange,查看元素
      127.0.0.1:6379> lrange list1 0 -1
      1) "two"
      2) "one"
      
      # rpush,先进先出
      127.0.0.1:6379> rpush list2 one
      (integer) 1
      127.0.0.1:6379> rpush list2 two
      (integer) 2
      127.0.0.1:6379> lrange list2 0 -1
      1) "one"
      2) "two"
      
    • linsert key [before|after] pivot vlue

      在指定元素之前或之后插入元素。

      127.0.0.1:6379> rpush list3 one
      (integer) 1
      127.0.0.1:6379> rpush list3 two
      (integer) 2
      127.0.0.1:6379> lrange list3 0 -1
      1) "one"
      2) "two"
      # 在two之前插入three
      127.0.0.1:6379> linsert list3 before two three
      (integer) 3
      127.0.0.1:6379> lrange list3 0 -1
      1) "one"
      2) "three"
      3) "two"
      # 在three之后插入four
      127.0.0.1:6379> linsert list3 after three four
      (integer) 4
      127.0.0.1:6379> lrange list3 0 -1
      1) "one"
      2) "three"
      3) "four"
      4) "two"
      
    • lset key index value

      将指定下标的元素进行替换。

    • lrem key count value

      删除元素,返回受影响个数。

      127.0.0.1:6379> lrange list4 0 -1
      1) "4"
      2) "3"
      3) "2"
      4) "1"
      127.0.0.1:6379> 
      
      # lset 元素替换,将下标为3的元素替换成2
      127.0.0.1:6379> lset list4 3 2
      OK
      127.0.0.1:6379> lrange list4 0 -1
      1) "4"
      2) "3"
      3) "2"
      4) "2"
      
      # lrem,删除前两个数字2
      127.0.0.1:6379> lrem list4 2 2
      (integer) 2
      127.0.0.1:6379> lrange list4 0 -1
      1) "4"
      2) "3"
      
    • ltrim key start stop

      保留指定范围内的元素。

    • lpop

      从list的头部删除元素。

    • rpop

      从list的尾部删除元素。

    • rpoplpush source destination

      从source 尾部删除元素并从destination首部追加该元素。

      127.0.0.1:6379> lrange list5 0 -1
      1) "0"
      2) "1"
      3) "2"
      4) "3"
      5) "4"
      6) "5"
      7) "6"
      8) "7"
      # ltrim 保留下标1-6的元素
      127.0.0.1:6379> ltrim list5 1 6
      OK
      127.0.0.1:6379> lrange list5 0 -1
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "6"
      # lpop 删除list的第一个元素:1
      127.0.0.1:6379> lpop list5
      "1"
      # rpop 删除list的最后一个元素:6
      127.0.0.1:6379> rpop list5
      "6"
      127.0.0.1:6379> lrange list5 0 -1
      1) "2"
      2) "3"
      3) "4"
      4) "5"
      # rpoplpush 删除最后一个元素5,并在头部插入该元素
      127.0.0.1:6379> rpoplpush list5 list5
      "5"
      127.0.0.1:6379> lrange list5 0 -1
      1) "5"
      2) "2"
      3) "3"
      4) "4"
      
    • lindex

      返回list中index位置的元素。

    • llen

      返回list长度,即元素个数。

    # llen获取list长度
    127.0.0.1:6379> llen list5
    (integer) 4
    # lindex 获取第0个元素
    127.0.0.1:6379> lindex list5 0
    "5"
    

    set

    set是string数据类型的一个无序集合,set是通过hashtable实现的,可以对集合取交集、并集、差集等。基本操作包含以下方法,更多用法参考官方文档

    • smembers key

      查看集合内容

    • sadd key member [member ... ]

      添加元素。

    • srem key member [member ... ]

      删除元素。

    • spop key [count]

      随机返回删除的key。

      # sadd
      127.0.0.1:6379> sadd set1 1 2 3 4 5 6 7 8 9 10
      (integer) 10
      # smembers 
      127.0.0.1:6379> smembers set1
       1) "1"
       2) "2"
       3) "3"
       4) "4"
       5) "5"
       6) "6"
       7) "7"
       8) "8"
       9) "9"
      10) "10"
      # srem 移出元素1
      127.0.0.1:6379> srem set1 1
      (integer) 1
      127.0.0.1:6379> smembers set1
      1) "2"
      2) "3"
      3) "4"
      4) "5"
      5) "6"
      6) "7"
      7) "8"
      8) "9"
      9) "10"
      # spop移出一个元素
      127.0.0.1:6379> spop set1
      "5"
      # spop移出两个元素
      127.0.0.1:6379> spop set1 2
      1) "10"
      2) "8"
      127.0.0.1:6379> smembers set1
      1) "2"
      2) "3"
      3) "4"
      4) "6"
      5) "7"
      6) "9"
      
      
    • sdiff(差集)

      返回两个集合的不同元素,以前一个集合为基准。

    • sdiffstore destination

      将返回的不同元素存储在另一个集合里。

      127.0.0.1:6379> smembers set1
      1) "2"
      2) "3"
      3) "4"
      4) "6"
      5) "7"
      6) "9"
      127.0.0.1:6379> smembers set2
      1) "2"
      2) "4"
      3) "6"
      4) "8"
      5) "10"
      127.0.0.1:6379> sdiff set1 set2
      1) "3"
      2) "7"
      3) "9"
      127.0.0.1:6379> sdiff set2 set1
      1) "8"
      2) "10"
      
      127.0.0.1:6379> sdiffstore set3 set1 set2
      (integer) 3
      127.0.0.1:6379> smembers set3
      1) "3"
      2) "7"
      3) "9"
      
      
    • sinter(交集)

      取set的交集。

    • sinterstore destination key [key]

      取set的交集并存放在destination集合中。

      127.0.0.1:6379> sadd set3 1 2 3 4 5 6
      (integer) 6
      127.0.0.1:6379> sadd set4 2 4 6
      (integer) 3
      # sinter取交集
      127.0.0.1:6379> sinter set3 set4
      1) "2"
      2) "4"
      3) "6"
      # sinterstore
      127.0.0.1:6379> sinterstore set5 set3 set4
      (integer) 3
      127.0.0.1:6379> smembers set5
      1) "2"
      2) "4"
      3) "6"
      
    • sunion(并集)

      取set的并集。

    • sunionstore destination key [key]

      取set的并集,并存放在另外一个集合中。

      127.0.0.1:6379> sadd set6 1 2 3
      (integer) 3
      127.0.0.1:6379> sadd set7 4 5 6
      (integer) 3
      # sunion取set6 和set7的并集
      127.0.0.1:6379> sunion set6 set7
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "6"
      # sunionstore将set6和set7的并集访入set8中
      127.0.0.1:6379> sunionstore set8 set6 set7
      (integer) 6
      127.0.0.1:6379> smembers set8
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "6"
      
    • smove source destination member

      移动元素,从set1移动到set2中。

    • scard

      查看集合里元素个数。

    • sismember

      判读某元素是否为集合内的元素,是返回1,否返回0。

    • srandmember

      随机返回一个元素。

      # scard查看set8中的元素个数
      127.0.0.1:6379> scard set8
      (integer) 6
      127.0.0.1:6379> smembers set8
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      5) "5"
      6) "6"
      # smove 将set6中的元素1转移到set7中
      ## 移动前
      127.0.0.1:6379> smembers set6
      1) "1"
      2) "2"
      3) "3"
      127.0.0.1:6379> smembers set7
      1) "4"
      2) "5"
      3) "6"
      
      127.0.0.1:6379> smove set6 set7 1
      (integer) 1
      ## 移动后
      127.0.0.1:6379> smembers set6
      1) "2"
      2) "3"
      127.0.0.1:6379> smembers set7
      1) "1"
      2) "4"
      3) "5"
      4) "6"
      # sismember判断元素1在哪个set内
      127.0.0.1:6379> sismember set6 1
      (integer) 0
      127.0.0.1:6379> sismember set7 1
      (integer) 1
      # srandmember
      127.0.0.1:6379> srandmember set7
      "5"
      127.0.0.1:6379> smembers set7
      1) "1"
      2) "4"
      3) "5"
      4) "6"
      
      

    zset

    zset是set集合的有序版本,每个元素关联一个double类型的分数,通过分数对集合元素进行排序,元素不可重复,分数可以重复。

    zset的特性可以轻松实现按权重排序,可以实现结果排序、rank值等功能,基本操作包含以下方法,通过前面的学习可以很容易推测出用法,在此不再逐一测试。更多用法参考官方文档

    • zadd

      zset中插入元素,指定序号及分数,在重复插入时会根据分数属性更新。

    • zrem

      删除元素。

    • zincrby

      已指定步长递增。

    • zrangebyscore

      获取指定区间的元素。

    • zremrangebyrank

      删除索引为1的元素。

    • zremrangebyscore

      删除指定序号的元素。

  • 相关阅读:
    android 多线程
    Uva 10881 Piotr’s Ants 蚂蚁
    LA 3708 Graveyard 墓地雕塑 NEERC 2006
    UVa 11300 Spreading the Wealth 分金币
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    HDU 4162 Shape Number
    HDU 1869 六度分离
    HDU 1041 Computer Transformation
    利用可变参数函数清空多个数组
  • 原文地址:https://www.cnblogs.com/bcomll/p/13441915.html
Copyright © 2011-2022 走看看