1. 入门
1.1 简介
-
问题
- 海量用户
- 高并发
-
原因
- 性能瓶颈:磁盘IO性能低下
- 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群
-
解决思路
-
降低磁盘IO次数--内存存储
-
去除数据间关系--不存储关系,仅存数据
NoSql
-
1.2 NoSql
- 定义:NoSql(Not-Only-Sql)泛指非关系型数据库,作为关系型数据库的补充。
- 作用:应对海量用户和海量数据前提下的数据处理问题。
- 相对特征
- 可扩容,可伸缩
- 大量数据下高性能
- 灵活的数据模型
- 高可用
- 常见NoSql数据库
- Redis
- MemCache
- HBase
- MongoDB
- 解决方案(电商场景)
- 商品基本信息(MySql)
- 名称
- 价格
- 厂商
- 商品附件信息(MongoDB)
- 描述
- 评论
- 详情
- 图片信息(分布式文件系统)
- 搜索关键字(ES、Lucene、Solr)
- 热点信息(Redis、MemCache、tair)
- 高频
- 波段性
- 商品基本信息(MySql)
- 应用场景:不同的nosql适用于不同的场景,技术选型的时候要合理考虑。
1.3 Redis
- 定义:Redis(Remote Dictionary Server)是用C语言开发的开源的单线程的高性能的额键值对数据库。
- 特征
- 数据间没有必然关系
- 内部采用单线程进行工作
- 高性能
- 支持多数据类型(只针对value,key都是string类型)
- string
- hash
- list
- set
- sorted_set
- 支持数据持久化,容灾
- 应用
- 热点数据的加速查询,如热点商品、热点资讯等
- 任务队列,如秒杀、抢购、购票排队等
- 即时信息查询,如排行榜、访问统计、在线人数等
- 实效性控制,如邀请码控制、投票控制等
- 分布式系统数据共享,如session共享
- 消息队列
- 分布式锁
1.4 常用命令
- set key value
- get key
- del key
- clear
- exit
- quit
- help
2. 基本数据类型
2.1 string
- 基本描述
- 存储的数据:单个数据,最简单和最常用的数据存储类型。
- 存储数据格式:一个存储空间保存一个数据。
- 存储内容:通常使用字符串,如果字符串以整数形式展示,可以作为整数进行操作。
- 基本操作
- 添加/修改
- set key value
- mset key1 value1 key2 value2 ...(m--multiple 多个)
- 获取
- get key
- mget key1 key2 ...
- 删除
- del key
- 获取字符个数(字符串长度,value的长度)
- strlen key
- 追加信息到原始信息后部(如果原始信息存在就追加,不存在就新建)
- append key value
- 添加/修改
- 扩展操作
- redis用于控制数据库主键id的生成,保证主键唯一性
- 业务场景:分布式系统中,分表架构的主键ID,要保证统一性且不能重复,oracle中有sequence实现,mysql没有具体方案,如何解决?
- 解决方案
- 设置数值增加(必须是整型数据,否则报错,并且不能超过long的最大数据值)
- incr key(自增)
- incrby key increment(增加指定值)
- incrbyfloat key increment(增加浮点型的指定值,可以增加整数型)
- 设置数值减少(同增加,增加和减少的值都可以为负数)
- decr key (自减)
- decrby key increment
- 设置数值增加(必须是整型数据,否则报错,并且不能超过long的最大数据值)
- redis控制数据的生命周期,通过数据是否有效来控制业务
- 业务场景:热门商品推荐有效期,很多热点信息都具有时效性。
- 设置数据具有指定的生命周期
- setex key seconds value
- psetex key milliseconds value
- redis应用于各种结构型和非结构型的高热度数据访问加速
- eg: user:id:3506728370:fans → 12210947(大V粉丝数) 注:参考下文key命名规范
- eg: user:id:3506728370 →
{"id":3506728370,"name":"春晚","fans":12210862,"blogs":6164, "focus":83}
- redis用于控制数据库主键id的生成,保证主键唯一性
- 注意事项
- 数据操作不成功的反馈与数据正常操作之间的差异(取决于想要获取什么)
- 表示运行结果成功
- 0->false
- 1->true
- 表示运行结果的值
- 3->3个
- 1->1个
- 表示运行结果成功
- 数据未获取到(nil等同于null)
- 数据最大存储量(512MB)
- 数值计算最大范围(Java中long的最大值-9223372036854775807)
- 数据操作不成功的反馈与数据正常操作之间的差异(取决于想要获取什么)
- 数据规范(热点数据key命名规范)
- 表名:主键名:主键值:字段名
2.2 hash
- 基本描述
- 对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
- 一个存储空间保存多个键值对数据。
- 底层使用hash表实现结构实现数据存储。
- 基本操作
- 添加/修改数据
- hset key field value
- hmset key field1 value1 field2 value2 ...
- 获取数据
- hget key field
- hmget key field1 field2
- hgetall key
- 删除数据
- hdel key field1 [field2]
- 获取hash表中字段数量
- hlen key
- 获取hash表中是否存在指定字段
- hexists key field
- 添加/修改数据
- 扩展操作
- 获取hash表中所有的字段名和字段值
- hkeys key
- hvals key
- 设置指定字段的数值数据增加指定范围值
- hincrby key field increment
- hincrbyflot key field increment
- 获取hash表中所有的字段名和字段值
- 注意事项
- hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未取到,对应的值为nil。
- 每个hash可以存储2³²-1个键值对。
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但是不可滥用。
- hgetall操作可以获取全部属性,如果field过多,遍历整体数据效率较低,可能成为数据访问瓶颈。
- 应用场景
- redis应用于购物车数据存储设计。
- redis应用于抢购,限购类、限量发送优惠券、激活码等业务的数据存储设计。
2.3 list
- 基本描述
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
- 存储结构:一个存储空间存储多个数据,且通过数据可以体现进入顺序。
- 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
- 移除指定数据(redis应用于具有操作先后顺序的数据控制)
- lrem key count value
- 规定时间内获取并移除数据(有就移除,没有就阻塞)
- 注意事项
- list中保存的数据都是string类型,数据总容量有限最多2³²-1个元素。
- list具有索引的概念,但是数据的操作通常以队列或栈的形式进行入队出队操作。
- 获取全部数据操作结束索引设置为-1。
- list可以对数据进行分页操作,通常第一页的数据来自于list,第二页之后的数据以数据库的形式加载。
- 应用场景
- 依赖list的数据具有顺序的特征对信息进行管理。
- 使用队列模型进行多路信息汇总合并。
- 使用栈模型解决最新消息的展示。
2.4 set
- 基本描述
- 存储需求:存储大量的数据,在查询方面提供更高的效率。
- 存储结构:与hash存储结构相同,仅存键,不存储值(nil),并且值是不允许重复的。
- 基本操作
- 添加数据
- sadd key member1 [member2] ...
- 获取全部数据
- smembers key
- 删除数据
- srem key member1 [member2] ...
- 获取集合数据总量
- scard key
- 判断集合中是否包含指定数据
- sismember key member
- 添加数据
- 扩展操作
- 随机获取集合内指定数量的数据(redis用户随机推荐类的信息检索)
- srandmember key [count] count不加默认为1
- 随机获取集合内指定数量的数据并将数据移除
- spop key [count]
- 求两个集合的交、并、差集
- 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
- 随机获取集合内指定数量的数据(redis用户随机推荐类的信息检索)
- 注意事项
- set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
- set虽然和hash存储结构相同,但是无法启用hash中存储值的空间。
- 应用场景
- redis应用于相同类型数据快速去重
- redis应用于黑名单和白名单设定的服务控制
2.5 sorted_set
-
基本描述
- 存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式。
- 存储结构:在set存储结构上添加可排序字段。
-
基本操作
-
添加数据
- 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]
- zrevrangebyscore key min max [withscores]
-
按条件删除数据
- zremrangebyrank key start stop
- zremrangebyscore key min max
-
获取集合数据总量
- zcard key
- zcount key min max
-
集合交、并操作
- zinterstore destination numkeys key [key ...]
- zunionstore destination numkeys key [key ...]
注意
- min和max用于限定搜索查询的条件,表示最小和最大。
- start和stop用于限定查询的范围,作用于索引,表示开始和结束索引。
- offset和count用于限定查询范围,作用与查询结果,表示开始位置和数据总量。
-
-
扩展操作
- 获取数据对应的索引(排名)
- zrank key member
- zrerank key member
- score值获取与修改
- zscore key member
- zincrby key increment member
- 获取数据对应的索引(排名)
-
注意事项
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992。
- score保存的数据也可以是双精度的double值,可能会丢失精读。
- sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同数据,score值会反复覆盖,保留最后一次修改的结果。
-
应用场景
- redis应用于计数器组合排序功能对应的排名。
- redis应用于定时任务执行顺序管理或任务过期管理。
- redis应用于即时任务/消息队列执行管理。
- redis应用于按次结算的服务控制。
2.6 解决方案列表
- Tips 1:redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
- Tips 2:redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
- Tips 3:redis应用于各种结构型和非结构型高热度数据访问加速
- Tips 4:redis 应用于购物车数据存储设计
- Tips 5:redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
- Tips 6:redis 应用于具有操作先后顺序的数据控制
- Tips 7:redis 应用于最新消息展示
- Tips 8:redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
- Tips 9:redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
- Tips 10:redis 应用于同类型不重复数据的合并、取交集操作
- Tips 11:redis 应用于同类型数据的快速去重
- Tips 12:redis 应用于基于黑名单与白名单设定的服务控制
- Tips 13:redis 应用于计数器组合排序功能对应的排名
- Tips 14:redis 应用于定时任务执行顺序管理或任务过期管理
- Tips 15:redis 应用于及时任务/消息队列执行管理
- Tips 16:redis 应用于按次结算的服务控制
- Tips 17:redis 应用于基于时间顺序的数据操作,而不关注具体时间
3. Redis通用指令
- 删除指定key
- del key
- 获取key是否存在
- exists key
- 获取key的类型
- type key
- 为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
- 切换数据库
- select index
- 其他操作
- quit
- ping
- echo message
- 数据移动
- move key db
- 清除数据
- dbsize
- flushdb
- flushall
评论区