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
删除指定序号的元素。