天天看点

Redis的几个数据类型,包含简单命令举列一、String 数据类型二、List 数据类型三、Hash 数据类型(散列类型)四、SET 数据类型(无序集合)五、Sorted Set 数据类型(zset、有序集合)

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"
           

继续阅读