Redis是键值数据库,所以redis本身就是map并且key只能为String类型,五种数据类型是指value存储的数据类型。
Redis的五种基本数据类型(还有其它的数据类型,这五种是最常用的)
1.string 2.hash 3.list 4.set 5.sorted_set
一、String类型
说明:value存储的就是一个String类型的数据
基本操作:
·添加或修改操作:
set key value
案例演示:
set name lzywl
get name
set name lzpyy
get name
·获取操作
get key
·删除操作
del key
在redis中1表示true,0表示false
·添加\修改多个数据
mset key1 value1 key2 value2 ...
·获取多个数据
get key1 key2 ...
·获取数据字符个数(字符串长度)
strlen key
·追加信息到原始信息的后部(如果原始信息存在则追加,不存在则创建)
append key value
返回结果是:追加之后的字符总长度
set与mset的比较:
同样是存储三条数据,使用set的话,发送消息和接收反馈消息的时间是要比mset耗时
String数据类型的应用场景1:
在大型企业级应用中,分表操作是基本操作,使用多张表存储相同的数据类型,但是在mysql中主键是自增长的,如何保证主键不重复呢?此时就可以使用redis的String数据类型来保存主键重复的问题
解决方案:
·设置数值数据增加指定范围的值
incr key // 默认增加1
incrby key increment //按指定值增加
incrbyfloat key increment //按指定的增加,此值为float类型
·设置数值数据减少指定范围的值
decr key //默认减少1
decrby key decrement //按指定值减少
String作为数值类型的说明:
①String数据类型存储的是一个字符串,但遇到incr、decr将会转化为数值进行计算
②Redis中的操作都是原子操作,采用单线程处理业务,因此不需要考虑并发带来的影响
③String存储的字符串数据转化成数值失败或者超出了redis数值的上限值则会报错,redis数值的上限值为9223372036854775807(java中long数据类型的最大值,java.MAX_VALUE)
String数据类型的应用场景2:
"最强女生"启动海选投票,只能通过微信投票,每个微信号每4个小时只能投1票
电商商家开启热点商品推荐,热门商品不能一直处于热门期,每种商品热门维持3天,3天后自动取消热门
新闻网站会出现热点新闻,热点新闻最大的特征就是时效性,如何自动控制热点新闻的时效性
解决方案:
·设置数据具有指定的生命周期
setex key seconds value //设置数据的生命周期,单位为毫秒
psetex key milliseconds value //设置数据的生命周期,单位为毫秒
String数据类型操作的注意事项:
1.数据操作失败的反馈与数据正常操作之间的差异
①表示运行成功
(Integer)0 -> false 失败
(Integer)1 -> true 成功
②表示运行结果
(Integer)3 ->3 3个
(Integer)1 ->1 1个
2.数据未获取到
(nil) -> null
3.数据最大存储量
512MB
4.数据计算最大范围
java中long的最大值 ->9223372036854775807
业务场景:
主页高频访问信息控制,例如新浪微博大v主页显示粉丝数与微博数量
解决方案:
·在redis中为大v用户设定用户信息,以用户主键和属性作为key,后台设定定时刷新策略即可
·在redis以json格式存储大v的信息,定时刷新(也可以使用hash类型)
redis中key设置的约定:
表名 : 主键名 : 主键值 : 字段名
example order : id : 1234566 : name
Redis数据类型之hash
针对于对象数据类型采用json类型存储,对于频繁的更新的话会显的很笨重,因此,可以使用hash来存储
存储结构hash的说明:
①对一系列存储的数据进行编组,方便管理,典型的用于存储对象数据类型
②一个存储空间内保存多个键值对数据
③底层使用哈希表结构实现数据存储
hash在redis中的存储结构:
hash存储结构的优化:
①如果field数量较少,存储结构优化为类数组结构
②如果field数量较多,存储结构使用hashMap结构
hash数据类型的基本操作:
·添加/修改数据
hset key field value
说明:虽然更改数据时显示的是(Integer)0但是会进行一个数据的替换
·查询数据
hget key field
·删除数据
hdel key field
·添加/更新多个数据
hmset key field value field value ...
·查看多个数据
hmget key field field ...
·获取hash表中字段的数量
hlen key
·判断hash表中是否存在指定字段
hash类型数据的扩展操作:
·获取哈希表中的所有字段名或字段值
hkeys key
hvals key
·指定hash表中的字段值增加指定范围的数值
hincrby kye field increment
hincrbyfloat key field increment
hash数据类型的说明:
1.hash类型下的value只能存储字符串类型的数据,不能存储其它数据类型,如果为获取到则值为nil
2.每个hash可以存储2^32-1个键值对
3.hash类型十分贴近存储对象数据类型,并且可以灵活删除对象属性,但hash设计的初衷不是为了存储大量对象而设计的,切记不可滥用,更不可将hash作为对象列表使用
4.使用hgetall操作可以获取全部属性,如果内部的field过多,遍历整体数据效率会很低,有可能成为数据访问的瓶颈
hash数据类型的应用场景一:
购物车中的数据存储就可以使用hash:
①模拟购物车的添加
②模拟查看购物车
③模拟商品数量的增加/减少
④模拟购物车商品删除
⑤清空购物车
业务场景一中存在的问题:商品信息需要二次查询数据库,并没有实现数据加速的效果
解决方案:
①将购物车中的每条商品记录保存成两个field的
②第一个field的用于存放商品的数量
③第二个field用于存放商品的信息,例如:文字描述、图片地址、所属商家
使用json数据进行一个保存
业务场景二:
双十一,运营商公司推出30元、50元、100元商品抢购活动,限量1000张
解决方案:
①运营商公司作为key
②商品类型作为field
③限制数量作为value
Redis数据类型之list:
list说明:
①存储多个数据,对数据进入存储空间的顺序进行区分
②一个存储空间可以保存多个数据,且通过数据可以体现进入的顺序
③保存多个数据,底层使用双向链表存储结构实现
list类型数据的基本操作:
·添加/修改数据
lpush key value value value ...
rpush key value value value ...
·获取数据
lrange key start end //获取list元素
lindex key index //获取某个位置上list的元素
llen key //获取list的添加元素的个数
·获取并移除数据
lpop key
rpop key
·list规定时间内获取并移除数据
blpop key timeout
brpop key timeout
brpoplpush source destination timeout
b:即为blocking,它可以等
list数据类型的应用场景一:
微信朋友圈点赞,要求按照点赞顺序显示好友信息,取消点赞则移除对应的好友信息
解决方案:
list类型数据的操作事项:
1.list保存的都是String数据类型,总量为2^32-1
2.list具有索引的概念,但是操作数据时通常以队列的的形式入队出队,或以栈的形式入栈出栈
3.获取全部数据时结束索引设置为-1
4.list可以对数据进行一个分页操作,通常第一页的信息来自于list,第二页及更多的信息通过数据库的形式加载
list的业务场景二:
Twitter、微博中个人用户的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最新关注的粉丝列在前面
新闻、咨询类网站如何将最新的新闻或咨询按照发生的时间顺序展示?
企业系统运营中,系统将产生大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?
解决方案:
1.依赖于list存储数据的顺序的特征对信息进行管理
2.使用队列模型模型解决多路信息汇总的合并的问题
3.使用栈模型解决最新消息的问题
Redis数据类型之set
说明:
①可用于存储大量的数据,高效的内部存储机制,便于查询
②结构与hash一样,但是只存储键值,value的值为nil,并且值不允许重复
set数据类型的基本操作:
·添加数据
sadd value value ...
·获取数据
smembers key
·删除数据
srem key value value...
·获取set元素个数
scard key
·判断set是否含有
sismember key value
set 的业务场景一:
用户首次使用今日头条时会设置3项爱好,但是为了后期增加用户的活跃度、兴趣点、必须让用户对其它信息类别产生兴趣,增加用户留存度,如何实现?
业务分析:
①系统分析出各个分类的最新或最热点的信息条目并组织成set集合
②随机挑选出其中的部分信息
③配合用户关注信息分类中的热点信息组织成展示的全信息集合
解决方案:
·随机获取集合中指定数量的数据
srandmember key count
·随机获取集合中的某个数据并将该数据移除集合
spop key count
set类型数据的扩展操作:
·求两个集合交、并、差集
sinter key1 key2 //集合的交集
sunion key1 key2 //集合的并集
sdiff key1 key2 //集合的差集
·求两个集合交、并、差集并存储到指定集合中:
sinterstore destination key1 key2
sunionstore destination key1 key2
sdiffstore destination key1 key2
·将原始集合中的数据移动到目标集合中
set数据类型使用的注意事项:
1.set虽然不允许数据的重复,如果添加的数据在set中已经存在,将只保留一份
2.虽然set的存储结构与hash的一致,但是无法启用value的存储空间
set的业务场景一:
Redis数据类型之sorted_set:
说明:
1.可以保存可排序的数据
2.在set的基础上添加了可排序字段
set数据类型的基本操作:
·添加数据
zadd key score1 member1 score2 member2 ...
·获取数据
zrange key start end [withscores]
zrevrange key start end [withscores]
·删除数据
zrem key member ...
·按照条件获取数据
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
·按照条件删除
zremrangebyrank key start end //[start,end]
zremrangebyscore key min max
·获取集合数据的总量
zcard key
zcount key min max
·集合的交、并操作
zinterstore destination numberkeys key1 key2 key3 ...[aggregate min|max]
zunionstore destinaion numberkeys key1 key2 key3 ...[aggregate min|max]
sorted_set数据类型的业务场景分析:为所有参与排名的资源建立排序依据
票选广东十大杰出青年,各类综艺选修海选投票
各类资源网站TOP10
聊天室活跃度统计
游戏好友亲密度
解决方案:
①获取数据对应的排序
zrange key start end [withscores]
zrevrange key start end [withscores]
②获取score的值并修改
zscore key member
zincrby key increment member
sorted_set类型数据操作的注意事项:
1.score保存的数据范围是64位
2.score可以保存双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重
3.sorted_set底层还是set,不能保存重复的值,如果保存相同的值,score的值会被反复覆盖,以最后一次覆盖为准