一.redis特性
1.速度快
2.键值对的数据结构
3.简单稳定
4.持久化
5.主从复制
6.高可用和分布式转移
二.redis为什么速度快?
1.redis虽然安装在磁盘上,但是数据存在内存中
2.单线程
2.与操作系统语言有关,redis是c语言实现,和操作系统语言很近
https://www.jianshu.com/p/8f181aae44a9
因为,为windows等操作系统最初只提供了一种语言的开发接口——
那就 C语言。
关键是,既然操作系统不直接支持其它语言……
那其它语言就只好倒过来去支持操作系统——
所谓既然没办法让山走向穆罕默德,但穆罕默德可以走向山。
而c++,c,pascal,java,python等等语言,虽然在走的方式上有所不同,
但都要走向操作系统这座山,
既然操作系统这座山的近乎唯一的路是C语言——
所有开发语言就只好放下身段
都提供了对C的支持
三.什么是jedis
Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
public void del(String key){
redisTemplate.delete(projectName+key);
}
四.linux命令
1.& 在后台运行 java -jar test.jar &
2. ./redis-cli 客户端打开 相当于在windows上双击这个exe
3.客户端命令操作 设置键位xkey 值为xvalue
set xkey xvalue
五.使用场景
1.视频中得播放次数 redis用命令+1 inscr key
2.登陆
六.可执行文件
除了红框的别的都没用过
七.如何做到持久化
数据往内存中存一份,也会以文件或者日志得方式往磁盘中存一份
八.为什么不能kill -9
数据不能持久化,杀死线程时,如果文件正在往磁盘里边写,那没来得及写的数据会消失
但是可以通过shutdown命令 ,会输出db saved on disk(数据已经保存到磁盘)
九.java调用redis的过程
把指令转换成协议报文,resp
jedis------tcp----socket
十.单线程的缺陷
如果一个命令执行的慢,会造成其他命令阻塞
十一.value的五种类型
redis命令一般操作什么类型就以这种类型的首字母开头
1.string 命令 set key value
2.hash 命令 hset 或者hmset----可以存储表
把表的主键作为key(这不是固定格式 只要能标识唯一值就好 如hset taobao:order:user:002 num 44这种也可以)
hmset user:001 age 19 name zhangsan
表名:主键值 字段名 字段值 字段名 字段值 。。。。。
获取命令 hgetalll
hgetall user:001
表名:主键值
3.set
4.zset zset叫做有序集合,而set是无序的
题外话:数据库中order by是很影响数据库效率的
5.list
十二.redis中set的使用场景
https://blog.csdn.net/a7442358/article/details/102621269
Sinter(交集) 命令:redis中set常用的操作命令
十三:对redis设计的优化
key越短越好,占内存少
十四.redis客户端友好
说他友好是因为他有提示
linux下 (后边的虚的都是提示)
windows下 (后边的key start stop也都是提示 从哪开始从哪结束)
十五:LUA
1.lua使用场景----redis存储过程
命令是eval
可参考文章 https://zhuanlan.zhihu.com/p/77484377
2.LUA脚本存在的意义
redis是弱事务:有时能回滚,有时不能回滚
而lua脚本是原子性的
十六:countdownlatch发令枪
模拟并发,先wait,直到latch减到(countDown)到0,所有线程一起start
十七:redis慢查询
1.如果一个指令消耗时间过长,redis就会认为这是一个慢查询
2.慢查询时间在配置文件中配置 以微秒为单位 下边这就是10毫秒
或者连接redis-cli客户端之后执行命令
set slowlog-log-slower 1000(重启失效)
3.慢查询记录的最大条数
超过这个数量 前边的指令会被挤出去
4.查看有多少个慢查询
slowlog get
十八:把mysql表导入redis
mysql -uusername -ppassword stress –default-character-set=utf8 –skip-column-names
–raw < order.sql | redis-cli –pipe
1.指令解释
skip-column-names:跳过列名 只保存数据 不保存列名
| 管道符号(意思是将该符号左边的运算结果提交给右边的命令处理,这里是先通过MySQL导出数据,然后用redis-cli导入到Redis)
–raw < order.sql 表示将order.sql的sql语句内容粘贴到mysql里执行
-u 用户名
-p 密码
stress 数据库名 或者用-d指定数据库名 -dstress
2.order.sql的内容
SELECT CONCAT(
"*8\n",
'$',LENGTH(redis_cmd),'\n',redis_cmd,'\n',
'$',LENGTH(redis_key),'\n',redis_key,'\n',
'$',LENGTH(hkey1),'\n',hkey1,'\n','$',LENGTH(hval1),'\n',hval1,'\n',
'$',LENGTH(hkey2),'\n',hkey2,'\n','$',LENGTH(hval2),'\n',hval2,'\n',
'$',LENGTH(hkey3),'\n',hkey3,'\n','$',LENGTH(hval3),'\n',hval3
)FROM(
SELECT 'HMSET' AS redis_cmd,
concat_ws(':','person', id) AS redis_key,
'id' AS hkey1, id AS hval1,
'name' AS hkey2, name AS hval2,
'age' AS hkey3, age AS hval3
From person
)AS t
3.执行位置和正确输出
十九:java对redis批量操作
1.pipeline 管道
原理:把指令拼一起,发送一次请求就好,减少网络传输时间
2.redistemplate操作pipeline
https://blog.csdn.net/xiaoliu598906167/article/details/82218525
List<Long> List = redisTemplate.executePipelined(new RedisCallback<Long>() {
@Nullable
@Override
public Long doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
for (int i = 0; i < 1000000; i++) {
String key = "123" + i;
connection.zCount(key.getBytes(), 0,Integer.MAX_VALUE);
}
return null;
}
});
connection.openPipeline()可以调用,也可以不调用,
但是connection.closePipeline()不能调用,调用了拿不到返回值。
因为调用的时候会直接将结果返回,同时也不会对代码进行反序列化。
3.没使用pipeline和使用pipeline对比
但是pipeline不是事务,只是组成命令块一起发过去然后单线程执行了
就像你执行一个sql脚本就算一条执行错了,前几条sql也不会回滚一样
4.pipeline与原生批量命令 (hmset等)区别
4.1原生命令是原子性
4.2pipeline可以把多种命令组装
二十:RDB持久化
1.以.rdb结尾的文件存储到磁盘
2.持久化文件路径设置 redis.conf中的dir
3. ./ ../ / 的区别
4.持久化好处----恢复数据
根据redis.conf中配置的dir路径,把.rdb文件放到这个路径下重启redis
5. 默认bgsave+rdb
因为save只管保存,不管别的 保存时会阻塞redis的读写
bgsave单开出一个进程去保存
6.默认快照频率
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
二十一:AOF持久化
RDB与AOF区别
https://www.cnblogs.com/AndyAo/p/8135980.html
1.RDB是文件形式,定时执行
2.AOF是记录日志
3.可以配置每秒写一次
4.RDB和AOF可以同时存在
5.AOF恢复数据方式也是把文件放到dir指定得目录下,重启redis
二十二:看懂配置文件的最快方式
直接粘贴到百度翻译上
二十三:redis分布式
1.根据什么分区取值 ?
根据key值得hash计算,得出结果在哪个分区
2.配置集群方法
nodes-6379.conf文件是建好目录之后启动自动生成得
2.1创建集群
https://www.cnblogs.com/ivictor/p/9768010.html
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
第一行是主节点 第二行是从节点
几个主节点之间原本是没有联系的,通过这条命令建立起联系
用的是ruby工具
3.举例如图
1.进入集群在6379设置age 节点不变 因为age根据计算分给了6379这个节点
2.在6379设置name 跑到了6380节点 因为name根据计算分给了6380这个节点
3.在6380节点设置lison,跑到了6381节点,因为lison根据计算分给了6381节点
4.缺点
4.1批量原子操作,如mset,当key在不同分区时,不支持
4.2只能使用数据库0,其余15个全都用不到
5.当一主多从,如何建立集群
--replicas 2 一主两从
replicas和k8s有几个节点的单词一样
k8s
第一行还是主节点
6479,6579----6379
6480,6580----6380
6481,6581----6381
二十四:多主多从
https://blog.csdn.net/ssf1987/article/details/96193533
所以现在知道三种模式
1.一主两从三哨兵 2.多主多从没哨兵 3.多主多从有哨兵
前两种是支持的 最后一种需要自己研究 第一种是连接三个哨兵节点 第二种连接所有主从节点