一.redis介绍和使用
1.数据库分类
关系型数据库
大型 oracle db2 生或中项目 微信 qq 淘宝 京东 抖音 存储量大 而且访问速度也比较快 有专人来维护拟购买的服务 缺点:收费 国企 大型还联网公司 中型 mysql 开源免费 处理千万级别数据 mysql sqlserver---winsows系统兼容性很好 性能较高 系统兼容型 服务器操作系统 linux centos readhat unbntu windows
小型
非关系型数据库
(1)数据库瓶颈
用户表
100 1000 变慢 10000 变慢 100000 变量 1000000 1000000000
当数据库遇到瓶颈 存储瓶颈 磁盘空间不足 扩充磁盘
查询效率效率也会遇到瓶颈
加索引 升级硬件 做缓存---将数据库热点数据缓存到内存当中
关系型数据库限制性比较大
设计好以后 项目也开发好 项目能正常使用
一旦改表结构:成本很高
(2)非关系型数据库
优点: 查询写入速度非常高 基于内存存储的
存储方式 key value userkey 用户集合 json
mongodb—文档结构的存储 mamcache
2.什么是redis为什么需要redis
redis是比较常见的一种非关系型数据库 是多数项目都在用的一种非关系型数据库
基于key value的结构进行数据存储
每秒的读写速度极快
数据存储基于内存,并且支持持久化
为什么要选用redis?
1.免费开源
2.基于key value进行存储
查询快
支持存储的数据类型相对灵活
支持五种数据类型
3.基于内存存储
速度快
而且支持持久化不用担心数据的安全
4.特性
设置key 值可以指定生命周期到期后自动清除内存当中数据
redis可设置占用内存最大空间
5.兼容性比较好
支持各种主流操作系统
二.redis的安装和使用
1.linux命令回顾
2.centos环境下安装redis
参考文档: https://blog.csdn.net/a_rain2333/article/details/119567362
(1)安装gcc环境
yum install -y gcc
(2)下载linux安装包
cd /soft 进入自己创建的目录 wget https://download.redis.io/releases/redis-6.2.5.tar.gz 会联网将redis-6.2.5.tar.g 下载到soft目录
(3)解压下载的redis安装包
tar -zxvf redis-6.2.5.tar.gz
(4)移动解压的redis目录到 usr/local/redis
mv /soft/redis-6.2.5 /usr/local/redis
(5)进入usr/local/redis
make 编译make PREFIX=/usr/local/redis install 安装
(5)进入bin目录
(6)启动redis服务
进入bin ./redis-server
看到上面界面代表代表服务启动成功
(7)使用客户端测试是否可以正常连接redis服务
3.修改redis配置 使用自定义配置启动redis
启动方式
1.进入redis的bin目录
./redis-server
2.自定启动脚本
3.使用自定义配置启动redis
redis配置项
连接方式
redis服务启动后
1.进入bin ./redis-cli 子当前电脑连接
2.在其他任意链接连接服务器redis
支持远程连接
安装redis客户端
使用第三方数据库管理工具
使用自定义配置启动redis
(1)准备配置文件
再redis安装目录找到 redis.conf 进入etc 新建 redis目录 将/usr/local/redis.conf 拷贝到 /etc/redis/redis.conf
(2)使用自定义配置文件启动redis
#进入redis bin目录 cd /usr/local/redis/bin/#使用自定义配置启动redis./redis-server /etc/redis/redis.conf
(3)配置项说明
1.daemonize no
是否以守护进程方式启动redis服务 no不 yes是
2.port
redis默认启动端口
3.database
16 默认redis创建的数据库的个数
每一个数据库当中可以放不同的数据
数据库的名称以序号排除
4.dbfilename dump.rdb
持久化到磁盘当中的数据文件
5.dir ./
数据持久化文件的存储目录
6.配置redis的远程连接
bind 0.0.0.0 -::1
7.设置连接密码
requirepass root123
8.pidfile
线程id pidfile /var/run/redis_6379.pid
9.配置redis日志生成路径
logfile “/usr/redis/log/redis.log”
(4)改完配置重启redis
./redis-server /etc/redis/redis.conf
(5)在其他电脑测试连接redis
下载安装redis客户端软件
要确保
主机ip
密码和端口都正确
一.Redis基础知识讲解
传统数据库当中
数据以表的方式存储
需要掌握数据库的sql才能对数据表做操作
redis
key ——— 表名
value ——- 数据
需要掌握redis命令,才能对redis做增删改查的操作
1.简单命令
PING
测试是否可以正常连接REDIS PONG 代表可以正常连接
KEYS *
列出当前数据库当中所有的KEY
INCR
Incr key(名字) 如果redis当中有这个key就会对里面的值自增1 没有这个key就会创建这个key将值设为1
SELECT 0-15
切换数据库命令
DEL KEY
删除指定的key 删除成功返回1 删除失败返回0
在redis当中 key严格区分大小写
GET KEY
查看KEY 值
FLUSHALL
清空数据库当中所有的KEY
EXISTS KEY
校验KEY 是否存在 存在 1 不存在 0
KEYS key的名称
过滤查看key
keys 完整名称 查看这个key
? 所在位置匹配任意一个字符
匹配任意多个任意字符
[ab] 过滤字符是中括号里面规定的字符
过滤出以NUM A或B或C 任意
2.redis中的数据类型
案列:设计博客论坛系统数据存储
(1)字符串类型
SET KEY(名称)
存储字符串值
GET KEY(名称)
获取字符串值
当获取的Key
不存在
会返回NULL
博客论坛系统注册的用户名改怎么存储?
关系型数据库设计
博客用户表
id 用户名 1 zhangbo 2 liyongguang 3 wumingze SELECT * FROM USER WHERE ID=1 根据Id获取账号信息
redis中的设计
用户名不允许重复用户必须有唯一标识
key怎么设计
id值: incr blog_userAccount_Id 用来作为用户的ID标识
bloguserAccountid值 账号名 存储账号信息
博客文章如何设计
id | 文章标题 | 文章内容 | 文章简介 | 文章发布日期 |
---|---|---|---|---|
1 | java8新特性 | 是否积分计算定积分的书法家 | sadaf | 2020-04-04 15:23:12 |
2 | java爬虫 | 撒发射点更多的是如果 | sdfdsf | 2021-01-19 12:00:12 |
3 | java并发编程相关 | sfdsdfgdthdsgaedfdfhffhgdgfs | sgfgf | 2012-10-14 13:00:34 |
redis中设计
blog*post*文章id 文章key
{ title:'java8新特性', content:'是否积分计算定积分的书法家', detail:' sadaf', createTime: '2020-04-04 15:23:12'}{ title:'java爬虫', content:'撒发射点更多的是如果', detail:'sdfdsf', createTime: '2021-01-19 12:00:12'} 10000篇文章的存储 blog_post_title_1 java8新特性 blog_post_content_1 是否积分计算定积分的书法 blog_post_detail_1 sadaf blog_post_createTime_1 2020-04-04 15:23:12 blog_post_title_2 java8新特性 blog_post_content_2 是否积分计算定积分的书法 blog_post_detail_2 sadaf blog_post_createTime_2 2020-04-04 15:23:12 散列 10000key josn 10000key 单独定义key存储列 40000key
命令补充
incrby key 递增量 地增量是多少 每次就递增多少
decr 递减
decrby 递减量
(2)散列
散列时适合用来存储对象结构的数据
HSET KRY 字段名 字段值 字段名 字段值
HGET KEY 字段名 获取散列中的指定字段的值
HMSET 一次设置多个列和值
HMGET 一次获取多个列的值
HGETALL 一次获取所有的列和值
HEXISTS 查看散列中是否存在指定的列 有 返回1 没有返回0
HDEL 删除散列中无值空列
HKEYS 获取散列中所有Key
HVALS 获取散列中所有值
(3)列表
关系型数据库
id | 文章标题 | 文章内容 |
---|---|---|
1 | java基础 | s豆腐干大概好久会议通过如风 |
2 | java分布式 | sdfghjkhgfdsa |
3 | Spring框架 | dfghyuiyjtgrewq |
新增文章:
id 可以自动增长 —无论成功失败都不会的数据查询造成影响
删除文章
:
delete from blog_post where id=2 第二篇文章
redis中的设计
blog_post_id 记录现在存了多少篇文章
blog_post_1 第一篇
blog_post_2 第二篇
插入一篇新的文章
blog_post_id +1 blog_post_3 —成功 blog_post_id -1
blog_post_3
插入数据需要根据数据是否存入成功 来判断 blog_post_id 是否需要增加
blog_post_id 作用
新增文章根据id设置新的文章的id
标识数据库当中现在有多少篇文章
查看文章列表
先要知道有多少篇文章
for(int x=1;x<=blog_post_id;x++){
HGETAll blog_post_x
}
删除文章
del blog_post_1 删除文章
将关联的 文章的id的key 减去一个1
文章删除成功—-将文章的id的key 值减去1 由于一些原因导出没有减成功
电脑断电—网络波动
文章的id使用递增量存在以上问题,该怎么解决?k考虑使用列表?
Redis的列表和Java当中的集合很类似
数据可以向两端进行存储 左端和右端
越靠近两端数据查询速度越快—-即使列表中有千万级别的量的数据只要数据存储的靠近两端依然可以很快就能 找到
量大的时候查根据索引找列表中间的元素会比较慢
常用命令
LPUSH KEY VALUE
向列表左端添加元素
RPUSH KEY VALUE
向列表右端添加元素
LPOP KEY
从列表的左端弹出第一个元素 取出数据的同时会将该数据从列表移除
LLEN
查看列表中有多少条记录
LRANGE KEY start end
读取列表中指定区间内的数据
LREM KEY 正值(左边数第几个)|负值(右边数第几个) 删除的列表当中指定的值
0 —删除所有指定值的元素
优化文章关联的id 的健
blog_post_id 记录现在有多少篇文章 5
blog_post_1 blog_post_2 blog_post_4 blog_post_5
blog_post_3—-被删掉文章
del blog_post_3
decr blog_post_id 4
for(int x=1;x<=4;x++){
HGETALL blog_post_x
}
用列表类型存储文章关联的id
新增文章时文章的id 是 列表中最近存入的第一个元素的值+1
删除文章同时—-将列表中关联的id值也删掉
使用列表存储id值是可以重复的—要想避免这个问题—向列表中存数据时需要判断列表中是否有该数据
真实的场景当中列表适合用来存储什么样的数据?
存储可以重复的数据?
查两端的数据快?
聊条记录
热点信息?—-热点信息每天都在变存储到列表中可以提高潮汛速度