从了解到熟悉Redis数据库的必会技能-----五大数据类型
Posted 28线不知名云架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从了解到熟悉Redis数据库的必会技能-----五大数据类型相关的知识,希望对你有一定的参考价值。
下面介绍的Redis命令有很多,如果你想通过死记硬背来记住这些命令几乎不可能,但是如果理解了Redis的一些机制,这些命令其实是由很强的通用性的,通过理解来记忆是最好的。 另外,每种数据类型都有其适合的使用场景,要理解!!!
数据类型 | 可存储的值 | 操作 |
STRING | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作 对整数和浮点数执行自增或者自减操作 |
LIST | 列表 | 从两端压入或者弹出元素 对单个或者多个元素进行修剪, 只保留一个范围内的元素 |
SET | 无序集合 | 添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集 从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对 获取所有键值对 检查某个键是否存在 |
ZSET | 有序集合 | 添加、获取、删除元素 根据分值范围或者成员来获取元素 计算一个键的排名 |
一、string数据类型
1.1、string概念
string 是Redis的最基本的数据类型,可以理解为与 Memcached 一模一样的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M
1.2、SET/GET/APPEND/STRLEN
127.0.0.1:6379> keys * //查看当前数据库所有键
(empty list or set)
127.0.0.1:6379> exists k1 //判断键值是否存在
(integer) 0
127.0.0.1:6379> append k1 "hello" //不存在,则相当于创建
(integer) 5
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> append k1 " world" //存在,则追加
(integer) 11
127.0.0.1:6379> get k1
"hello world"
127.0.0.1:6379> set k1 "hw" //覆盖操作
OK
127.0.0.1:6379> get k1
"hw"
127.0.0.1:6379> strlen k1 //获取指定key的字符长度
(integer) 2
1.3、INCR、DECR、INCRBY、DECRBY
127.0.0.1:6379> exists k2 //判断k2是否存在
(integer) 0
127.0.0.1:6379> incr k2 //自增1,从0开始(key值必须位整数)
(integer) 1
127.0.0.1:6379> incr k2
(integer) 2
127.0.0.1:6379> incr k2
(integer) 3
127.0.0.1:6379> decr k2 //自减1
(integer) 2
127.0.0.1:6379> decr k2
(integer) 1
127.0.0.1:6379> decr k2
(integer) 0
127.0.0.1:6379> decr k2
(integer) -1
127.0.0.1:6379> incrby k2 5 //增加指定的整数
(integer) 4
127.0.0.1:6379> decrby k2 5 //减少指定的整数
(integer) -1
127.0.0.1:6379>
1.4、getset
127.0.0.1:6379> set k3 1 //设定新键值
OK
127.0.0.1:6379> getset k3 2 //对存在的键值获取,然后赋值
"1"
127.0.0.1:6379> get k3
"2"
127.0.0.1:6379> getset k4 1 //不存在的获取为空,然后赋值
(nil)
127.0.0.1:6379> get k4
"1"
127.0.0.1:6379>
1.5、setex
setex key seconds value
设置指定key的过期时间为seconds
127.0.0.1:6379> set k1 test //设定新键值
OK
127.0.0.1:6379> setex k11 10 test //设置k11的过期时间为10s
OK
127.0.0.1:6379> ttl k11
(integer) 5
127.0.0.1:6379> ttl k11 //-2表示已经过期
(integer) -2
127.0.0.1:6379> ttl k1 //-1表示永不过期
(integer) -1
1.6、setnx
127.0.0.1:6379> del k1 //删除前面的键
(integer) 0
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> setnx k1 1 // k1不存在则创建
(integer) 1
127.0.0.1:6379> setnx k1 2 // k1存在则放弃操作
(integer) 0
127.0.0.1:6379> get k1
"1"
1.7、mset mget msetnx
127.0.0.1:6379> mset k1 1 k2 2 k3 3 //批量设置键值
OK
127.0.0.1:6379> mget k1 k2 k3 //批量获取键值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx k1 1 k4 4 k5 5 //因为k1存在,则失败
(integer) 0
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "1"
2) "2"
3) "3"
4) (nil)
5) (nil)
127.0.0.1:6379> msetnx k4 4 k5 5 //k4 k5不存在,则成功
(integer) 1
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379>
二、List数据类型
- 概述:列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
2.1、lpush lpushx lrange
127.0.0.1:6379> lpush k1 a b c d //每次在头部插入
(integer) 4
127.0.0.1:6379> lrange k1 0 -1 //取链表中的全部元素,0为第一个,-1为最后一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lpushx k2 e //不存在k2则不插入
(integer) 0
127.0.0.1:6379> lpushx k1 e //存在k1 则插入
(integer) 5
127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379>
2.2、lpop llen
127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lpop k1 //移除头部的元素
"e"
127.0.0.1:6379> lpop k1
"d"
127.0.0.1:6379> llen k1 //获取表中元素数量
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "a"
2.3、 lrem lset lindex ltrim
127.0.0.1:6379> lpush k1 a b c d a c //准备列表
(integer) 6
127.0.0.1:6379> lrem k1 2 a //删除两个值等于a的元素
(integer) 2
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> lindex k1 1 //查看索引值为1的元素
"d"
127.0.0.1:6379> lset k1 1 b //设置索引值为1的元素的值
OK
127.0.0.1:6379> lindex k1 1
"b"
127.0.0.1:6379> lset k1 5 b //索引值不能超过列表
(error) ERR index out of range
127.0.0.1:6379> ltrim k1 0 2 //仅保留索引值0-2
OK
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "c"
2.4、linsert
127.0.0.1:6379> lpush k1 a b c d e //准备列表
(integer) 5
127.0.0.1:6379> linsert k1 before a a1 //在a前插入a1
(integer) 6
127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a1"
6) "a"
127.0.0.1:6379> linsert k1 after e e2 //在e后插入e2
(integer) 7
127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "e2"
3) "d"
4) "c"
5) "b"
6) "a1"
7) "a"
2.5.rpush rpushx rpop rpoplpush
127.0.0.1:6379> rpush k1 a b c d //在尾部插入元素
(integer) 4
127.0.0.1:6379> LRANGE k1 0 -1 //查看所有元素
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpushx k1 e //插入e
(integer) 5
127.0.0.1:6379> lindex k1 4
"e"
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpoplpush k1 k2 //将k1的尾部元素弹到k2
"e"
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> LRANGE k2 0 -1
1) "e"
127.0.0.1:6379> rpoplpush k1 k2 //再弹一次
"d"
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpop k2 //移除尾部元素
"e"
127.0.0.1:6379> rpop k2
"d"
127.0.0.1:6379> LRANGE k2 0 -1
(empty list or set)
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpoplpush k1 k1 //将尾部数据移到头部
"c"
127.0.0.1:6379> LRANGE k1 0 -1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379>
三、Hash数据类型
3.1、hset hget hdel hexists hlen hsetnx
127.0.0.1:6379>
127.0.0.1:6379> hset h1 field1 zhangsan //字段为field1,值为zhangsan
(integer) 1
127.0.0.1:6379> hget h1 field1 //获取键值为h1,字段为field1的值
"zhangsan"
127.0.0.1:6379> hset h1 field2 lisi
(integer) 1
127.0.0.1:6379> hget h1 field2
"lisi"
127.0.0.1:6379> hlen h1 //获取h1的字段数量
(integer) 2
127.0.0.1:6379> hexists h1 field1 //判断h1的field1是否存在,1为存在,0为不存在
(integer) 1
127.0.0.1:6379> hdel h1 field1 //删除
(integer) 1
127.0.0.1:6379> hexists h1 field1
(integer) 0
127.0.0.1:6379> hsetnx h1 field1 zhangsan //因为不存在则设置
(integer) 1
127.0.0.1:6379> hsetnx h1 field1 zhangsan //因为存在则不执行操作
(integer) 0
127.0.0.1:6379>
3.2、hincrby
127.0.0.1:6379> hset myhash field 5 //设置字段为field1的值为5
(integer) 1
127.0.0.1:6379> hincrby myhash field 5 //使其增加5
(integer) 10
127.0.0.1:6379> hincrby myhash field 5
(integer) 15
127.0.0.1:6379> hincrby myhash field -20 //使其减少20
(integer) -5
127.0.0.1:6379>
3.3、hgetall hkeys hvals hmget hmset
127.0.0.1:6379> hmset hash f1 hello f2 world //批量设置多个字段
OK
127.0.0.1:6379> hmget hash f1 f2 f3 //批量获取多个字段
1) "hello"
2) "world"
3) (nil)
127.0.0.1:6379> hgetall hash //获取全部字段
1) "f1"
2) "hello"
3) "f2"
4) "world"
127.0.0.1:6379> hkeys hash //获取字段名
1) "f1"
2) "f2"
127.0.0.1:6379> hvals hash //获取字段值
1) "hello"
2) "world"
127.0.0.1:6379>
四、set数据类型(无序集合)
概述:无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算
应用范围:
- 1.可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
- 2.充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
4.1、sadd smembers scard sismember
127.0.0.1:6379> sadd set a b c //插入数据
(integer) 3
127.0.0.1:6379> sadd set a d e //a存在,插入d e
(integer) 2
127.0.0.1:6379> SMEMBERS set //查看数据
1) "a"
2) "c"
3) "d"
4) "b"
5) "e"
127.0.0.1:6379> SISMEMBER set a //查看a在 返回1
(integer) 1
127.0.0.1:6379> SISMEMBER set f //f不在 返回0
(integer) 0
127.0.0.1:6379> SMEMBERS set //再次查看数据,无序
1) "d"
2) "b"
3) "e"
4) "c"
5) "a"
127.0.0.1:6379> SCARD set //获取集合中元素数量
(integer) 5
127.0.0.1:6379>
4.2、spop srem srandmember smove
127.0.0.1:6379> sadd set a b c d //插入数据
(integer) 4
127.0.0.1:6379> SMEMBERS set //查看数据
1) "a"
2) "c"
3) "d"
4) "b"
127.0.0.1:6379> SRANDMEMBER set //随机返回一个元素
"a"
127.0.0.1:6379> SRANDMEMBER set
"a"
127.0.0.1:6379> SRANDMEMBER set
"d"
127.0.0.1:6379> spop set //随机删除一个元素
"d"
127.0.0.1:6379> SMEMBERS set
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SREM set a b f //移除三个元素,f不存在,则成功两个
(integer) 2
127.0.0.1:6379> SMEMBERS set
1) "c"
127.0.0.1:6379> SMOVE set set2 c //将set里的c移到set2
(integer) 1
127.0.0.1:6379> SMOVE set set2 c //set中无c
(integer) 0
127.0.0.1:6379> SMEMBERS set2
1) "c"
五、Sorted Set数据类型(zset、有序集合)
概述:
- 有序集合,元素类型为String,元素具有唯一性,不能重复。
- 每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同。
应用范围:
- 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
- Sorted-Set类型还可用于构建索引数据。
5.1、zadd zcrad zcount zrem zincrby zrange zrank
127.0.0.1:6379> zadd zset 1 one //添加一个分数为1的成员
(integer) 1
127.0.0.1:6379> zadd zset 2 two 3 three //新加两个成员
(integer) 2
127.0.0.1:6379> ZRANGE zset 0 -1 withscores //查看数据
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrank zset one //获取索引值
(integer) 0
127.0.0.1:6379> zrank zset four //不存在返回nil
(nil)
127.0.0.1:6379> zcard zset //获取成员数量
(integer) 3
127.0.0.1:6379> zcount zset 1 2 //满足分数在1-2的成员
(integer) 2
127.0.0.1:6379> zrem zset one two //删除成员
(integer) 2
127.0.0.1:6379> zcard zset //获取成员数量
(integer) 1
127.0.0.1:6379> zscore zset three //获取成员分数
"3"
127.0.0.1:6379> zscore zset two //不存在 返回nil
(nil)
127.0.0.1:6379> ZINCRBY zset 2 one //将成员one的分数+2,不存在从0开始
"2"
127.0.0.1:6379> ZINCRBY zset -1 one
"1"
127.0.0.1:6379> ZRANGE zset 0 -1 withscores //满足分数在1-2的成员
1) "one"
2) "1"
3) "three"
4) "3"
5.2、zrangebyscore zrembyrank zremrangebyscore
127.0.0.1:6379> zadd zset 1 one 2 two 3 three //添加几个成员
(integer) 3
127.0.0.1:6379> ZRANGEBYSCORE zset 1 2 //获取分数在1-2的成员
1) "one"
2) "two"
127.0.0.1:6379> ZRANGEBYSCORE zset (1 2 //获取分数在大于1小于等于2的成员
1) "two"
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf limit 2 3 //获取在2-3的全部成员
1) "three"
127.0.0.1:6379> ZREMRANGEBYSCORE zset 1 2 //删除索引值在1-2的成员
(integer) 2
127.0.0.1:6379> zrange zset 0 -1 //查看所有成员
1) "three"
127.0.0.1:6379> ZREMRANGEBYRANK zset 0 1 //删除索引值在0-1的成员
(integer) 1
127.0.0.1:6379> ZREMRANGEBYRANK zset 0 1
(integer) 0
127.0.0.1:6379> zcard zset //查看成员数量
(integer) 0
127.0.0.1:6379>
5.3、zrevrange zrevrangebyscore zrevrank
127.0.0.1:6379> zadd zset 1 one 2 two 3 three 4 four //添加成员
(integer) 4
127.0.0.1:6379> ZREVRANGE zset 0 -1 withscores //以索引值从高到低返回成员
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> ZREVRANGE zset 1 3 //返回索引值在1-3的成员
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrank zset one //返回one的索引值
(integer) 3
127.0.0.1:6379> zrevrank zset four
(integer) 0
127.0.0.1:6379> ZREVRANGEBYSCORE zset 3 0 //分数从高到低
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> ZREVRANGEBYSCORE zset 4 0 limit 1 2 //满足分数4-0,且索引值从1开始的两位成员
1) "three"
2) "two"
127.0.0.1:6379> ZREVRANGEBYSCORE zset +inf -inf limit 1 3 //全部成员在索引值为1开始的后三位成员
1) "three"
2) "two"
3) "one"
以上是关于从了解到熟悉Redis数据库的必会技能-----五大数据类型的主要内容,如果未能解决你的问题,请参考以下文章