Redis 数据类型(5种常用)
数据类型 | 类比Java数据类型 |
---|---|
string | String |
hash | HashMap |
list | LinkedList |
set | HashSet |
sorted_set | TreeSet |
- 查询数据类型用法
help @数据类型
redis 数据存储格式
- redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
- 数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
String
- 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
- 存储数据的格式:一个存储空间保存一个数据
- 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
string基本操作
- 添加数据(若已存在,就直接覆盖)
set key value
- 获取数据
get key
- 删除数据
del key
- 添加/修改多个数据
mset key1 value1 key2 value2
- 获取多个数据
mget key1 key2 ...
- 获取数据字符个数(字符串长度)
strlen key
- 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
单数据操作 VS 多数据操作
- 若需要操作大量数据,可合理地切割为多个操作,一次操作多个数据。此作用是,减少客户端与服务端之间传输数据所需的时间(比如,客户端与服务端连接的时间)。
减少了中间的传输时间,但处理时间不变
string 数值操作
- 数值自增一,若不存在,则新建一个key,value为增加的值。
incr key
- 数值增加相应的值。(整型类型)
incrby key increment
- 数值增加响应的值。(浮点类型)
incrbyfloat key increment
在小数点后数值存在之前,
incr
和incrbyfloat
都能用,但存在小数点后的数值之后,就只能用incrbyfloat
了 - 数值减少,同理。注意,没有浮点数的减少方法,若需要,则通过增加负数的方法。
decr key decrby key increment
- redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
- 数值上限:9223372036854775807(java中long型数据最大值,
Long.MAX_VALUE
)。 - 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。
string数据生命周期
- 设置数据具有指定的生命周期
setex key seconds value psetex key milliseconds value
其他
- 数据操作不成功的反馈与数据正常操作之间的差异
- 表示运行结果是否成功
- (integer) 0 → false 失败
- (integer) 1 → true 成功
- 表示运行结果值
- (integer) 3 → 3 3个
- (integer) 1 → 1 1个
- 数据未获取到:(nil)等同于null
- 数据最大存储量:512MB
- 数值计算最大范围(java中的long的最大值):9223372036854775807
命名习惯
表名: 主键名: 主键值: 字段名
。- 比如,一个表是
users
,主键是id
,主键值为5456456
,该字段username
对应的key为users:id:5456456:username
- 存储一个bean,有两种方式:
- 多个
key-value
键值对保存
- json格式保存
- 多个
hash
- 对象类数据的存储如果具有较频繁的更新需求操作会显得笨重。(见上方法)
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构:一个存储空间保存多个键值对数据
- hash类型:底层使用哈希表结构实现数据存储
- hash存储结构优化
- 如果field数量较少,存储结构优化为类数组结构
- 如果field数量较多,存储结构使用HashMap结构
基本操作
- 添加/修改数据
hset key field value
- 仅当字段名不存在才创建
hsetnx key field value
- 获取数据
hget key field hgetall key
- 删除数据
hdel key field1 [field2]
删除键用
del
,删除域用hdel
- 添加/修改多个数据
hmset key field1 value1 field2 value2 …
- 获取多个数据
hmget key field1 field2 …
- 获取哈希表中字段的数量
hlen key
- 获取哈希表中是否存在指定的字段
hexists key field
- 获取该key的所有字段名(虽然叫做
hkeys
,获取的却是field
)hkeys key
- 获取该key的所有字段名的值
hvals key
- 设置指定字段的数值数据增加指定范围的值
hincrby key field increment hincrbyfloat key field increment
其他
hash
类型下的value
只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil
)- 每个 hash 可以存储
2^32 - 1
个键值对 - hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall
操作可以获取全部属性,如果内部field
过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
list
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现
list基本操作
-
添加/修改数据。分别从左边插入,和从右边插入
lpush key value1 [value2] …… rpush key value1 [value2] ……
-
获取数据。下标从0开始,可以以负数的形式表示(-1为最后一个元素的下标),类似于python的列表下标。
lrange key start stop lindex key index llen key
-
获取并移除数据。分别从左边和右边取出。
lpop key rpop key
-
规定时间内获取并移除数据
blpop key1 [key2] timeout brpop key1 [key2] timeout brpoplpush source destination timeout
pop数据,如果没有,那就等待timeout秒,有可能其他客户端会push数据。
从一个list的右边pop出数据,从另一个list的左边push进去
-
通过不同方向的
push
和pop
操作,可以实现队列的栈的数据结构。 -
移除指定数据
lrem key count value
其他
- list中保存的数据都是string类型的,数据总容量是有限的,最多
2^32 - 1
个元素 (4294967295)。 - list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
set类型
- 新的存储需求:存储大量的数据,在查询方面提供更高的效率
- 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
- set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
基本操作
-
添加数据
sadd key member1 [member2]
-
获取全部数据
smembers key
-
删除数据
srem key member1 [member2]
-
获取集合数据总量
scard key
-
判断集合中是否包含指定数据
sismember key member
-
随机获取集合中指定数量的数据
srandmember key [count]
-
随机获取集合中的某个数据并将该数据移出集合
spop key [count]
-
求两个集合的交、并、差集
sinter key1 [key2] sunion key1 [key2] sdiff key1 [key2]
-
求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2] sunionstore destination key1 [key2] sdiffstore destination key1 [key2]
-
将指定数据从原始集合中移动到目标集合中
smove source destination member
sorted_set
- 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 需要的存储结构:新的存储模型,可以保存可排序的数据
- sorted_set类型:在set的存储结构基础上添加可排序字段
基本操作
- 添加数据
zadd key score1 member1 [score2 member2]
- 获取全部数据,正序(从小到大)和反序(从大到小)输出所有内容。并且可以选择输出的下标范围。
zrange key start stop [WITHSCORES] zrevrange key start stop [WITHSCORES]
- 删除数据
zrem key member [member ...]
- 按条件获取数据。通过score,排序输出所有内容,并且通过score进行范围筛选。
zrangebyscore key min max [WITHSCORES] [LIMIT] zrevrangebyscore key max min [WITHSCORES]
- 条件删除数据。左闭右闭,可以通过排名、通过分数范围进行删除。
zremrangebyrank key start stop zremrangebyscore key min max
- 获取集合数据总量。分别是字段个数以及指定范围内的字段个数。
zcard key zcount key min max
- 集合交、并操作。值得一提的是,合集、交集的相同key的score都会叠加。
zinterstore destination numkeys key [key ...] zunionstore destination numkeys key [key ...]
- 获取数据对应的索引(排名)
zrank key member zrevrank key member
- score值获取与修改
zscore key member zincrby key increment member
其他
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
- sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反
复覆盖,保留最后一次修改的结果