redis的数据结构
string hash set zset list 五种数据结构
string为key value格式的一组组数据,key需要保持唯一性
可以设置过期时间 set name zwj ex 10
可以在不存在的情况下插入 setnx name test
获取值 get name
批量设置 mset name james age 19
应用场景:
缓存,减少数据库压力,将部分数据存储在redis中
session共享,在集群的情况下通过spring session和redis实现session共享
计数器:redis为单线程,计数器可为原子操作,比如文章的点赞数,浏览量统计,分享数等
分布式系统全局序列号:分布式数据库集群的情况下,可通过redis生成全局唯一的序列号
hash 储存类似于关系型数据库的表结构
存储一些对象信息相比与string类型更加直观,更加节省空间等,但是过期时间只能作用在ky上,不能作用到哈希表中的key上
类似于数据表的二维表的格式用hash
hmset user:001 name james sex boy age 19
hgetall user:001
hget user:001 name
list队列类型(列表总的元素可以重复)最多可存 2的32次方减1个元素
相对来说有个先后顺序的都可以这样来
构造数据结构:栈,队列,阻塞队列
微信关注的订阅号消息列表
lpop
lpush
rpush
rpop
set集合类型(已无序的方式来储存多个各不相同的元素,最多存放2的32次方减一个元素)
用户标签,社交,查询有共同兴趣爱好的人,智能推荐
点赞,收藏,标签,抽奖(可以求差集|交集|并集)
社交关系模型
sadd user1 a b c
smembers user1
srem user1 a //返回1 删除元素a remove
scard user1 //返回2 计算元素个数
使用示例:
sadd user:1:fav basball fball pq
sadd user:2:fav basball fball
..............................
或给标签添加用户
sadd basball :users user:1 user:2
sadd fball :users user:1 user:2
..............................
计算有共同爱好的人
sinter user:1:fav user2:fav
zset类型(有序集合)
zadd key score member
zadd user:zan 200 james 120 mike 100 lee
有排名的点赞,收藏之类的信息,常用于排行榜,如视频网站需要对用户上传视频做排行榜,活点赞数与集合有联系,不能有重复的成员
一个元素跟一个数字类型的 score 根据score可以进行排序
1,key名称
规范性:使用业务名作为前缀,用冒号分割。有子系统时,可以使用多个冒号或者下划线。例如order:time:123456 data_123_456
间接性:在保持规范性的同时,也需要注意key的长度,key过长会导致占用较多的内存空间
避免转移字符:不能使用逗号,换行,空格,双引号,单引号,大括号等转义字符
2,集合类操作
使用zset,set,list,hash等集合类的O(N)操作时要评估当前元素个数的规模,以及将来的增长规模,对于短期就可能变为大集合的key,要预估O(N)操作的元素数量,避免全量,可以使用HSCAN,SSCAN,ZSCAN进行渐进操作
集合元素数量过大在使用过程中会影响redis的实际性能,hash类元素个数建议尽量不要超过100,集合类,链表类数量尽量不要超过10k。元素数量过大可考虑拆分成多个key进行处理
3,value大小
数量比较多的时候可以考虑改用hash,list等结构存储,没一个filed存放一些信息,如果数量略微较大可使用hscan获取,如果数据量超过建议值,可以考虑拆分成多个key
当数据量较小的时候,建议使用string,当value偏大时也可以考虑对他进行压缩以减少读取和写入对象是所需的网络带宽。对比压缩算法lz4,gzip,bzip,看看哪个算法能够对存储的数据提供最好的压缩效果和最好的性能
string类型尽量控制在10k以内,虽然redis对单个key可以缓存的对象长度能够支持到很大,1k基本是redis的性能拐点。当缓存超过10k,100k,1m性能会有特别明显的下降