redis-享学课堂

一.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.多主多从有哨兵  

前两种是支持的   最后一种需要自己研究    第一种是连接三个哨兵节点   第二种连接所有主从节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值