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

    删除指定序号的元素。

posted @ 2020-08-05 18:50  bcom  阅读(279)  评论(0编辑  收藏  举报