Redis常用的5种数据类型
Redis类型 | Java类型 |
---|---|
string | String |
hash | HashMap |
list | LinkedList |
set | HashSet |
sorted_set | TreeSet |
图片来源:https://home.cnblogs.com/u/pangzizhe/
Redis中所有的数据数据存储都是以 key-value 形势存在的,其中 kye 的类型一定是字符串类型。数据类型则指的是value部分。这里只说数据不说命令操作
localhost:0>set name testuser #------设置name
"OK" #------执行结果
localhost:0>get name #------获取name
"testuser" #------执行结果
可以看到其value结构就像是html大文本。
使用注意:
- 获取返回“nil”等同于null
- 支持的最大存储量 512MB
- 保存为Java long数值时支持的最大值为:9223372036854775807
使用场景:
- 计数器(sequence):incr、decr
- 分布式锁:setnx、expire、del
- 数据储存(这个不用说,各个类型都能做到,主要是用途):json string
localhost:0>hset test name lix #------设置key为test, field为name
"1" #------执行结果
localhost:0>hset test age 18
"1"
localhost:0>hset test gender 男
"1"
localhost:0>hget test name #------获取key为test,field为name的值
"lix" #------执行结果
localhost:0>hgetall test #------获取test的所有数据
1) "name"
2) "lix"
3) "age"
4) "18"
5) "gender"
6) "男"
通过工具我们可以看到刚才存入的数据,value的结构更像是我们的常规关系型数据库表。
使用注意:
- value不可存嵌套对象,如果未获取到对应值为nil(null)
- 每个 hash 可以存储 2^32 - 1 键值对(40多亿)
- hash非常贴近对象的形势,是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,但是该类型并不是为对象设计的,不可滥用。
- hgetall 命令获取的是全属性,如果filed过多效率会比较低,可能造成数据访问瓶颈。
localhost:0>lpush list list-value1 list-value2 list-value3 #---设置一个key为list的值
"3"
localhost:0>lrange list 0 2 #---查看下标0到2的值
1) "list-value3"
2) "list-value2"
3) "list-value1"
localhost:0>lrange list 0 -1 #---如果不知道end的下标是多少,可以用-1,表示倒数第一位
1) "list-value3"
2) "list-value2"
3) "list-value1"
list是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。当然这里的头尾看自己对list的约定,你也可以约定左边是尾,右边是头,只要开发中大家保持一致就行。
使用注意:
1.list中保存的数据都是string’类型的,最多保存 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
2. list具有索引,通常数据类型以队列或栈的形势操作
3. 获取全部数据结束索引设置为-1(倒数第一个)
4. list数据可作分页,提升效率
使用场景:
- 消息队列
- 定时任务:blpop
localhost:0>sadd set set-value1 set-value2 set-value3 set-value4 set-value5
"5"
我们按顺序设置完毕5个值,然后看一下redis中的数据
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
从这里看到它们是无序排列的,那么我们获取来看一下:
localhost:0>spop set
"set-value5"
localhost:0>spop set
"set-value1"
localhost:0>spop set
"set-value3"
localhost:0>spop set
"set-value4"
localhost:0>spop set
"set-value2"
localhost:0>spop set
null #---已经没有值了
这里随机获取redis提供了两个API,spop与rpoplpush,那么二者有什么区别?
前者是从集合中取出,后者相当于把集合中拷贝一份返回,即可以重复获取。
因为set中的数据不会重复,我们执行反复往一个集合中add相同的value,返回的结果为“0”,即成功0个
localhost:0>sadd set set-value1 set-value2 set-value3 set-value4 set-value5
"5" #---成功设置5个值
localhost:0>sadd set set-value1 set-value2 set-value3 set-value4 set-value5
"0" #---重复设置5个值,成功0个
使用场景:
1.随机取值:spop
2.求取交并差集:sdiff | sinter | sunion
3. 权限校验:sismember
使用注意:
1.set中不允许重复数据
2.最多保存为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)
localhost:0>zadd money 43 zhangsan #---zadd key 排序字段 value
"1" #---执行成功
localhost:0>zadd money 78 lisi
"1"
localhost:0>zadd money 438 wangwu
"1"
localhost:0>zadd money 32 zhaoliu
"1"
可以看到工具中已经给我们排好序了,那么是工具给我们排的序吗?
localhost:0>zrange money 0 -1
1) "zhaoliu"
2) "zhangsan"
3) "lisi"
4) "wangwu"
执行命令我们可以看到输出结果与工具上看到的一致。
使用注意:
- 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个双精度double类型的分数,可能造成精度丢失,使用时需要慎重。redis正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
。
。
。
。
。
。
。
最后~