redis(二)数据类型及通用指令
介绍
redis自身是一个Map,其中所有的数据都是采用key:value的形式存储的
数据类型指的是存储的数据的类型,也就是value的类型,key则永远是字符串
Redis数据类型(5种常用)
1.string
2.hash
3.list
4.set
5.sorted_set
string(关注点:整体性、读)
1.string简介
存储的数据未单个数据,最简单的数据存储类型,也是最常用的数据存储类型
一个存储空间只保存一个数据
通常只是字符串,如果以数字形式展示,可以作为数字使用
取值范围同java中的long.Max_value的长度- 9223372036854775807 到 9223372036854775807
2.基本操作
添加/修改数据:
set key value
添加成功返回ok
获取数据:
get key
获取成功则有值,获取失败则为(nil)
删除数据:
del key
删除成功则返回1删除失败则返回0
添加/修改多个数据:
mset key1 value1 key2 value2...
获取多个数据
mget key1 key2..
获取多个数据,不存在则为(nil)
获取字符串长度
strlen key
追加信息到原始信息后边(如果存在就追加,如果不存在就新建)
append key value
3.扩展操作
场景1:全局序列
大型企业应用中存在分表的操作,那么多张表的主键必须保证唯一性,oracle中存在sequence,Mysql不存在类似的,则可以利用redis来做
扩展操作
设置数值数据增加置顶范围的值
incr key --> +1
invrby key increment --> +指定整数
incrbyfloat key increment -->+指定小数
备注:如上图结果incr 如果key不存在则直接创建1,当为负数的时候则做减法
invrby 不能用小数 但是也可以用负数
incrbyfloat可以用整数也可以用小数,也可以用负数,但是返回的类型为字符串
设置数值数据减少置顶范围的值
decr key --> -1
decrby key increment -->-指定整数
场景2:数据生命周期
各种海选、各种投票场景,通过微信投票,限制每几个小事只能投1票;电商热门推荐,商品不能一直处于热门期,等让人们商品有声明周期,到时间自动取消热门
扩展操作
设置数据具有指定的声明周期
setex key seconds value -->固定秒后失效
psetex key milliseconds value -->固定毫秒后失效
备注:redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
4应用场景
如微博中显示粉丝数量和微博数量
可以设置用户的主键和属性值作为key,后台设定定时刷新策略
如 b_user🆔123456:fans --> 6458
b_user🆔123456:blogs --> 524等
也可以设置为json的形式
如user:id:123456 -->{"id":"1231".....}
hash(关注点:一个入口,改)
1.hash介绍
如果对象类数据需要频繁的(部分字段)更改则string可能不太适用,所以现在有hash做存储数据的分组
特点:
1.对一系列的存储的数据进行分组,方便管理,类似对象信息
2.一个存储空间可以保存多个键值对
3.底层试用哈希表结构实现数据存储 -->如果field数量较少,存储结构则为数组,如果较多则试用HashMap结构
2.基本操作
添加/修改数据
hset key field value
获取数据
hget key field
hgetall key
删除数据
hdel key field1 field2
备注:删除时返回的是删除数量
添加/修改多个数据
hmset key field1 value1 field2 value2..
获取多个数据
hmget key field1 field2..
获取哈希表中字段的数量
hlen key
获取哈希表中师傅存在指定的字段
hexists key field
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
添加数据,如果存在则不执行如果不存在则新增
**hsetnx ** key field value
3.注意事项
1.hash类型下value只能存储字符串
2.hash可以存储 2的32次方 -1 个键值对
3.hash类型是否贴近对象的数据存储形式,并且可以灵活添加删除属性,但hash设计初衷不是为了存储大量对象设计,不可滥用,更不能将hash作为对象列表使用
4.hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率会很低,所以还是需要哪个取哪个
4.应用场景
电商网站中的购物车功能,
未登录用户应该用cookie等存储,当前不讨论,仅讨论登录用户购物车在redis的存储模型
分析
将用户id作为key,每位用户创建hash存储结构存储对应的购物车信息
将商品编号作为field,购买数量作为value
1.添加商品:追加filed和value
2.浏览:获取用户全部field
3.更改数量:增加/减少对应的value
4.删除商品:删除field
5.清空:删除key
但是如果这样的话还是得根据商品编号查询数据库
可以将商品独立出来一个hash单独存储用于保存,商品信息,文字描述,图片、商家等信息
但是商品过多也会造成存或者取较为困难,所以此时可以将商品根据品类等维度拆分为多个hash
添加商品可以用**hsetnx ** 避免重复的覆盖
list(关注点:队列)
1.list介绍
特点:
1.存储多个数据,并对数据进入存储空间的顺序进行区分
2.一个存储空间保存多个数据,且通过数据可以体现进入的顺序
3.底层是使用双向链表存储结构实现的
顺序表:内存连续,便于寻址,所以查询速度较快,由于插入需要顺序位移,所以修改较慢
链表:内存排列不规律,首位相接,插入也不需要移动位置
双向链表:内存排列不规律,插入不需要移动位置
2.list基本操作
添加数据
lpush key value1 [value2] ……
rpush key value1 [value2] ……
获取数据
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
移除指定数据
lrem key count value
3.注意事项
1.list中保存的数据都是string类型的,数据总容量是有限的,最多2的32次方 - 1 个元素 (4294967295)。
2.list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
3.获取全部数据操作结束索引设置为-1
4.list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
4.应用场景
场景1,朋友圈点赞
朋友圈点赞需要显示点赞的好友及其顺序,如果取消点赞则需要移除对应的好友
可以应用lrem移除对应的好友
场景2,微博
微博等个人中心需要展示关注的用户,并且得按照关注的信息展示
set(关注点:大数据量的查询,集合之间的操作)
1.set介绍
特点
1.存储大量的数据,在查询方面提供更高的效率
2.结构与hash结构完全相同,但是仅存储键不存储值,并且值不能重复
2.基本操作
添加数据
sadd key member1 [member2]
获取全部数据
smembers key
删除数据
srem key member1 [member2]
获取集合数据的总量
scard key
判断集合中是否包含制定数据
sismember key member
3.扩展操作
3.1场景
1.每位新的知乎等用户首次使用应用的时候都会设置几项感兴趣的内容,但是实际上而言勾选的有可能是随便选的,不一定太感兴趣,所以为了增加用户的活跃度,兴趣点,必须摸索出用户是否对别的类别有兴趣,所以需要出去这几项感兴趣的内容以外,随机给用户推送少量的其他品类的信息,如果用户点击了或者感兴趣了,可以将该类加入到爱好的内容中。
2.QQ的你可能认识的人
3.美团推荐适合用户的美食或景点等
3.2扩展操作
随机获取集合中指定数量的数据
srandmember key [count]
随机获取集合中的某个数据并将该数据移出集合
spop key [count]
备注:应用去随机推荐类的信息检索,如热点歌单、热点新闻、应用app等
求两个集合的交、并、差集
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
备注:移动指定元素,原数据删除,目标集合如果存在则覆盖,如果不存在则新增
可用于同类信息的关联搜索、二度关联搜索、深度关联搜索
1.显示共同好友(一度)
2.从A出发,获取好友用户B的充值记录(二度)
3.用户多角色的合并
4.黑名单、白名单
sorted_set(关注点:排序)
1.介绍
可以存储可排序的数据
在set的存储结构基础上加上了排序字段
2.基本操作
添加数据
zadd key score1 member1 [score2 member2]
获取全部数据
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
删除数据
zrem key member [member ... ]
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
按条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
备注: min与max用于限定搜索查询的条件
min与max用于限定搜索查询的条件
offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
获取集合数据总量
zcard key
zcount key min max
集合交、并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ... ]
备注:此处值为相加的
3.扩展操作
3.1场景
海选投票、各类资源网站TOP10、聊天室活跃度统计、游戏好友亲密度
3.2扩展
获取数据对应的索引(排名)
zrank key member
zrevrank key member
score值获取及修改
zscore key member
zincrby key increment member
4.注意事项:
score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时 候要慎重
sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反 复覆盖,保留最后一次修改的结果
5.应用场景
5.1场景
各类视频网站都设定了会员的使用服务,或者是加速下载适用多长时间的服务,对这一类的业务如何设计
5.2解决
1.基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
2.记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间
3.当有新任务加入时,盘点并更新当前下一个要处理的任务时间
4.为提升sorted_set的性能,通常将任务根据特征划分成为若干个sorted_set。例如一小时内、一天内、周内、月内等,操作等级追歼提升,当前者集合处理完或即将处理完时,从后者取数据放到前面
通用指令
1.key通用指令
1.1key基本操作
删除指定 key
del key
获取key是否存在
exists key
获取key的类型
type key
1.2key扩展操作(时效性控制)
为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
获取key的有效时间
ttl key
pttl key
切换key从时效性转换为永久性
persist key
查询key
keys pattern
key改名
rename key newkey 如果有重复的会覆盖
renamenx key newkey 如果有重复的返回错误
对所有key排序
sort 原集合不变
其他key通用操作
help @generic
2.数据库通用操作
2.1数据库
redis为没个服务提供有16个数据库,从编号0到15
没个数据库之间的数据相互独立
2.2db基本操作
切换数据库
select index
其他操作
quit
ping
echo message
数据移动
move key db
数据清除
dbsize
flushdb
flushall
本文来自博客园,作者:zhao56,转载请注明原文链接:https://www.cnblogs.com/zhao56/p/14874290.html