redis 学习笔记(二)
目录
一.Redis的数据类型
1.redis常用的解决方案 原始业务功能设计 秒杀,或者排队购票
2.运行平台监控到高频突发:突发时政要闻
3.高频的统计数据:在线人数,投票排行榜
4.附加功能:系统功能优化或升级
单服务器升级集群
session管理
token管理
二.redis数据类型(5种常用的类型)
redis | java(只是类似但底层并不一致) |
String | String |
hash | Hashmap |
list | LinkedList |
set | HashSet |
sorted-set | TreeSet |
redis 数据存储格式
redis自身是一个map,其中所有的数据都是用key:value的形式存储
redis存储空间 指得是value部分,key值永远是字符串
三.String类型
1.String类型
存储数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示
可以作为数字使用,但是仍为字符串格式
2.String类型数据的基本操作
添加/修改数据
set key value
获取数据
get key
删除数据
del key
添加修改数据
mset key1 value1 key2 value2
获取多个数据
mget key1 key2 key3.....
获取数据字符长度(字符串长度)
strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则就新建)
append key value(有就加到后面,无就新建)
3.操作指令的性能对比
set key value VS mest key1 value1 key2 value2....
一条指令的执行时间
单指令 | 3条指令的执行时间 | 1redis链接*6+redis插入*3 |
多指令 | 3天指令的执行时间 | 1redis链接*2+redis插入*3 |
多指令与单指令进行平衡
1亿条 多指令不如单指令,多指令会让线程阻塞 平衡线程链接时间与指令执行时间
四.String的数值操作
String 类型的数据的扩展操作
业务场景:
大型企业级应用中,分表操作是一个基本操作,使用多表存储同类型数据,但对应的主键id必须保证统一性不能重复.oracle数据具有sequence设定,可以解决该问题,但mysql数据库并不具备类似的机制,该如何解决?
1.分库分表的主键重复问题
oracle---sequeue
mysql---redis解决问题
redis的解决方案
设置数值数据增加指定范围的值
incr key 对所存数字加一
incrby key increment 指定增加多少
incrbyfloat key increment 一次增加一个小数
设置数据数值减少指定范围的值
decr key
decrby key increment 指定减少一定的数值
可以为负数,这样负负得正
String 作为数值操作
String在redis 内部存储默认就是一个字符串,当遇到增减数字类操作incr,decr会转成数值型计算
redis所有操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行得,因此不用考虑并发所带来的数据影响
注意:按数值进行操作的数据,如果原始数据不能转换成数值,或者超越redis上数值的上线范围,将报错
上限数字为:922337203685477
java种long型数据最大值,LONG.MAX_VALUE
tips:
redis 用于控制数据库表主键id,为数据表主键提供生成策略保障主键唯一性
此方案是用于所有数据库并支持数据库集群
五.String类型的扩展操作
业务场景
1."最强女生"启动投票,只能通过微信投票,每个微信号4小时只能投一票
2.电商商家开启热门商品推荐,热门商品不能一致处于热门期,每个商品热门维持3天,3天后自动取消热门
3.新闻网站会出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性
redis设置生存时间
解决方案:
设置数据具有指定的生命周期
setex key seconds value 秒
psetex key milliseconds value 毫秒
tips2:
redis 控制数据的生命周期,通过控制数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
六.String 类型数据操作的注意事项
1.运行成功 ---1
运行失败-----0
2.数据未获取到 nil 相等于Java的null
3.数据的最大存储容量 512M
4.数值计算最大范围(Java种long的最大值)
七.redis的命名标准方式
在redis种 为大V设定用户信息,以用户主键和属性作为key,
表名:主键名:主键值:属性值
区分以冒号(:)区分,标准做法
也可以以json字符串的格式存储对象,但是每一个都需要取出来修改
tips3:
redis应用于各种结构型和非结构型高热度数据访问加速
key的设置约定
表名:主键名:主键值:属性值 一个冒号生成一个命名空间
这就是命名空间的效果