cpu读取磁盘数据很慢,大部分数据放(mysql)
cpu读取内存数据更快,少部分热点数据放(内存)
问题现象
海量用户高并发罪魁祸首——关系型数据库NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。 虽然是数据库,但没有表结构(对数据没有硬性结构规定)
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
⚫ 可扩容,可伸缩
⚫ 大数据量下高性能
⚫ 灵活的数据模型
⚫ 高可用
常见 Nosql 数据库:
⚫ Redis
⚫ memcache
⚫ HBase
⚫ MongoDB
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
数据间没有必然的关联关系
内部采用单线程机制进行工作
高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。 (速度快)
多数据类型支持
字符串类型 string
列表类型 list
散列类型 hash
集合类型 set
有序集合类型 zset/sorted_set
支持持久化,可以进行数据灾难恢复⚫ 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
⚫ 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
⚫ 时效性信息控制,如验证码控制、投票控制等
⚫ 分布式数据共享,如分布式集群架构中的 session 分离
⚫ 消息队列
服务启动(端口)
redis-server --port 6379客户端连接
redis-cli [-h ip -p port]配置文件启动
作用:将所有的配置写到配置文件中然后在启动daemonize: 可以设置redis后台启动dir:配置数据目录redis 数据存储格式
redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGk6S7op-1593825429404)(E:\每日讲课笔记\WEB_new\15-redis(双元)\day01\img\1593664865666.png)]
string类型 HashMap<String, String>
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型存储数据的格式:一个存储空间保存一个数据存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用string 类型数据的基本操作
添加/修改数据(set key value)
获取数据(get key)
删除数据(del key)
判定性添加数据(setnx key value)
添加/修改多个数据(mset key1 value1 key2 value2…)
获取多个数据(mget key1 key2…)
获取数据字符个数(字符串长度)(strlen key)
追加信息到原始信息后部(如果原始信息存在就追加,否则新建)(append key value)
// insert update set key value mset k1 v1 k2 v2 [...] // delete del key // update append key v // 查询 get key mget k1 k2 k3 //字符长度 strlen key //扩展 // 如果key不存在就创建,存在就不创建 setnx key value // 自增 incr key incrby key num // 自减 decr key decrby key num //存活时间 expire setex key time value设置数值数据增加指定范围的值
incr keyincrby key incrementincrbyfloat key increment设置数值数据减少指定范围的值
decr keydecrby key increment设置数据具有指定的生命周期
setex key seconds valuepsetex key milliseconds valuestring 类型数据操作的注意事项
数据操作不成功的反馈与数据正常操作之间的差异
表示运行结果是否成功(integer) 0 → false 失败(integer) 1 → true 成功表示运行结果值(integer) 3 → 3 3个(integer) 1 → 1 1个数据未获取到时,对应的数据为(nil),等同于null
数据最大存储量:512MB
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错 9223372036854775807(java中Long型数据最大值,Long.MAX_VALUE)
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响
小结
数值操作(incr incrby incrbyfloat desc descby )时效性操作(setex psetex)注意事项应用场景
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量
解决方案
在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
eg: user🆔3506728370:fans → 12210947
eg: user🆔3506728370:blogs → 6164
eg: user🆔3506728370:focuses → 83
也可以使用json格式保存数据
eg: user🆔3506728370 → {“fans”:12210947,“blogs”:6164,“ focuses ”:83 }
key 的设置约定
数据库中的热点数据key命名惯例
表名:主键名:主键值:字段名
eg: order: id : 2937595: name
数据存储的困惑
对象类数据的存储如果具有较频繁的更新需求操作会显得笨重
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaSbkbTb-1593825429408)(E:\每日讲课笔记\WEB_new\15-redis(双元)\day01\img\1593666627840.png)]
hash 类型HashMap<String, Map<String, String>>
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储
hash存储结构优化
⚫ 如果field数量较少,存储结构优化为类数组结构
⚫ 如果field数量较多,存储结构使用HashMap结构
// 添加 修改 hset mapKey fieldkey value hmset mapKey fieldkey value [fieldkey value ...] // 查询 hget mapKey fieldkey hmget // 删除 hdel mapKey fieldkey //获取所有的key hkeys key // 查看所有值 hvals key //自增 hincrby key fieldkey 数字hash 类型数据的基本操作
添加/修改数据(hset key field value)获取数据(hget key field)(hgetall key)删除数据(hdel key field [field])设置field的值,如果field存在则不作任何操作(hsetnx key field value)添加/修改多个数据(hmset key field1 value1 field2 value2)获取多个数据(hmget key field field2…)获取哈希表中字段的数量(hlen key)获取哈希表中是否存在指定的字段(hexists key field)HashMap<String, List>
// insert update l left r right lpush listkey value rpush listkey value // 查询 lrange listkey 0, -1 lindex listkey index // 删除 lpop likekey rpop likekey //可以等待一段一段时间 blpop key1 [key2] timeout brpop key1 [key2] timeout brpoplpush source destination timeout[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D209av4O-1593825429410)(E:\每日讲课笔记\WEB_new\15-redis(双元)\day01\img\1593691217907.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U32sxla8-1593825429414)(E:\每日讲课笔记\WEB_new\15-redis(双元)\day01\img\1593691256752.png)]
然后带配置文件重新启动 redis-server redis/conf/6379.conf
然后idea就可以输入ip地址连接了
window查看占用端口进程并关闭
//1. 查看端口当前占用的进程id netstat -ano | findstr 6379 //2. taskkill taskkill /f /pid 10352linux中端口占用
ps -ef | grep 进程名 kill -9 进程id复制: crtl + insert
粘贴:shift + insert
indstr 6379
//2. taskkill taskkill /f /pid 10352 ```linux中端口占用
ps -ef | grep 进程名 kill -9 进程id复制: crtl + insert
粘贴:shift + insert