Redis常用数据结构string,hash,set,zset,list
- string 字符串类型
string是redis中最基本的数据类型,一个key对应一个value。
string类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
使用:get 、 set 、 del 、 incr、 decr 等
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
“world”
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> get counter
“2”
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
“3”
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
“103”
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
“102”
应用场景:
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:常见方案spring session + redis实现session共享
- hash(字典)
Redis的hash相当于java里的HashMap,是无序字典,是数值+链表的二维结构。Redis的字典是字符串。
hash结构也可以存储用户信息,与字符串需要一次性全部序列化整个对象不同,hash可以对用户结构中的每个字段单独存储。这样当需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话,就只能一次性全部读取,这样就会浪费网络流量。
hash的缺点,hash结构的存储消耗要高于单个字符串。
使用:所有hash的命令都是 h 开头的 hget 、hset 、 hdel 等
hmset user:1000 username Mary birthyear 1977 verified 1
OK
hget user:1000 username
“Mary”
hget user:1000 birthyear
“1977”
hgetall user:10001. “username”
2. “antirez”
3. “birthyear”
4. “1977”
5. “verified”
6. “1”
同字符串一样,hash结构中的单个子Key也可以进行计数,它对应的指令是hincrby
hset user age 20
(integer) 1
hincrby user age 1
(integer) 21
- set (集合)
set 是字符串的无序集合。相当于Java里的HashSet,它内部的键值对是无序的、唯一的。
SADD命令向集合添加新元素。还可以对集合执行许多其他操作,例如测试给定元素是否已经存在,执行多个集合之间的交集、并集或差分等等。
sadd myset 1 2 3
(integer) 3
smembers myset1. 3
2. 1
3. 2
在这里,在集合中添加了三个元素,并告诉Redis返回所有元素。正如您所看到的,它们不是排序的——Redis可以在每次调用时以任何顺序返回元素,因为用户没有关于元素排序的约定。
Redis有测试成员资格的命令。例如,检查元素是否存在:
sismember myset 3
(integer) 1
sismember myset 30
(integer) 0
集合有助于表达对象之间的关系。例如,我们可以很容易地使用集合来实现标记。
一个例子是为新闻文章添加标签。如果文章ID 1000用标记1、2、5和77标记,则集合可以将这些标记ID与新闻项目相关联:
sadd news:1000:tags 1 2 5 77
(integer) 4
获取新闻的所有标签:
smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2
除了交集,还可以执行并集、差分、提取随机元素等等。使用SUNIONSTORE用于多个集合之间的联合,并将结果存储到另一个集合中。但是,由于单个集合的联合本身,我可以复制我的牌组:
sadd deck C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK
sadd deck H4 H5 H6 H7 H8 H9 H10 HJ HQ HK S1 S2 S3 S4 S5 S6
sadd deck S7 S8 S9 S10 SJ SQ SK
sunionstore game:1:deck deck
(integer) 52
提取元素的命令称为SPOP,可以方便地为某些问题建模。
spop game:1:deck
“S5”
spop game:1:deck
“C6”
spop game:1:deck
“H4”
spop game:2:deck
“C1”
spop game:2:deck
“CJ”
spop game:2:deck
“C9”
获取集合中元素的数量
scard game:1:deck
(integer) 49
- zset(集合)
zset是Redis中的有序集合,相当于Java中SortedSet和HashMap的结合体,一方面是一个set,保证了内部value的唯一性,另一方面他可以给每个value富裕一个score,代表这个value的排序权重。
使用场景,使用zset来存储学生的成绩,value值是学生的ID,score是他的考试成绩,对成绩按分数排序,可以得到他的名次。
zadd hackers 1940 “Alan Kay”
(integer) 1
zadd hackers 1957 “Sophie Wilson”
(integer) 1
zadd hackers 1953 “Richard Stallman”
(integer) 1
zadd hackers 1949 “Anita Borg”
(integer) 1
zadd hackers 1965 “Yukihiro Matsumoto”
(integer) 1
zadd hackers 1914 “Hedy Lamarr”
(integer) 1
zadd hackers 1916 “Claude Shannon”
(integer) 1
zadd hackers 1969 “Linus Torvalds”
(integer) 1
zadd hackers 1912 “Alan Turing”
(integer) 1
顺序获取前三名
zrange hackers 0 2
1. “Alan Turing”
2. “Hedy Lamarr”
3. “Claude Shannon”
排序
zrange hackers 0 -1 withscores
1. “Alan Turing”
2. “1912”
3. “Hedy Lamarr”
4. “1914”
5. “Claude Shannon”
6. “1916”
7. “Alan Kay”
8. “1940”
9. “Anita Borg”
10. “1949”
11. “Richard Stallman”
12. “1953”
13. “Sophie Wilson”
14. “1957”
15. “Yukihiro Matsumoto”
16. “1965”
17. “Linus Torvald
1. s”
2. “1969”
把1950年前出生的人都找出来,这时可以使用zrangebyscore,-inf代表负无穷大。
zrangebyscore hackers -inf 1950
1. “Alan Turing”
2. “Hedy Lamarr”
3. “Claude Shannon”
4. “Alan Kay”
5. "Anita Borg
也可以删除元素的范围。让我们把1940年到1960年间出生的所有黑客从分类集中删除:
为已排序集合元素定义的另一个非常有用的操作是get rank操作。可以询问元素在有序元素集合中的位置
zrank hackers “Hedy Lamarr”
(integer) 1
zset中最后一个value被移除后,数据结构被自动删除,内存被回收。
- list(列表)
Redis的list相当于Java中的LinkedList,是链表类型。list的插入和删除操作非常快,但是索引定位很慢。列表中的每个元素都使用双向指针顺序,串起来可以同时支持前向后向遍历。
当列表弹出最后一个元素后,改数据结构被自动删除,内存被回收。
Redis的列表通常用来做异步队列使用。支持操作
- lpush: 在左侧(即列表头部)插入数据。
- rpop: 在右侧(即列表尾部)删除数据。
- rpush: 在右侧(即列表尾部)插入数据。
- lpop: 在左侧(即列表头部)删除数据。
队列操作,先进先出。常用于消息排队和异步逻辑处理,它会确保元素的访问顺序性。
rpush books python java javascript
(integer) 3
llen books
(integer) 3
lpop books
“python”
lpop books
“java”
lpop books
“javascript”
lpop books
(nil)
栈操作,先进后出。
rpush books python java javascript
(integer) 3
rpop books
“javascript”
rpop books
“java”
rpop books
“python”
rpop books
(nil)