NoSQL之 Redis的五大数据类型的详细介绍

Posted 码海小虾米_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoSQL之 Redis的五大数据类型的详细介绍相关的知识,希望对你有一定的参考价值。

在这里插入图片描述


Redis的五大数据类型也称五大数据对象;了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象:字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。


一、String数据类型(字符串对象)

概述:String是 redis 最基本的类型,最大能存储 512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等.

1.1 SET/GET/APPEND/ STRLEN

APPEND key value追加键值,并返回追加后的长度(若键不存在,则相当于创建)

redis-cli 
redis 127.0.0.1:6379> exists mykey             		#判断该键是否存在,存在返回1,否则返回0
(integer) 0
redis 127.0.0.1:6379> append mykey "hello"     		#该键并不存在,因此append命令返回当前Value的长度。
(integer) 5
redis 127.0.0.1:6379> append mykey " world"  	    #该键已经存在,因此返回追加后Value的总长度。
(integer) 11
redis 127.0.0.1:6379> get mykey             	    #通过get命令获取该键,以判断append的结果。
"hello world"
redis 127.0.0.1:6379> set mykey "this is a test!"   #通过set命令为键设置新值,并覆盖原有值。
OK
redis 127.0.0.1:6379> get mykey
"this is a test!"
redis 127.0.0.1:6379> strlen mykey           	    #获取指定Key的字符长度。
(integer) 14

在这里插入图片描述

1.2 INCR/DECR/INCRBY/DECRBY

INCR key:key值递增加1(key值必须为整数)

DECR key:key值递增减1(key值必须为整数)

redis 127.0.0.1:6379> set mykey 20           #设置Key的值为20
OK
redis 127.0.0.1:6379> incr mykey             #该Key的值递增1
(integer) 21
redis 127.0.0.1:6379> decr mykey             #该Key的值递减1
(integer) 20
redis 127.0.0.1:6379> del mykey              #删除已有键。返回1说明删除成功
(integer) 1
redis 127.0.0.1:6379> decr mykey             #对空值执行递减操作,其原值被设定为0,递减后的值为-1
(integer) -1
redis 127.0.0.1:6379> del mykey
(integer) 1
redis 127.0.0.1:6379> incr mykey             #对空值执行递增操作,其原值被设定为0,递增后的值为1
(integer) 1
redis 127 .0.0.1:6379> set mykey test       #将该键的Value设置为不能转换为整型的普通字符串。
OK
redis 127.0.0.1:6379> incr mykey
(error) ERR value is not an integer or out of range 
redis 127.0.0.1:6379> set mykey 100
OK
redis 127.0.0.1:6379> decrby mykey 10         #减少指定的整数
(integer) 90
redis 127.0.0.1:6379> incrby mykey 20        #增加指定的整数
(integer) 110

在这里插入图片描述

1.3 GETSET

GETSET key value:获取key值并返回,同时给key设置新值。

redis 127.0.0.1:6379> incr mytest      #将计数器的值原子性的递增1
(integer) 1
redis 127.0.0.1:6379> getset mytest 0  #在获取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成。
redis 127.0.0.1:6379> get mytest       #查看设置后的结果。
"0" 

在这里插入图片描述

1.4 SETEX

SETEX key seconds value:设置指定key的过期时间为seconds。

redis 127.0.0.1:6379> setex mytest 20 "test setex"      #设置指定Key的过期时间为20秒。
redis 127.0.0.1:6379> ttl mytest          #通过tt1命令查看指定Key的剩余存活时间(秒数),-2代表过期,-1表示永不过期。
(integer) 10
redis 127.0.0.1:6379> get mytest          #在该键的存活期内我们仍然可以获取到它的Value。
"hello"
redis 127.0.0.1:6379> ttl mytest          #该ttl命令的返回值显示,该Key已经过期。
(integer) -2
redis 127.0.0.1:6379> get mytest          #获取已过期的Key将返回nil
(nil)

在这里插入图片描述

1.5 SETNX

SETNX key value:不存在键的话执行set操作,存在的话不执行

redis 127 .0.0.1:6379> del mytest              #删除该键,以便于下面的测试验证。
(integer) 1
redis 127.0.0.1:6379> setnx mytest "hello"     #该键并不存在,因此setnx命令执行成功。
(integer) 1
redis 127.0.0.1:6379> setnx mytest "world"     #该键已经存在,因此本次设置没有产生任何效果。
(integer) 0
redis 127 .0.0.1:6379> get mytest              #从结果可以看出,返回的值仍为第一次设置的值。
"hello"

在这里插入图片描述

1.6 MSET/MGET/MSETNX

MSET key value [ key value …] :批量设置键-值对

MGET key [ key …] :批量获取键值对

MSETNX key value [ key value …] :批量设置键值对,都不存在就执行并返回1,只要有一个存在就不执行并返回0

redis 127.0.0.1:6379> mset key1 "hello" key2 "world"    #批量设置了key1和key2两个键。
redis 127.0.0.1:6379> mget key1 key2                    #批量获取了key1和key2两个键的值。
1) "hello"
2) "world"
redis 127.0.0.1:6379> msetnx key3 "zhang" key4 "san"    #批量设置了key3和key4两个键,因为之前他们并不存在,所以msetnx命令执行成功并返回1
(integer) 1
redis 127.0.0.1:6379> mget key3 key4
1) "zhang"
2) "san"
redis 127.0.0.1:6379> msetnx key3 "hello" key5 "world"   #批量设置了key3和key5两个键,但是key3已经存在,所以msetnx命令执行失败并返回0
(integer) 0
redis 127.0.0.1:6379> mget key3 key5          #批量获取key3和key5,由于key5没有设置成功,所以返回nil
1) "zhang"
2) (nil)

在这里插入图片描述

二、List数据类型(列表对象)

概述:列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素

2.1 LPUSH/LPUSHX/LRANGE

LPUSH key value [ value … ] 在头部(左侧依次插入列表元素 LPUSH key)
value:键必须存在才能执行,在头部插入元素值并返回列表元素数量
LRANGE key start stop :取从位置索引start到位置索引stop的所有元素(索引是从0开始)

redis 127.0.0.1:6379> del mytest 
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d
#mytest键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。
(integer) 4
redis 127.0.0.1:6379> lrange mytest 0 2      #取从位置0开始到位置2结束的3个元素。
1) "d"
2) "c"
3) "b"
redis 127.0.0.1:6379> lrange mytest 0 -1     #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
1) "d"
2) "c"
3) "b"
4) "a"
redis 127.0.0.1:6379> lpushx mytest2 e       #mytest2键此时并不存在,因此lpushx命令将不会进行任何操作,其返回值为0
(integer) 0
redis 127.0.0.1:6379> lrange mytest2 0 -1    #可以看到mytest2没有关联任何List Value。
(empty list or set)
redis 127.0.0.1:6379> lpushx mytest e        #mytest键此时已经存在,所以lpushx命令插入成功,并返回链表中当前元素的数量。
(integer) 5
redis 127.0.0.1:6379> lrange mytest 0 0      #获取该键的List Value的头部元素。
1) "e"

在这里插入图片描述

2.2 LPOP/LLEN

LPOP key :移除并返回链表中的第一个元素,从右往左的第一个。

redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d
(integer) 4
redis 127.0.0.1:6379> lpop mytest       #移除并返回mytest键的第一个元素,即从右往左第一个
"d"
redis 127.0.0.1:6379> lpop mytest
"c"
redis 127.0.0.1:6379> llen mytest        #获取表中元素数量,在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2
(integer) 2

在这里插入图片描述

2.3 LREM/LSET/LINDEX/LTRIM

LREM key count value:从头部开始删除count个值为value的元素,并返回实际删除数量
LSET key index value: 将位置索引为index的元素设置新值value
LINDEX key index: 获取索引为index的元素
LTRIM key start stop: 仅保留从位置索引start到索引stop的元素

redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d a c     #为后面的示例准备测试数据。
(integer) 6
redis 127.0.0.1:6379> lrem mytest 2 a      #从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。
(integer) 2
redis127.0.0.1:6379>lrange mytest 0 -1        #看出删除后链表中的全部元素。
1) "c"
2) "d"
3) "c"
4) "b"
redis 127.0.0.1:6379> lindex mytest 1        #获取索引值为1(头部的第二个元素)的元素值。
"d"
redis 127.0.0.1:6379> lset mytest 1 e        #将索引值为1(头部的第二个元素)的元素值设置为新值e。
OK
redis 127.0.0.1:6379> lindex mytest 1        #查看是否设置成功。
"e"
redis 127.0.0.1:6379> lindex mytest 6        #索引值6超过了链表中元素的数量,该命令返回nil。
(nil)
redis 127.0.0.1:6379> lset mytest 6 hh       #设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息。
(error) ERR index out of range
redis 127 .0.0.1:6379> ltrim mytest 0 2      #仅保留索引值02之间的3个元素,注意第0个和第2个元素均被保留。
OK
redis 127.0.0.1:6379> lrange mytest 0 -1     #查看ltrim后的结果。
l) "c"
2) "e"
3) "c"

在这里插入图片描述

2.4 LINSERT

LINSERT key BEFORE | AFTER pivot value :在元素pivot的前面(左)或者后面(右)插入新元素value

redis 127.0.0.1:6379> del mytest     #删除该键便于后面的测试。
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d e    #为后面的示例准备测试数据。
(integer) 1
redis 127.0.0.1:6379> linsert mytest before a a1    #在a的前面插入新元素a1。
(integer) 6
redis 127.0.0.1:6379> lrange mytest 0 -1            #查看是否插入成功,从结果看已经插入
1) "e"
2) "d"
3) "c"
4) "b"
5) "a1"
6) "a"
redis 127.0.0.1:6379> linsert mytest after e e2    #在e的后面插入新元素e2,从返回结果看已经插入成功。
(integer) 7
redis 127.0.0.1:6379> lindex mytest 1       #再次查看是否插入成功。
"e2"
redis 127.0.0.1:6379> linsert mytest after k a    #在不存在的元素之前或之后插入新元素,linsert 命令操作失败,并返回-1
(integer) -1
redis 127.0.0.1:6379> linsert mykey1 after a a2   #为不存在的Key插入新元素,linsert命 令操作失败,返回0.
(integer) 0

在这里插入图片描述

2.5 RPUSH/ RPUSHX/RPOP/RPOPLPUSH

RPUSH key value [value …]在列表的尾部依次插入value
RPUSHX key value: key必须存在才可执行,将value从尾部插入,并返回所有元素数量
RPOP key: 在尾部弹出(移除) 一个元素,并返回该元素
RPOPLPUSH source dest ination:在key1的尾部弹出一个元素并返回,将它插入key2的头部

redis 127.0.0.1:6379> del mytest 		    #删除该键,以便于后而的测试。
(integer) 1
redis 127.0.0.1:6379> rpush mytest a b c d  #从链表的尾部插入参数中给出的values,插入顺序是从右到左依次插入。
(integer) 4
redis 127.0.0.1:6379> lrange mytest 0 -1    #通过lrange命令可以获悉rpush在插入多值时的插入顺序。
1) "a"
2) "b"
3) "c"
4) "d"
redis 127.0.0.1:6379> rpushx mytest e       #该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。
(integer) 5
redis 127.0.0.1:6379> Nosql和Redis介绍,Redis五大数据类型及操作,跳跃表

redis之五大数据类型介绍

redis的五大数据类型详细用法

Redis_NoSQL入门学习笔记

Redis_NoSQL入门学习笔记

Redis 详解 redis的五大数据类型详细用法