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)数据库。

特征:

  1. 数据间没有必然的关联关系
  2. 内部采用单线程机制进行工作
  3. 高性能。
  4. 多数据类型支持
  • 字符串类型 string
  • 列表类型 list
  • 散列类型 hash
  • 集合类型 set
  • 有序集合类型 sorted_set
  1. 持久化支持。可以进行数据灾难恢复


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
posted @ 2020-11-03 00:04  Anthony-bird  阅读(78)  评论(0编辑  收藏  举报