Redis数据类型
- 一、String 数据类型
-
- 1.1 概述
- 1.2 APPEND / SET / GET / STRLEN
-
- APPEND
- SET / GET
- STRLEN
- 1.3 INCR / DECR / INCRBY / DECRBY
- 1.4 GETSET
- 1.5 SETEX
- 1.6 SETNX
- 1.7 MSET / MGET / MSETNX
- 二、List 数据类型
-
- 2.1 概述
- 2.2 LPUSH / LPUSHX / LRANGE
- 2.3 LPOP / LLEN
- 2.4 LREM / LSET / LINDEX / LTRIM
- 2.5 LINSERT
- 2.6 RPUSH / RPUSHX / RPOP / RPOPLPUSH
- 三、Hash 数据类型(散列类型)
-
- 3.1 概述
- 3.2 HSET / HGET / HDEL / HEXISTS / HLEN / HSETNX
- 3.3 HINCRBY
- 3.4 HGETALL / HKEYS / HVALS / HMGET / HMSET
- 四、SET 数据类型(无序集合)
-
- 4.1 概述
-
- 应用范围
- 4.2 SADD / SMEMBERS / SCARD / SISMEMBER
- 4.3 SPOP / SREM / SRANDMEMBER / SMOVE
- 五、Sorted Set 数据类型(zset、有序集合)
-
- 5.1 概述
-
- 应用范围
- 5.2 ZADD / ZCARD / ZCOUNT / ZREM / ZINCRBY / ZSCORE / ZRANGE / ZRANK
- 5.3 ZRANGEBYSCORE / ZREMRANGEBYRANK / ZREMRANGEBYSCORE
- 5.4 ZREVRANGE / ZREVRANGEBYSCORE / ZREVRANK
一、String 数据类型
1.1 概述
String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等
1.2 APPEND / SET / GET / STRLEN
APPEND
语法:APPEND key value追加键值,并返回追加后的长度(若键不存在,则相当于创建)
127.0.0.1:6379> exists cc1 # 判断cc1键有没有,存在返回1,不存在返回0
(integer) 0
127.0.0.1:6379> append cc1 "666" # append自动创建,返回的是当前value的长度,也就是666的长度
(integer) 3
127.0.0.1:6379> keys * # 查看cc1已创建有
1) "cc1"
2) "key:__rand_int__"
3) "counter:__rand_int__"
4) "cc4"
5) "mylist"
6) "myset:__rand_int__"
7) "cc3"
8) "teacher"
127.0.0.1:6379> get cc1
"666"
127.0.0.1:6379> append cc1 "777" # 追加创建777,不是覆盖,返回的长度为追加后总长度
(integer) 6
127.0.0.1:6379> get cc1 # 查看内容
"666777"
SET / GET
set:为键设置新值,会覆盖原有值
get:获取该键内容
127.0.0.1:6379> set cc1 333
OK
127.0.0.1:6379> get cc1
"333"
127.0.0.1:6379> set cc1 222
OK
127.0.0.1:6379> get cc1
"222"
STRLEN
获取指定key的字符长度
127.0.0.1:6379> get cc1
"222"
127.0.0.1:6379> strlen cc1
(integer) 3
1.3 INCR / DECR / INCRBY / DECRBY
**INCR key:key值递增加1(key值必须是整数)
127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> incr cc1 # 递增加1
(integer) 101
127.0.0.1:6379> incr cc1
(integer) 102
127.0.0.1:6379> del cc1 # 删除键内容
(integer) 1
127.0.0.1:6379> incr cc1 # 递增加1,删除后的键默认为空值,设定为0
(integer) 1
127.0.0.1:6379> incr cc1
(integer) 2
127.0.0.1:6379> set cc1 aaa # 设置为普通字符串
OK
127.0.0.1:6379> incr cc1 # 无法递增
(error) ERR value is not an integer or out of range
DECR key:key值递增减1(key值必须是整数)**
127.0.0.1:6379> decr cc1 # 递增减1
(integer) 101
127.0.0.1:6379> decr cc1
(integer) 100
127.0.0.1:6379> decr cc1 # 删除键内容
(integer) -1
127.0.0.1:6379> decr cc1 # 递增减1,删除后的键默认为空值,设定为0
(integer) -2
127.0.0.1:6379> set cc1 aaa # 设置为普通字符串
OK
127.0.0.1:6379> decr cc1 # 无法递增
(error) ERR value is not an integer or out of range
INCRBY key 增加指定的整数
127.0.0.1:6379> get cc1 # 设定值
"100"
127.0.0.1:6379> incrby cc1 5 # 增加5
(integer) 105
127.0.0.1:6379> incrby cc1 5
(integer) 110
DECRBY key 减少指定的整数
127.0.0.1:6379> get cc1 # 设定值
"100"
127.0.0.1:6379> decrby cc1 5 # 减少5
(integer) 95
127.0.0.1:6379> decrby cc1 5
(integer) 90
1.4 GETSET
GETSET key value :获取key值并返回,同时给key设置新值
127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> get cc1
"100"
127.0.0.1:6379> getset cc1 0 # 在获取原有值的同时,会设置新值,这两个操作原子性同时完成
"100"
127.0.0.1:6379> get cc1 # 查看结果
"0"
1.5 SETEX
setex key seconds value :设置指定key的过期时间为seconds
127.0.0.1:6379> setex cc1 10 nihao # 设定过期时间为10秒
OK
127.0.0.1:6379> ttl cc1 # ttl命令查看剩余存活时间
(integer) 5
127.0.0.1:6379> get cc1 # 在存活时间内可以获取到内容
"nihao"
127.0.0.1:6379> ttl cc1
(integer) 3
127.0.0.1:6379> ttl cc1 # -2表示失效过期
(integer) -2
127.0.0.1:6379> get cc1 # 无内容
(nil)
127.0.0.1:6379> set cc1 nihao # 直接设定为永久设定
OK
127.0.0.1:6379> ttl cc1 # -1代表一个上限,所有的意思
(integer) -1
1.6 SETNX
SETNX key value :不存在键的话执行set操作,存在就不执行
127.0.0.1:6379> setnx cc1 100 # 不存在的键执行成功
(integer) 1
127.0.0.1:6379> setnx cc1 200 # 存在后没有效果
(integer) 0
127.0.0.1:6379> get cc1 # 查看内容为第一次设置的值
"100"
1.7 MSET / MGET / MSETNX
MSET key1 value key2 value … :批量设置键值
127.0.0.1:6379> mset cc5 555 cc6 666
OK
127.0.0.1:6379> get cc5
"555"
127.0.0.1:6379> get cc6
"666"
==MGET key1 key2 :批量获取多个键值
127.0.0.1:6379> mget cc5 cc6
1) "555"
2) "666"
MSETNX key1 value key2 value :批量设置,不存在的执行成功,存在的执行失败
127.0.0.1:6379> msetnx cc6 666 cc7 777 # 批量设置cc6 cc7
(integer) 0
127.0.0.1:6379> mget cc6 cc7 # cc6本身存在,导致执行失败,所以cc7没有设置成功
1) "666"
2) (nil)
127.0.0.1:6379> msetnx cc8 888 cc7 777 # 都没有存在的直接成功
(integer) 1
127.0.0.1:6379> mget cc8 cc7
1) "888"
2) "777"
二、List 数据类型
2.1 概述
列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
2.2 LPUSH / LPUSHX / LRANGE
LPUSH key value value… :在头部左侧依次插入列表元素
# cc1键不存在,命令会创建改建及与其关联的List,之后再把参数从左到右依次插入
127.0.0.1:6379> lpush cc1 a b c d
(integer) 4
LPUSHX key value :键必须存在才能执行,在头部插入元素值并返回列表元素数量
127.0.0.1:6379> lpushx cc2 a b c d # cc2不存在,所以不会进行操作,返回值0
(integer) 0
127.0.0.1:6379> lpushx cc1 e # cc1存在,插入成功,并且返回当前元素的数量
(integer) 5
LRANGE key start stop :取从位置索引start到位置索引stop的所有元素(以0开始)
127.0.0.1:6379> lrange cc1 0 -1 # 取全部元素,0表示第一个,-1表示最后一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange cc1 0 2 # 取从位置0开始到位置2结束的共3个元素
1) "d"
2) "c"
3) "b"
2.3 LPOP / LLEN
127.0.0.1:6379> lpush cc1 a b c d # 创建
(integer) 4
127.0.0.1:6379> lpop cc1 # 移除并返回键的第一个元素,从右往左第一个
"d"
127.0.0.1:6379> llen cc1 # 获取剩余元素数量,此时只有三个
(integer) 3
2.4 LREM / LSET / LINDEX / LTRIM
LREM key count value :从头部开始删除count个值为value的元素,并返回实际删除数量
127.0.0.1:6379> lpush cc1 a b c d a b c d # 新建参数
(integer) 8
127.0.0.1:6379> lrem cc1 2 a # 删除两个值为a的元素,返回值是实际删除的数量
(integer) 2
127.0.0.1:6379> lrange cc1 0 -1 # 查看
1) "d"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
LSET key index value :将索引值为index的元素值设置为新值value
127.0.0.1:6379> lset cc1 0 dd # 将头部第1个元素设置为新值dd
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
LINDEX key index :获取索引值为index的元素值
127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> lindex cc1 3 # 查看索引值为3的值,也就是第四个
"d"
LTRIM key start stop :仅保留索引值start到stop的元素
127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> ltrim cc1 1 3 # 只保留索引值1到3的元素,包含1和3
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "b"
3) "d"
2.5 LINSERT
LINSERT key BEFORE | AFTER pivot value :在元素pivot的前面(左)或者后面(右)插入新元素value
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> linsert cc1 before a aa # 在a的前面插入新元素aa
(integer) 5
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "aa"
5) "a"
127.0.0.1:6379> linsert cc1 after d dd # 在d的后面插入新元素dd
(integer) 6
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "dd"
3) "c"
4) "b"
5) "aa"
6) "a"
127.0.0.1:6379> linsert cc2 after a aa # 在不存在的key插入新元素,操作失败,返回0
(integer) 0
127.0.0.1:6379> linsert cc1 after f ff # 在已存在的key内插入不存在的元素之前或之后,操作失败,返回-1
(integer) -1
2.6 RPUSH / RPUSHX / RPOP / RPOPLPUSH
RPUSH key value value… :在列表的尾部依次插入value
127.0.0.1:6379> rpush cc1 a b c d # 插入顺序是从右到左
(integer) 4
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
RPUSHX key value :必须存在key才能执行,从value尾部插入,并返回元素数量
127.0.0.1:6379> rpushx cc2 a # 不存在不执行,返回0
(integer) 0
127.0.0.1:6379> rpushx cc1 e # 存在的键,正常执行
(integer) 5
RPOP key :在尾部移除一个元素,并且返回该元素
127.0.0.1:6379> rpop cc1 # 默认移除一个元素
"e"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
RPOPLPUSH source destination :在key1的尾部弹出一个元素并返回,将它插入到key2的头部
127.0.0.1:6379> rpoplpush cc1 cc2 # 弹出cc1的尾部元素,插入到cc2的头部
"d"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange cc2 0 -1
1) "d"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpoplpush cc1 cc1 # 弹出cc1的尾部元素插入到cc1的头部
"c"
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "a"
3) "b"
三、Hash 数据类型(散列类型)
3.1 概述
hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。 如:存储 ID 为 2 的汽车对象
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对
3.2 HSET / HGET / HDEL / HEXISTS / HLEN / HSETNX
127.0.0.1:6379> hset cc1 field1 111 # 设置cc1键的字段field1的值为111
(integer) 1
127.0.0.1:6379> hget cc1 field1 # 查看cc1键字段field1的值
"111"
127.0.0.1:6379> hget cc1 field2 # 2未创建,返回nil
(nil)
127.0.0.1:6379> hset cc1 field2 222 # 创建字段field2
(integer) 1
127.0.0.1:6379> hlen cc1 # 获取cc1键的字段数量
(integer) 2
127.0.0.1:6379> hexists cc1 field1 # 判断键中是否存在字段为field1的字段,存在返回1
(integer) 1
127.0.0.1:6379> hdel cc1 field1 # 删除键中的字段
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111 # 给cc1添加新字段,成功返回1
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111 # 重复添加失败,返回0
(integer) 0
3.3 HINCRBY
127.0.0.1:6379> hset cc1 field 2 # 创建
(integer) 1
127.0.0.1:6379> hincrby cc1 field 1 # 给字段值加1,返回为加后的结果
(integer) 3
127.0.0.1:6379> hincrby cc1 field 1
(integer) 4
127.0.0.1:6379> hincrby cc1 field -2 # 给字段值减2,返回为减后的结果
(integer) 2
127.0.0.1:6379> hincrby cc1 field -2
(integer) 0
3.4 HGETALL / HKEYS / HVALS / HMGET / HMSET
127.0.0.1:6379> hmset cc1 field1 111 field2 222 # 批量创建多个字段
OK
127.0.0.1:6379> hmget cc1 field1 field2 # 批量获取多个字段
1) "111"
2) "222"
127.0.0.1:6379> hgetall cc1 # 返回所有字段和值
1) "field1"
2) "111"
3) "field2"
4) "222"
127.0.0.1:6379> hkeys cc1 # 仅获取键中所有字段的名
1) "field1"
2) "field2"
127.0.0.1:6379> hvals cc1 # 仅获取键中所有字段的值
1) "111"
2) "222"
四、SET 数据类型(无序集合)
4.1 概述
无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算
应用范围
- 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性
- 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势
4.2 SADD / SMEMBERS / SCARD / SISMEMBER
127.0.0.1:6379> sadd cc1 a b c # a b c不存在,可以直接插入创建
(integer) 3
127.0.0.1:6379> sadd cc1 a b d e # a b已存在,只插入未存在的两个
(integer) 2
127.0.0.1:6379> sismember cc1 a # 判断a是否存在,返回1表示存在
(integer) 1
127.0.0.1:6379> sismember cc1 f # 判断f是否存在,返回0表示不存在
(integer) 0
127.0.0.1:6379> smembers cc1 # 输出的顺序与插入顺序无关
1) "d"
2) "b"
3) "e"
4) "c"
5) "a"
127.0.0.1:6379> scard cc1 # 获得元素的数量
(integer) 5
4.3 SPOP / SREM / SRANDMEMBER / SMOVE
127.0.0.1:6379> smembers cc1
1) "c"
2) "b"
3) "a"
4) "d"
127.0.0.1:6379> srandmember cc1 # 该命令随机返回某一成员
"a"
127.0.0.1:6379> srandmember cc1
"d"
127.0.0.1:6379> spop cc1 # 随机移除一个成员
"b"
127.0.0.1:6379> smembers cc1 # 移除后结果
1) "c"
2) "a"
3) "d"
127.0.0.1:6379> srem cc1 a c e # 移除a c e 其中e不存在,所以只移除了两个,返回值2
(integer) 2
127.0.0.1:6379> sadd cc2 a b # 创建cc2
(integer) 2
127.0.0.1:6379> smove cc1 cc2 c # 将cc1的c字符移动到cc2
(integer) 1
127.0.0.1:6379> smembers cc2 # 查看结果
1) "c"
2) "b"
3) "a"
五、Sorted Set 数据类型(zset、有序集合)
5.1 概述
- 有序集合,元素类型为String,元素具有唯一性,不能重复
- 每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同
应用范围
- 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息
- Sorted-Set类型还可用于构建索引数据
5.2 ZADD / ZCARD / ZCOUNT / ZREM / ZINCRBY / ZSCORE / ZRANGE / ZRANK
127.0.0.1:6379> zadd cc 1 one # 添加一个分数为1的成员
(integer) 1
127.0.0.1:6379> zadd cc 2 two 3 three # 添加分数2和3的成员
(integer) 2
127.0.0.1:6379> zrange cc 0 -1 WITHSCORES # 返回结果包含每个成员及其分数,0 -1表示第一个到最后一个
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrank cc one # 获取one的位置索引值,0表示第一个
(integer) 0
127.0.0.1:6379> zrank cc four # 成员four不存在,返回值nil
(nil)
127.0.0.1:6379> zcard cc # 获取成员数量
(integer) 3
127.0.0.1:6379> zcount cc 1 2 # 分数表达式,1≤ score ≤2的数量
(integer) 2
127.0.0.1:6379> zrem cc one two # 删除成员one和two,返回值为删除的数量
(integer) 2
127.0.0.1:6379> zcard cc # 查看是否成功
(integer) 1
127.0.0.1:6379> zscore cc three # 获取成员three的分数
"3"
127.0.0.1:6379> zscore cc two # two被删除,所以获取的是nil
(nil)
127.0.0.1:6379> zincrby cc 2 one # one不存在,zincrby将添加该成员并假设初始分数为0,将成员two的分数加2并返回更新后的分数
"2"
127.0.0.1:6379> zincrby cc -1 one # 将成员one的分数-1,返回更新后的分数
"1"
127.0.0.1:6379> zrange cc 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
5.3 ZRANGEBYSCORE / ZREMRANGEBYRANK / ZREMRANGEBYSCORE
127.0.0.1:6379> zadd cc 1 one 2 two 3 three 4 four # 创建
(integer) 4
127.0.0.1:6379> zrangebyscore cc 1 2 # 获取 1≤ score ≤ 2的成员
1) "one"
2) "two"
127.0.0.1:6379> zrangebyscore cc -inf +inf limit 2 3 # -int表示第一个成员,+int表示最后一个,
limit后面的参数用于限制返回成员的值,
2表示从位置索引等于2的成员开始,取后面3个成员
1) "three"
2) "four"
127.0.0.1:6379> zrangebyscore cc 0 4 limit 2 3
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyscore cc 1 2 # 删除满足表达式的成员,返回实际删除数量
(integer) 2
127.0.0.1:6379> zrange cc 0 -1 # 查看是否删除成功
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyrank cc 0 1
(integer) 2
127.0.0.1:6379> zcard cc
(integer) 0
5.4 ZREVRANGE / ZREVRANGEBYSCORE / ZREVRANK
127.0.0.1:6379> zadd cc 1 one 2 two 3 three 4 four # 添加
(integer) 4
127.0.0.1:6379> zrevrange cc 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 cc 1 3 # 获取1到3的成员,由于从高到低排序,所以第一个是four
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrange cc 1 3
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrank cc one # one的位置是3
(integer) 3
127.0.0.1:6379> zrevrangebyscore cc 3 0 # 满足表达式,从高到底输出
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrangebyscore cc 4 0 limit 1 2 # 该命令支持limit选项,在计算位置时候按照相反的顺序计算
1) "three"
2) "two"