Redis 简介和数据类型
Redis学习
1.Redis基础
- Redis入门
- 数据类型
- 通用命令
- Jedis
2.Redis高级
- 持久化
- redis.conf
- 事务
- 集群
3.Redis应用
- 企业级解决方案
Redis 简介
关系型数据库:
-
性能瓶颈:磁盘IO性能低下
-
扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群
Nosql
-
降低磁盘IO次数,越低越好
-
去除数据间关系,越简单越好 —— 内存存储 —— 不存储关系,仅存储数据
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
- 可扩容,可伸缩
- 大数据量下高性能
- 灵活的数据模型
- 高可用
常见 Nosql 数据库: Redis, memcache , HBase , MongoDB
Redis
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
- 数据间没有必然的关联关系
- 内部采用单线程机制进行工作
- 高性能。
- 多数据类型支持
- 字符串类型 string
- 列表类型 list
- 散列类型 hash
- 集合类型 set
- 有序集合类型 sorted_set
-
持久化支持。可以进行数据灾难恢复
Redis 的基本操作
添加
功能:设置 key,value 数据
set key value
查询
功能:根据 key 查询对应的 value,如果不存在,返回空(nil)
get key
清屏
clear
退出客户端命令行模式
quit
exit
<ESC>
帮助
help 命令名称
help @组名
Redis 数据类型
数据存储类型介绍
业务数据的特殊性: 作为缓存使用
附加功能 :系统功能优化或升级
- 单服务器升级集群
- Session 管理
- Token 管理
Redis 数据类型(5种常用)
- string String
- hash HashMap
- list LinkedList
- set HashSet
- sorted_set TreeSet
redis 数据存储格式
- redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
- 数据类型指的是存储的数据的类型,也就是 value
部分的
类型,key 部分永远都是字符串
string 类型数据的基本操作
添加/修改数据
set key value
获取数据
get key
删除数据
del key
添加/修改多个数据
mset key1 value1 key2 value2 …
获取多个数据
mget key1 key2 …
获取数据字符个数(字符串长度)
strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
单数据操作与多数据操作的选择
单指令3条指令的执行过程:6+3 次
多指令3条指令的执行过程 :2+3次
string 类型数据的扩展操作
业务场景
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键 id 必须保证统一性 ,不能重复。
解决MySQL数据库
设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat key increment
设置数值数据减少指定范围的值
decr key
decrby key increment
string 作为数值操作
1. string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
2. redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
3. 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。
9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)
小结1:
- redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
- 此方案适用于所有数据库,且支持数据库集群
业务场景
主要是包括时效性信息的场景
解决方案
设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
小结2:
- redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
string 类型数据操作的注意事项
- 数据操作不成功的反馈与数据正常操作之间的差异
① 表示运行结果是否成功
(integer) 0 → false 失败
(integer) 1 → true 成功
② 表示运行结果值
(integer) 3 → 3 3个
(integer) 1 → 1 1个
-
数据未获取到 (nil)等同于null
-
数据最大存储量 512MB
-
数值计算最大范围(java中的long的最大值) 9223372036854775807
string 类型应用场景
业务场景
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量
解决方案
- 在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
eg: user🆔3506728370:fans → 12210947
eg: user🆔3506728370:blogs → 6164
eg: user🆔3506728370:focuss → 83
-
在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)
eg: user🆔3506728370 →
小结3:
- redis应用于各种结构型和非结构型高热度数据访问加速
key 的设置约定
-
数据库中的热点数据key命名
表名 :主键名 : 主键值 : 字段名
eg: order : id : 542658 : name
hash
hash类型
存储的困惑
对象类数据的存储如果具有较频繁的更新需求操作会显得笨重
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储
hash存储结构优化
- 如果field数量较少,存储结构优化为类数组结构
- 如果field数量较多,存储结构使用HashMap结构
hash 类型数据的基本操作
添加/修改数据
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
hash 类型数据扩展操作
获取哈希表中所有的字段名或字段值
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
hash 类型数据操作的注意事项
- hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到, 对应的值为(nil)
- 每个 hash 可以存储 2 32 - 1 个键值对
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
- hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
hash 类型应用场景
业务场景 电商网站购物车设计与实现
解决方案
- 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
- 将商品编号作为field,购买数量作为value进行存储
- 添加商品:追加全新的field与value
- 浏览:遍历hash
- 更改数量:自增/自减,设置value值
- 删除商品:删除field
- 清空:删除key
仅仅是将数据存储到了redis中,并没有起到加速的作用
- 每条购物车中的商品记录保存成两条field
- field1专用于保存购买数量 命名格式:商品id:nums 保存数据:数值
- field2专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等 命名格式:商品id:info 保存数据:json
hsetnx key field value //如果有数据则修改失败,没数据才修改成功
小结4: redis 应用于购物车数据存储设计
业务场景
双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商 品抢购上限1000张
解决方案
- 以商家id作为key
- 将参与抢购的商品id作为field
- 将参与抢购的商品数量作为对应的value
- 抢购时使用降值的方式控制产品数量
小结5: redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
add:
Redis仅做数据的提供和保存,不要与业务混淆(储存对象)
如果改数量操作多的话就用hash,如果仅是把数据呈现或者更多东西就用String
业务场景
string存储对象(json)与hash存储对象
list
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现
list 类型数据基本操作
添加/修改数据
lpush key value1 [value2] ……
rpush key value1 [value2] ……
获取数据
lrange key start stop
lindex key index
llen key
获取并移除数据
lpop key
rpop key
list 类型数据扩展操作
规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout