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 timeoutb:即为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的值会被反复覆盖,以最后一次覆盖为准
