第02讲:Redis数据结构

Source

一、Redis数据类型介绍

1.1、五种数据类型:

  • 字符串(String)
  • 字符串列表(list)
  • 有序字符串集合(sorted set)
  • 哈希(hash)
  • 字符串集合(set)

1.2、Key定义的注意点

  • 不要过长,
  • 不要过短,
  • 统一的命名规范

二、Redis数据结构之字符串类型

二进制安全的,存入和获取的数据相同,Value最多可以容纳的数据长度是512M

2.1、存储String常用命令

  • 赋值
  • 取值
  • 删除
  • 数值增减
  • 扩展命令

[root@localhost redis]# ./bin/redis-cli

2.1.1、赋值

127.0.0.1:6379> set name java1234

OK

2.1.2、取值

127.0.0.1:6379> get name

"java1234"

2.1.3、获取并设置值

127.0.0.1:6379> getset name open1111

"java1234"

127.0.0.1:6379> get name

"open1111"

2.1.4、删除

127.0.0.1:6379> del name

(integer) 1

127.0.0.1:6379> get name

(nil)

2.1.5、incr 自增 

假如没有定义 则默认0,假如非数值类型 则报错

127.0.0.1:6379> incr n

(integer) 1

127.0.0.1:6379> get n

"1"

127.0.0.1:6379> set nn 2

OK

127.0.0.1:6379> incr nn

(integer) 3

127.0.0.1:6379> get nn

"3"

127.0.0.1:6379> 

127.0.0.1:6379> set n2 java1234

OK

127.0.0.1:6379> incr n2

(error) ERR value is not an integer or out of range

127.0.0.1:6379> 

2.1.6、自减 decr 同上

127.0.0.1:6379> decr nn

(integer) 2

127.0.0.1:6379> decr n3

(integer) -1

2.1.7、扩展 

incrby 指定增量值

127.0.0.1:6379> incrby n3 8

(integer) 7

2.1.8、decrby 指定减量值

127.0.0.1:6379> decrby n3 5

(integer) 2

2.1.9、append 追加字符串

假如没定义 直接赋值

127.0.0.1:6379> append s1 jj

(integer) 2

127.0.0.1:6379> get s1

"jj"

127.0.0.1:6379> append s1 bb

(integer) 4

127.0.0.1:6379> get s1

"jjbb"

Del n1  n2 删除多个的命令

三、Redis数据结构之哈希类型

 String key和String Value的Map容器,每一个Hash可以存储4294967295个键值对

3.1、存储Hash常用命令:

  • 赋值  
  • 取值
  • 删除
  • 增加数字
  • 判断字段是否存在
  • 获取hash属性个数
  • 获取hash所有属性名称

定义h1 以及username和password字段 值分别是java1234 123456

3.1.1、hget单个字段设置

127.0.0.1:6379> hset h1 username java1234

(integer) 1

127.0.0.1:6379> hset h1 password 123456

(integer) 1

127.0.0.1:6379> hget h1 username

"java1234"

127.0.0.1:6379> hget h1 password

"123456"

3.1.2、hmset 多个字段一起设置

127.0.0.1:6379> hmset h2 username open1111 password 23456

OK

127.0.0.1:6379> hmget h2 username

1) "open1111"

127.0.0.1:6379> hmget h2 password

1) "23456"

127.0.0.1:6379> hmget h2 username password

1) "open1111"

2) "23456"

127.0.0.1:6379> hgetall h2

1) "username"

2) "open1111"

3) "password"

4) "23456"

3.1.3、hdel删除属性

可以一次删除一个或者多个

127.0.0.1:6379> hdel h2 username password

(integer) 2

127.0.0.1:6379> hgetall h2

(empty list or set)

3.1.4、hincrby增加数字

127.0.0.1:6379> hset h1 age 20

(integer) 1

127.0.0.1:6379> hincrby h1 age 5

(integer) 25

3.1.5、hexists判断字段是否存在 1表示存在 0表示不存在

127.0.0.1:6379> hexists h1 age

(integer) 1

127.0.0.1:6379> hexists h1 age2

(integer) 0

3.1.6、hlen获取hash属性个数

127.0.0.1:6379> hlen h1

(integer) 3

127.0.0.1:6379> hlen h2

(integer) 0

3.1.7、hkeys获取所有属性名称

127.0.0.1:6379> hkeys h1

1) "username"

2) "password"

3) "age"

127.0.0.1:6379> hkeys h2

(empty list or set)

3.1.8、hvals获取所有属性值

127.0.0.1:6379> hvals h1

1) "java1234"

2) "123456"

3) "25"

127.0.0.1:6379> hvals h2

(empty list or set)

127.0.0.1:6379> 

四、Reids数据结构之List类型

ArrayList使用数组方式,LinkedList使用双向链接方式

4.1、存储List常用命令

  • 双向链接表中增加数据
  • 双向链接表中删除数据
  • 存储list常用命令
  • 两端添加
  • 两端弹出
  • 扩展命令

4.1.1、lpush 方式添加

从左边开始添加

127.0.0.1:6379> lpush l1 a b c d

(integer) 4

127.0.0.1:6379> lpush l1 1 2 3 4

(integer) 8

4.1.2、lrange 获取指定方位的集合元素

从第1个开始 到倒数第一个 也就是最后一个 也就是 所有数据

127.0.0.1:6379> lrange l1 0 -1

1) "4"

2) "3"

3) "2"

4) "1"

5) "d"

6) "c"

7) "b"

8) "a"

获取从第1个到第6个集合元素

127.0.0.1:6379> lrange l1 0 6

1) "4"

2) "3"

3) "2"

4) "1"

5) "d"

6) "c"

7) "b"

4.1.3、rpush 从右端开始添加(一般人比较习惯这种方式)

127.0.0.1:6379> rpush l2 a b c d

(integer) 4

127.0.0.1:6379> rpush l2 1 2 3 4

(integer) 8

127.0.0.1:6379> lrange l2 0 -1

1) "a"

2) "b"

3) "c"

4) "d"

5) "1"

6) "2"

7) "3"

8) "4"

127.0.0.1:6379> lrange l2 0 6

1) "a"

2) "b"

3) "c"

4) "d"

5) "1"

6) "2"

7) "3"

4.1.4、lpop 左侧弹出集合元素

4.1.5、rpop 右侧弹出集合元素

127.0.0.1:6379> lrange l2 0 -1

1) "b"

2) "c"

3) "d"

4) "1"

5) "2"

6) "3"

7) "4"

127.0.0.1:6379> rpop l2

"4"

127.0.0.1:6379> lrange l2 0 -1

1) "b"

2) "c"

3) "d"

4) "1"

5) "2"

6) "3"

4.1.6、llen查看元素个数

127.0.0.1:6379> llen l2

(integer) 6

4.1.7、lpushx 集合头部插入元素

127.0.0.1:6379> lpushx l2 xx

(integer) 7

127.0.0.1:6379> lrange l2 0 -1

1) "xx"

2) "b"

3) "c"

4) "d"

5) "1"

6) "2"

7) "3"

4.1.8、rpushx 集合尾部插入元素

127.0.0.1:6379> rpushx l2 yy

(integer) 8

127.0.0.1:6379> lrange l2 0 -1

1) "xx"

2) "b"

3) "c"

4) "d"

5) "1"

6) "2"

7) "3"

8) "yy"

4.1.9、lpush集合头部插入多个元素

127.0.0.1:6379> lpush l2 a1 a2 

(integer) 10

127.0.0.1:6379> lrange l2 0 -1

 1) "a2"

 2) "a1"

 3) "xx"

 4) "b"

 5) "c"

 6) "d"

 7) "1"

 8) "2"

 9) "3"

10) "yy"

127.0.0.1:6379> rpush l2 a3 a4

(integer) 12

127.0.0.1:6379> lrange l2 0 -1

 1) "a2"

 2) "a1"

 3) "xx"

 4) "b"

 5) "c"

 6) "d"

 7) "1"

 8) "2"

 9) "3"

10) "yy"

11) "a3"

12) "a4"

4.1.10、lrem 从指定方向删除指定个数的指定元素

先加点数据搞个新集合l3

127.0.0.1:6379> lpush l3 1 3 2 3 2 1 2 1 3

(integer) 9

127.0.0.1:6379> lrange l3 0 -1

1) "3"

2) "1"

3) "2"

4) "1"

5) "2"

6) "3"

7) "2"

8) "3"

9) "1"

从左边开始删除2个1

127.0.0.1:6379> lrem l3 2 1

(integer) 2

127.0.0.1:6379> lrange l3 0 -1

1) "3"

2) "2"

3) "2"

4) "3"

5) "2"

6) "3"

7) "1"

从右边开始删除2个3

127.0.0.1:6379> lrem l3 -2 3

(integer) 2

127.0.0.1:6379> lrange l3 0 -1

1) "3"

2) "2"

3) "2"

4) "2"

5) "1"

删除所有2

127.0.0.1:6379> lrem l3 0 2

(integer) 3

127.0.0.1:6379> lrange l3 0 -1

1) "3"

2) "1"

4.1.11、lset 设置集合指定索引的值

127.0.0.1:6379> lrange l1 0 -1

1) "4"

2) "3"

3) "2"

4) "1"

5) "d"

6) "c"

7) "b"

8) "a"

索引从0开始

127.0.0.1:6379> lset l1 3 xxxx

OK

127.0.0.1:6379> lrange l1 0 -1

1) "4"

2) "3"

3) "2"

4) "xxxx"

5) "d"

6) "c"

7) "b"

8) "a"

4.1.12、linsert 在集合里插入指定元素

在xxxx元素之前插入aa

127.0.0.1:6379> linsert l1 before xxxx aa

(integer) 9

127.0.0.1:6379> lrange l1 0 -1

1) "4"

2) "3"

3) "2"

4) "aa"

5) "xxxx"

6) "d"

7) "c"

8) "b"

9) "a"

在xxxx元素之后插入bb

127.0.0.1:6379> linsert l1 after xxxx bb

(integer) 10

127.0.0.1:6379> lrange l1 0 -1

 1) "4"

 2) "3"

 3) "2"

 4) "aa"

 5) "xxxx"

 6) "bb"

 7) "d"

 8) "c"

 9) "b"

10) "a"

4.1.13、rpoplpush 把A集合尾部元素弹出并插入到B集合头部

127.0.0.1:6379> rpush l4 a b c

(integer) 3

127.0.0.1:6379> rpush l5 1 2 3

(integer) 3

127.0.0.1:6379> lrange l4 0 -1

1) "a"

2) "b"

3) "c"

127.0.0.1:6379> lrange l5 0 -1

1) "1"

2) "2"

3) "3"

127.0.0.1:6379> rpoplpush l4 l5

"c"

127.0.0.1:6379> lrange l4 0 -1

1) "a"

2) "b"

127.0.0.1:6379> lrange l5 0 -1

1) "c"

2) "1"

3) "2"

4) "3"

五、Redis数据结构之Set类型

和List类型不同的是,Set集合中不允许出现重复的元素,Set可包含的最大元素数量是4294967295

5.1、存储set常用命令:

  • 添加/删除元素
  • 获取集合中的元素
  • 集合中的差集运算
  • 集合中的交集运算
  • 集合中的并集元算

5.1.1、sadd key member [member ...]添加set元素

127.0.0.1:6379> sadd set1  a b c

(integer) 3

添加三个元素

smembers key

查看指定key集合元素

127.0.0.1:6379> smembers set1

1) "c"

2) "b"

3) "a"

127.0.0.1:6379> sadd set1 a d e

(integer) 2

127.0.0.1:6379> smembers set1

1) "c"

2) "d"

3) "b"

4) "a"

5) "e"

继续添加元素 发现 重复元素不再添加

5.1.2、srem key member [member ...]删除元素

127.0.0.1:6379> srem set1 a d

(integer) 2

127.0.0.1:6379> smembers set1

1) "b"

2) "c"

3) "e"

删除两个元素

sismember key member

判断某个元素是否存在 返回1 表示存在 返回0表示不存在

127.0.0.1:6379> sismember set1 a

(integer) 0

127.0.0.1:6379> sismember set1 b

(integer) 1

5.1.3、sdiff计算差集

127.0.0.1:6379> sadd set2 a b c

(integer) 3

127.0.0.1:6379> sadd set3 b c d e

(integer) 4

127.0.0.1:6379> sdiff set2 set3

1) "a"

127.0.0.1:6379> sdiff set3 set2

1) "d"

2) "e"

我们发现 集合的顺序不同 结果不一样 根据前者参考

5.1.4、sinter计算交集

127.0.0.1:6379> sinter set2 set3

1) "c"

2) "b"

5.1.5、sunion计算并集

127.0.0.1:6379> sunion set2 set3

1) "e"

2) "a"

3) "b"

4) "c"

5) "d"

5.1.6、scard计算元素总数

127.0.0.1:6379> smembers set1

1) "b"

2) "c"

3) "e"

127.0.0.1:6379> scard set1

(integer) 3

5.1.7、srandmember 随机取一个元素

127.0.0.1:6379> srandmember set1

"c"

127.0.0.1:6379> srandmember set1

"e"

5.1.8、sdiffstore 把差集结果存储到新集合中

127.0.0.1:6379> smembers set2

1) "c"

2) "b"

3) "a"

127.0.0.1:6379> smembers set3

1) "c"

2) "e"

3) "d"

4) "b"

127.0.0.1:6379> sdiffstore r1 set2 set3

(integer) 1

127.0.0.1:6379> smembers r1

1) "a"

5.1.9、sinterstore 把交集结果存储到新集合中

127.0.0.1:6379> sinterstore r2 set2 set3

(integer) 2

127.0.0.1:6379> smembers r2

1) "c"

2) "b"

5.1.10、sunionstore把并集结果存储到新集合中

127.0.0.1:6379> sunionstore r3 set2 set3

(integer) 5

127.0.0.1:6379> smembers r3

1) "e"

2) "a"

3) "b"

4) "c"

5) "d"

5.1.11、存储Set使用场景

 跟踪一些唯一性数据

 用于维护数据对象之间的关联关系

六、Redis数据结构之sorted-set类型

Sorted-Set和Set的区别:

Sorted-Set中的成员在集合中的位置是有序的

6.1、存储Sorted-set常用命令

  • 添加元素
  • 获得元素
  • 删除元素
  • 范围查询

扩展命令

zadd 添加元素 里面包括评分和值

127.0.0.1:6379> zadd sort1 5 a 4 b 6 c

(integer) 3

我们添加集合sort1 元素是a,b,c 评分分别是5,4,6

集合里的排序是根据评分从小到大排序的;

zrange是查找元素 -1代表是最后一个

127.0.0.1:6379> zrange sort1 0 -1

1) "b"

2) "a"

3) "c"

假如我们继续添加元素

这里分两种情况

假如次元素集合里面已经有了,则覆盖

我们继续添加b 此时评分改成7 

127.0.0.1:6379> zadd sort1 7 b

(integer) 0

通过zscore 获取b的评分

127.0.0.1:6379> zscore sort1 b

"7"

发现已经修改了;

127.0.0.1:6379> zrange sort1 0 -1

1) "a"

2) "c"

3) "b"

假如添加的元素不在集合里,则添加进去

127.0.0.1:6379> zadd sort1 9 d

(integer) 1

127.0.0.1:6379> zrange sort1 0 -1

1) "a"

2) "c"

3) "b"

4) "d"

删除元素zrem

127.0.0.1:6379> zrem sort1 b

(integer) 1

127.0.0.1:6379> zrange sort1 0 -1

1) "a"

2) "c"

3) "d"

6.1.1、zcard 查看集合里的元素个数

127.0.0.1:6379> zcard sort1

(integer) 3

6.1.2、withscores  把评分也显示出来

127.0.0.1:6379> zrange sort1 0 -1 withscores 

1) "a"

2) "5"

3) "c"

4) "6"

5) "d"

6) "9"

6.1.3、zrevrange 降序排列

127.0.0.1:6379> zrevrange sort1 0 -1 withscores

1) "d"

2) "9"

3) "c"

4) "6"

5) "a"

6) "5"

我们再加两个元素

127.0.0.1:6379> zadd sort1 10 e  5 f

(integer) 2

6.1.4、zremrangebyrank 根据排名来删除元素  删除3个

127.0.0.1:6379> zremrangebyrank sort1 0 2

(integer) 3

127.0.0.1:6379> zrange sort1 0 -1 withscores

1) "d"

2) "9"

3) "e"

4) "10"

再添加元素

127.0.0.1:6379> zadd sort1 11 f 16 g 18 h

(integer) 3

127.0.0.1:6379> zrange sort1 0 -1 withscores

 1) "d"

 2) "9"

 3) "e"

 4) "10"

 5) "f"

 6) "11"

 7) "g"

 8) "16"

 9) "h"

10) "18"

6.1.5、zremrangebyscore 根据具体评分范围来删除元素

127.0.0.1:6379> zremrangebyscore sort1 10 16

(integer) 3

127.0.0.1:6379> zrange sort1 0 -1 withscores

1) "d"

2) "9"

3) "h"

4) "18"

再添加元素

127.0.0.1:6379> zadd sort1 20 i 23 j 30 k

(integer) 3

127.0.0.1:6379> zrange sort1 0 -1 withscores

 1) "d"

 2) "9"

 3) "h"

 4) "18"

 5) "i"

 6) "20"

 7) "j"

 8) "23"

 9) "k"

10) "30"

6.1.6、zrangebyscore 根据评分范围来查找元素

127.0.0.1:6379> zrangebyscore sort1 18 23 withscores 

1) "h"

2) "18"

3) "i"

4) "20"

5) "j"

6) "23"

6.1.7、limit 限定查找起始 类似分页

127.0.0.1:6379> zrangebyscore sort1 18 23 withscores limit 0 2

1) "h"

2) "18"

3) "i"

4) "20"

6.1.8、zincrby 给指定元素加分

127.0.0.1:6379> zincrby sort1 5 h

"23"

127.0.0.1:6379> zrange sort1 0 -1 withscores

 1) "d"

 2) "9"

 3) "i"

 4) "20"

 5) "h"

 6) "23"

 7) "j"

 8) "23"

 9) "k"

10) "30"

zcount 查找指定评分范围的元素个数

127.0.0.1:6379> zcount sort1 20 23

(integer) 3

6.1.9、Sorted-Set使用场景

大型在线游戏积分排行榜

构建索引数据

七、Redis之Keys的通用操作

7.1、常用命令

7.1.1、keys * 显示所有key

127.0.0.1:6379> keys *

 1) "sort1"

 2) "l2"

 3) "set2"

 4) "r1"

 5) "h1"

 6) "n2"

 7) "l3"

 8) "r2"

 9) "s1"

10) "set3"

11) "set1"

12) "r3"

13) "n"

14) "n3"

15) "nn"

16) "l1"

7.1.2、查找所有以s开头的key

用s*  *代表任意字符

127.0.0.1:6379> keys s*

1) "sort1"

2) "set2"

3) "s1"

4) "set3"

5) "set1"

7.1.3、查找所有s开头 后面紧跟任意一个字符的key

127.0.0.1:6379> keys s?

1) "s1"

7.1.4、del删除key

127.0.0.1:6379> del n2 n3 nn

(integer) 3

7.1.5、exists判断key是否存在 1表示存在  0表示不存在

127.0.0.1:6379> exists n2

(integer) 0

127.0.0.1:6379> exists l1

(integer) 1

7.1.6、get获取元素

127.0.0.1:6379> get n

"1"

7.1.7、rename对key重命名

127.0.0.1:6379> rename n n2

OK

127.0.0.1:6379> get n

(nil)

127.0.0.1:6379> get n2

"1"

7.1.8、expire 设置n2 有效时间

127.0.0.1:6379> expire n2 120

(integer) 1

7.1.9、ttl查看剩余时间

127.0.0.1:6379> ttl n2

(integer) 116

7.1.10、type显示类型

127.0.0.1:6379> type n2

string

127.0.0.1:6379> type l1

list

127.0.0.1:6379> type s1

string

127.0.0.1:6379> type sort1

zset