文章目录
- 1.Redis 数据存储格式
- 2.Redis的五种数据类型(常用)
- string
- hash
- list
- set 类型
- sorted_set 类型
1.Redis 数据存储格式
- Redis本身是一个Map,其中所有的数据都是采用key:value的形式存储
- 数据类型指的是存储的数据类型,也就是value部分的类型,key部分永远都是字符串
2.Redis的五种数据类型(常用)
string(字符串)hash(哈希)list(列表)set(集合)zset(sorted set:有序集合)
这里介绍的是Redis中比较常用的五种数据类型,还有其他的数据类型。
string
- 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
- 存储数据的格式:一个存储空间保存一个数据
- 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
string 基本操作
- 添加/修改数据
set key value
- 添加/修改多个数据
mset key1 value1 key2 value2 …
- 获取数据
get key
- 获取多个数据
mget key1 key2 …
- 删除数据
del key
- 获取字符串长度
strlen key
- 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
string 扩展操作
- 设置数值数据增加指定范围的值
- incr key key 增加1
- incrby key increment key增加increment,increment可以为正,也可以为负(减)
- 设置数值数据减少指定范围的值
- decr key key 减1
- decrby key increment key 减少increment,increment为负代表加
- 设置数据具有指定的声明周期
- setex key seconds value 在指定的秒内能够获取到数据,超出时间就为nil
- psetex key milliseconds value 在指定的毫秒内能够获取到数据,超出时间就为nil
string 作为数值操作
- string 在Redis内部存储默认就是一个字符串,当遇到增减类操作incr、decr时会转成数值类型进行计算。
- redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
- 注意:按数值进行操作的数据,如果原始数据不能转换成数值,或超过了redis的数值上限范围(long类型数据的最大值),将报错。
string 类型数据操作的注意事项
- 数据操作不成功的反馈与数据正常操作之间的差异
① 表示运行结果是否成功
(integer) 0 → false 失败
(integer) 1 → true 成功
② 表示运行结果值
(integer) 3 → 3 3个
(integer) 1 → 1 1个
表示的是运行结构是否成功还是运行结果的值还是要看命令的具体功能 - 数据未获取到
(nil)等同于null - 数据最大存储量 512MB
- 数值计算最大范围(java中的long的最大值) 9223372036854775807
业务场景
- redis用于控制数据库表主键id(incr),为数据库表主键提供生成策略,保障数据库表的主键唯一性
- redis 控制数据的生命周期(setex),通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
- 主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量 (存储对象)
hash
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用对象存储信息
- 需要的存储的结构:一个存储空间保存多个键值对数据
- hash类型:底层使用哈希表结构试下数据存储
hash 基本操作
- 添加/修改数据
hset key field value
- 添加/修改多个数据
hmset key field1 value1 field2 value2…
- 获取数据
hget key field 获取某个字段的值
hgetall key 获取所有字段的值
- 获取多个数据
hmget key field1 field2…
- 删除数据
hdel key field1 [field2]
- 获取哈希表中字段的数量
hlen key
- 判断哈希表中是否存在指定的字段
hexists key field
hash 扩展操作
- 获取哈希表中所有的字段名或字段值
- hkeys key
- hvals key
- 设置指定字段的数字数据增加指定范围的值
- hincrby key field increment
- hincrbyfloat key field increment
hash 注意事项
- hash 类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)。
- 每个hash 可以存储2 的32次方 减1个键值对
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计的初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
- hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
应用场景
hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。
list
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且存储的数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现
list 基本操作
-添加/修改数据
- lpush key value1 [value2]… 从左边进入,类似入栈
- rpush key value1 [value2]…从右边进入
- 获取数据
- lrange key start stop 获取从索引start到索引stop的数据,stop可以为负数,代表倒数第几个
- lindex key index 获取索引为index的数据
- llen key 获取list中元素的个数
- 获取并移除数据
- lpop key 从左边取出数据
- rpop key 从右边取出数据
- 移除数据
lrem key count value 从列表中找到第count个等于value的元素,并进行删除,根据count的不同有不同的情况
list 扩展操作
- 规定时间内获取并移除数据,阻塞式获取,获取值如果还没有的时候可以等,如果有值就可以获取到,超过时间,还没有的话,返回nil。
- blpop key1 [key2] timeout
- brpop key1 [key2] timeout
- brpoplpush source destination timeout
list 注意事项
- list中保存的数据都是string类型的,数据总容量数有限的,最多2的32次方减1个元素
- list具有索引的概念,但是操作时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈的操作
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作,通常第一页的信息来自list,第二页的及更多的信息通过数据库的形式加载
应用场景
- 消息队列
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。 - 最新内容
因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”。
几个口诀:
lpush + lpop 栈
lpush + rpop 队列
lpush + ltrim = 有限集合
lpush + brpop = 消息队列
set 类型
新的存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,但是set仅存储键,不存储值(nil),并且value是不允许重复的,底层是哈希表
set 基本操作
- 添加数据
sadd key member1 [member2]
- 获取全部数据
smembers key
- 删除数据
srem key member1 [member2]
- 获取集合数据数量
scard key
- 判断集合中是否包含指定数据
sismember key member
set 扩展操作
- 随机获取集合中指定数量(count默认为1)的数据
srandmember key [count]
- 随机将集合中指定数量(count 默认为1)的数据移出集合
spop key [count]
- 多个集合的交、并、差集
- sinter key1 [key2 …]
- sunion key1 [key2…]
- sdiff key1 [key2…] 注意key1在前表示得到的是key2中没有的key1元素
- 多个集合的交、并、差集并存储到指定集合中
- sinterstore destination key1 [key2…]
- sunionstore destination key1 [key2…]
- sdiffstore destination key1 [key2…]
- 将指定数据(一个)从原始集合中移动到目标集合中
smove source destination member
set注意的事项
- set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
- set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
set 应用场景
- 显示共同好友
- 随机推荐
redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐, 大V推荐等
sorted_set 类型
- 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 需要的存储结构:新的存储模型,可以保存排序的数据
- sorted_set类型:在set的存储结构基础上添加可排序的字段
sorted_set 基本操作
- 添加数据
zadd key score1 member1 [score2 member2] 默认升序排列
- 获取全部数据
- zrange key start stop [WITHSCORES] ——start stop 代表索引,加上withscores,有scores的值,不加,就只有members 没有scores的值 升序输出
- zrevrange key start stop [WITHSCORES] 反序(降序)输出
- 按条件获取数据
- zrangebyscore key min max [WITHSCORES] [LIMIT] ——min max 是数据的范围,limit用于限定查询范围,作用于查询结果,后面跟两个参数,offset,从第结果的几个开始,count 获取几条数据
- zrevrangebyscore key max min [WITHSCORES]
注意limit作用于查询结果
- 删除数据
zrem key member [member…]
- 按条件删除数据
- zremrangebyrank key start stop
- zremrangebyscore key min max
- 获取集合数据总量
zcard key
zcount key min max
- 集合交、并操作
zintestore dstination numkeys key [key…]
zunionstore destination numkeys key [key…]
sorted_set 扩展操作
- 获取数据对应的索引
zrank key member
zrevrank key member
- score 值获取与修改
zscore key member
zincrby key increment member
应用场景
- 排行榜
- 游戏好友亲密度
参考:
112节Redis入门到精通
如有不足之处,欢迎指正,谢谢!