Redis
redis:
1.什么是缓存?
mybatis一级缓存和二级缓存
mybatis的一级缓存存在哪?
SqlSession,就不会再走数据库
什么情况下一级缓存会失效?
当被更新,删除的时候sqlsession结束,也就是最终一级缓存失效
二级缓存存在哪?
mapper中的命名空间中(namespace),namespace在内存中(tomcat服务器的内存中)
当tomcat服务器重启/停止就会失效
无论是一级缓存还是二级缓存都不会永远持久化数据在硬盘中
mybatis缓存使用率就会很低,而且使用范围很窄(只能使用到对数据库的增删改查)
当拥有10亿条数据的时候
user表中10亿条数据
select * from user
mybatis无法做到大批量数据的查询,查询都无法做到,数据也绝对不会进入到缓存中
2.什么数据会被存入到缓存中?
2.1.经常用到的数据
2.2.不会经常修改的数据
身份证号,性别,名字,省市区,国家名称,组织机构...
把经常用到并且不会经常发生修改的数据存入到数据库某张表中叫做字典表
商品名称,商品类目....
3.什么是redis
称之为缓存,是一个数据库,非关系型数据库
关系型数据库:
mysql
oracle
表和表之间产生关联,数据和数据之间也可以产生关联,称之为关系型数据库
非关系型数据库:
NOSQL:没有sql的数据库,数据和数据之间是独立存在的,没有关系,也没有表的概念
Redis:键值对对应的数据库(数据格式以key和value对应,json,redis中存的就是json格式的数据)
{key:value, key:value}
key:[{key, value}, {key, value}]
面试题:
redis中的数据类型都有什么?
5种
key的类型永远是String
value的类型是可以改变
String(使用最多的就是String类型)
Hash
List
新版本支持Set:是无序,并且数据唯一(不会重复)(数据不能重复)
老版本依然是Map
zSet:是有序,并且数据唯一(数据的标识唯一(索引是唯一的)),数据可以重复
MongoDB:文档型数据库
HBase:列数据库
所有的NOSQL数据库都在内存中做计算,数据会永久的保存在硬盘中
当redis启动后,redis会自动向硬盘中加载数据,把这些数据加载到内存中,等待客户端进行查询数据,客户端其实是从内存中把数据获取到,所以效率会非常快!应用场景一般情况下只能应用缓存!
redis是以集群的形式存在,在官方文档中说明,如果需要配置redis缓存库,最少需要六台(三主三从)
4.redis的缺点:
4.1.redis必须以集群的形式的存在(6台),占用的资源就非常多!
4.2.主从之间需要数据的同步
master-->10万条数据
follower-->10万条数据
硬盘占用也非常大
4.3.redis是在内存中所运算(10万条数据缓存信息),就会占用非常大的内存
4.4.因为最终因为redis加载机制问题,硬盘和内存需要进行交互,会占用非常大的CPU
5.linux配置redis集群
需要6台服务器(三主三从)
今天使用一台服务器模拟六台
根据端口号的不同进行模拟
5.1.从官网下载redis5.0.5
5.2.使用xftp工具上传linux服务器上
5.3.解压redis的压缩包
tar -zxvf xxxx
5.4.编译redis
进入redis的目录
make && make install
redis不是用Java写的,redis是用C语言写的
看到以下信息说明编译成功
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/home/apps/redis-5.0.5/src'
5.5.在redis的目录中创建redis_cluster文件夹
mkdir redis_cluster
5.6.在redis_cluster中分别创建端口号的文件夹(6380-6385,redis的默认端口号为6379)
mkdir 6380...6385
5.7.在6380中创建文件redis.conf
touch redis.conf
添加以下内容:
#端口号
port 6380
#默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
bind 192.168.127.139
#redis后台运行
daemonize yes
#pidfile文件对应6380,6381,6382...
pidfile /var/run/redis_6380.pid
#开启集群,把注释#去掉
cluster-enabled yes
#集群的配置,配置文件首次启动自动生成 6380,6381,6382
cluster-config-file nodes_6380.conf
#请求超时,默认15秒,可自行设置
cluster-node-timeout 10100
#aof日志开启,有需要就开启,它会每次写操作都记录一条日志
appendonly yes
需要进行修改:
port 6380
bind 本机的ip地址
pidfile /var/run/redis_6380.pid(根据端口号修改)
cluster-config-file nodes_6380.conf(根据端口号修改)
5.8.分别向6381-6385copy一份
cp -r redis.conf ../6381
5.9.分别根据5.7这一步的配置进行修改
5.10.启动redis的集群
一定要在src目录下启动,在其他的地方无法启动
./redis-server ../redis_cluster/6380/redis.conf
./redis-server ../redis_cluster/6381/redis.conf
./redis-server ../redis_cluster/6382/redis.conf
./redis-server ../redis_cluster/6383/redis.conf
./redis-server ../redis_cluster/6384/redis.conf
./redis-server ../redis_cluster/6385/redis.conf
看到以下信息说明启动成功:
7964:C 23 Aug 2019 09:51:54.935 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7964:C 23 Aug 2019 09:51:54.935 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=7964, just started
7964:C 23 Aug 2019 09:51:54.935 # Configuration loaded
5.11.检测redis集群是否启动成功
ps -ef | grep redis
看到以下信息说明启动成功:
root 7940 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6380 [cluster]
root 7945 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6381 [cluster]
root 7950 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6382 [cluster]
root 7955 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6383 [cluster]
root 7960 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6384 [cluster]
root 7965 1 0 09:51 ? 00:00:00 ./redis-server 192.168.23.145:6385 [cluster]
5.12.创建redis的缓存库
因为redis最终是以数据库的形式的存在,原理和mysql一样,集群创建成功只能说明安装redis成功了,但是最终redis中并没有自带的缓存库,需要自己手动创建
!!!!还需要在redis的src中进行
!!!当第一次运行的话,才需要创建数据库,以后的每一次运行都不再需要了,直接启动集群即可!!!
redis-cli --cluster create 192.168.23.138:6380 192.168.23.138:6381 192.168.23.138:6382 192.168.23.138:6383 192.168.23.138:6384 192.168.23.138:6385 --cluster-replicas 1
!!!!需要自己手动输入yes,如果超时了还没有输入,则会自动退出,需要再次创建!!!!!!
看到以下信息说明创建redis缓存库成功:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
5.13.进入redis的缓存中
也必须要在src目录下进行
./redis-cli -h 192.168.23.138 -c -p 6380
5.14.停止redis
也必须要在src目录下进行
./redis-cli -h 192.168.23.145 -p 6380 shutdown
./redis-cli -h 192.168.23.145 -p 6381 shutdown
./redis-cli -h 192.168.23.145 -p 6382 shutdown
./redis-cli -h 192.168.23.145 -p 6383 shutdown
./redis-cli -h 192.168.23.145 -p 6384 shutdown
./redis-cli -h 192.168.23.145 -p 6385 shutdown
5.15.全部关闭
pkill redis(不推荐使用!!!)
6.强调
在redis中是没有修改操作的
只有增删查
如果需要修改的话,需要进行覆盖
新增:
set key(String) value(任意改变(5种))-->返回值是"OK"
查询:
get key(String) --> value(存入的类型)
删除:
del key(String) -->返回值是Integer(受影响的行数)
设置缓存的失效时间:
expire key(String) seconds(秒,Long/Integer)-->返回值是Integer(受影响的行数)
原文地址:https://www.cnblogs.com/liuqijia/p/11414590.html
- 1935: [Shoi2007]Tree 园丁的烦恼
- 1339 / 1163: [Baltic2008]Mafia
- 4010: [HNOI2015]菜肴制作
- 4052: [Cerc2013]Magical GCD
- ElasticSearch搜索引擎在SpringBoot中的实践
- 2292: 【POJ Challenge 】永远挑战
- 四边形不等式优化DP
- 4063: [Cerc2012]Darts
- 3997: [TJOI2015]组合数学
- 1349: [Baltic2006]Squint
- 遗传算法(2)
- 算法模板——线性筛素数
- HDU 3480 Division
- 小白博客 Xiaobai___详细教你如何在Linux环境下安装mysql数据库
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- centos7上编译安装php7以php-fpm方式连接apache
- 基于Python实现视频的人脸融合功能
- 如何理解python对象
- Virtualenv 搭建 Py项目运行环境的教程详解
- python字符串的index和find的区别详解
- 浅谈Python 参数与变量
- 宝塔面板成功部署Django项目流程(图文)
- Python celery原理及运行流程解析
- Python Scrapy图片爬取原理及代码实例
- Python-for循环的内部机制
- 解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
- 基于python实现模拟数据结构模型
- keras的siamese(孪生网络)实现案例
- 浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
- Python数据可视化图实现过程详解