redis入门实战教程
redis简介:
1、redis是单线程
2、安装完成之后默认16个数据库,默认使用0号数据库
切换数据库使用select命令,如"select 2"就是切换到2号数据库
3、16个库的密码都是一样的,要么一个都连不上,要么全能连上(redis默认没有密码)
一、redis安装
二、redis设置外网访问
redis默认开启了保护模式,在保护模式下只有本地可以访问(因为bind配的是127.0.0.1),所以redis默认没有密码
设置外网访问的两个相关配置:
- 配置redis.conf文件中的bind 设置但是可以通过哪个IP来访问(这个IP可以是redis安装的服务器的IP,也可以是自定义的IP),如果bind 设置为192.168.1.117,那么只能通过192.168.1.117来访问,在Java代码中实例化jedis的时候就要写Jedis jedis = new Jedis(“192.168.1.117”,6379),如果bind 设置为0.0.0.0,则可以通过哪个IP来访问。
- protected-mode 保护模式(除本机外,其他的都无法连接上),默认是开启的,要设置外网访问需要将它改为no。
设置外网访问的3种方法
- 注释掉bind并把protected-mode设置为no
- 使用bind
- 设置密码
- redis五大数据类型
String、List、Set、Hash、Zset
String
命令行:
Set key value 设置key value
Get key 查看当前key的值
Del key 删除key
Append key value 如果key存在,则指定的key末尾添加,如果key不存在则类似set 命令
Strlen key 返回此key的长度
Java代码:
Mset:连续操作,jedis.mset(“k1”,”v1”,”k2”,”v2”,”k3”,”v3”)
等同于jedis.mset(“k1”,”v1”),jedis.mset(”k2”,”v2”),jedis.mset(”k3”,”v3”),mset比set效率要高
Mget: 连续操作,jedis.mget(“k1”,”k2”,”k3”)
等同于jedis.mget(“k1”),jedis.mget(”k2”),jedis.mget(”k3”)
Setnx: 这个key存在就不设置了,不存在就设置
Setex: 设置过期时间jedis.setex(“k1”,60,”v1”)单位是秒,60秒之后key就被自动删除
Ttl: jedis.ttl(“k1”),查询key还有多久过期,返回-1是永不过期,-2已经过期
List
Lpush: jedis.lpush(“lpush”,”v1”,”v2”,”v3”,”v4”)给左边添加,结果是v4,v3,v2,v1
Rpush: jedis.rpush(“rpush”,”v1”,”v2”,”v3”,”v4”)给右边添加,结果是v1,v2,v3,v4
Lpop: jedis.lpop(“lpush”)从左边出栈,删除左边第一个
Rpop: jedis.rpop(“rpush”)从右边出栈,删除右边第一个
set 无序不重复
Jedis.sadd(“set1”,”v1”,”v2”,”v3”,”v4”)
Jedis.smember(“set1”):查看set1的所有元素
Jedis.sismember(“set1”,”v1”):判断v1是否存在于set1当中
Jedis.sdiff(“set1”,”set2”):差集,存在于set1,不存在于set2
Jedis.sinser(“set1”,”set2”):交集
Jedis.sunion(“set1”,”set2”):并集并去重
zset有序不重复
Value后面加d就可以实现排序
Map<String,Double> map = new HashMap<>();
Map.put(“k1”,10d);
Map.put(“k2”,20d);
Map.put(“k3”,30d);
Map.put(“k4”,40d);
Jedis.zadd(“zset”,map);
Jedis.zrangWithScores(“zset”,0,-1);//输出一下zset的所有元素
[[k1,10.0],[k2,20.0],[k3,30.0],[k4,40.0]]
Hash
value本身就是一个map,那么就是map套map
- Pipeline管道
Pipeline可以大幅度提高给redis写入数据的速度,如果用如下的方法进行写数据的话,10000条数据需要7分钟。因为Jedis.hset方法要连接10000次redis,写入10000次。
For(int =0;i<10000;i++){
Jedis.hset(“aaaa”+i,”aaaa”+i,”aaaa”+i);
}
如果采用管道,把每100条数据打成一个包,总共打成100个包,存入100个管道,提交100次,那么10000条只需要7秒钟时间。因为pipeline只需要连接100次redis,提交100次,写入10000次。
For(int =0;i<10000;i++){
Pipeline pipeline = jedis.pipelined();
For(int j=i+100;j<(i+1)*100;j++){
pipeline .hset(“bbbb”+j,”bbbb”+j,”bbbb”+j);
}
Pipeline.syncAndRetuenAll();
}
- redis持久化
就是在指定时间间隔内,将内存当中的数据集快照写入磁盘,它恢复时将持久化文件直接读取到内存。
Redis提供两种持久化方式。
一种是默认的RDB持久化;
一种是AOF持久化。
RBD持久化
- 什么是RDB?
Redis启动时会自动调用fork方法创建一个与redis进程一模一样的fork进程,这个进程的所有数据(变量,环境变量、程序计数器等)都和原进程一模一样。Fork进程会先将数据写入到一个临时文件,待持久化结束了,在用这个临时文件替换上一次持久化好的文件。整个过程中,主进程不进行任何IO操作,这就确保主进程性能不受影响。
- 持久化文件在哪?
Redis启动目录是哪里,持久化文件就默认生成在哪里
3、它什么时候fork子进程?什么时候触发RDB持久化机制?
Redis启动时会自动创建
- shutdown时,如果没有配置aof,则会触发RDB
- 配置文件中默认的快照配置(在redis集群中通常会注释掉master配置文件中save配置)
- 手动执行save或者bgsave命令。save命令不会fork子进程,只管保存,其他不管,全部阻塞。bgsave会fork子进程,子进程会在后台异步进行快照操作,同时可以响应客户端的的请求。
AOF持久化
- 什么是aof?
将redis的操作日志以追加的方式写入文件,读操作是不记录的。这样当redis宕机了下次重启时候会去读这个文件,然后将命令执行
- Aof持久化文件是哪里?
- Aof持久化的3种策略
- no表示等操作系统进行缓存同步到磁盘,速度快但是不安全,不推荐使用
- Always同步持久化,每次发生数据变更时,立刻记录到磁盘,速度慢(太小号redis性能)但是安全
- EverySec表示每秒同步一次,redis默认是EverySec,很快但是可能丢失一秒以内的数据
3、aof重写机制
当AOF文件增大到一定大小的时候redis能够调用bgrewriteaof对持久化文件进行重写。重写的对象主要是重复性的操作
- RDB和AOF持久化对比总结
- redis提供了RDB为什么还要AOF?
优化数据丢失的问题,rdb会丢失最后一次快照以后的数据,aof不会丢失超过2秒的数据(因为aof可以配置每秒备份一次)
- 如果RDB和AOF同时存在,听谁的?
听aof,因为aof数据准确率更高。
- rdb和aof优势劣势
(1)rdb适合大规模的数据恢复,对数据的完整性和一致性不高,在一定时间间隔内做一次备份,如果redis意外down机的话,就会丢失最后一次快照之后的所有操作。
(2)aof根据配置项而定(比如always、everySec)。
官方建议,两种持久化机制同时开启。如果两个同时开启,则优先使用aof。
性能建议(这里只针对单机版redis持久化做性能建议)
因为RDB文件只用作后备用途,只需要15分钟备份一次就够了,只保留”save 900 1 “这条规则。
如果Enable AOF,好处实在最恶劣的情况下只会丢失不超过两秒的数据,启动脚本较简单,值load自己的AOF文件就可以了。
减少AOF重写的频率,“auto-aof-write-min-size 64mb”太小了,如果硬盘许可,可以将它设置为5G。
如果是redis集群或者哨兵的话,建议主机关掉RDB,开启AOF,有必要的话配置一下”save 900 1”。
- 缓存穿透
缓存的基本用法(如查询接口):先在缓存当中查,如果有就返回,如果没有就去数据库查。简单示例代码如下图
缓存穿透:数据库当中没有这条数据,缓存当中也没有这条数据。
缓存穿透的解决办法:
- 缓存空对象:
以上图的代码来说假如查询一个缓存和数据库中都不存在的数据,每查询一次都会去请求数据库,为了不使它频繁查询数据库,就可以在第一次查询完数据库后,如果没查到就返回一个空对象,代码如下
2、布隆过滤器(相当于一个集合)
以上的解决办法会产生一个问题,就是redis中存在大量的空对象。使用布隆过滤器时候,如果按照ID查询,如果这个ID可能存在于布隆过滤器中,接着往下执行。绝对不存在于布隆过滤器中,就直接返回,不查询数据库。
缓存击穿:数据库当中有这条数据,缓存当中没有这条数据,原因可能是这条数据根本没有加入到缓存,或者这条数据失效了。
缓存击穿的解决办法:使用互斥锁?分布式锁?ReantreeLock?
假设有100个线程查询,如果不加锁在高并发情况下会查询100次数据库,枷加锁之后只会查询1次数据库。
- 缓存雪崩
缓存雪崩:redis宕机,或者大部分缓存在同一时间失效
雪崩的解决办法:
- 搭建redis高可用集群,目前最流行的就是cluster
- 设置不同的过期时间,不让数据在同一时间失效
redis入门实战教程相关推荐
- Spring Boot 入门实战教程
Spring Boot 2.0 入门实战教程 开发环境:JDK1.8或以上 源码下载:https://pan.baidu.com/s/1Z771VDiuabDBJJV445xLeA 欢迎访问我的个人博 ...
- Python之Numpy入门实战教程(2):进阶篇之线性代数
Numpy.Pandas.Matplotlib是Python的三个重要科学计算库,今天整理了Numpy的入门实战教程.NumPy是使用Python进行科学计算的基础库. NumPy以强大的N维数组对象 ...
- Python之Numpy入门实战教程(1):基础篇
Numpy.Pandas.Matplotlib是Python的三个重要科学计算库,今天整理了Numpy的入门实战教程.NumPy是使用Python进行科学计算的基础库. NumPy以强大的N维数组对象 ...
- 视频教程-深度学习与PyTorch入门实战教程-深度学习
深度学习与PyTorch入门实战教程 新加坡国立大学研究员 龙良曲 ¥399.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ↓ ...
- 【kratos入门实战教程】1-kratos项目搭建和开发环境配置
1.系列目录 [kratos入门实战教程]0-商城项目介绍 [kratos入门实战教程]1-kratos项目搭建和开发环境配置 [kratos入门实战教程]2-实现注册登陆业务 2.概览 经过上一篇的 ...
- 【kratos入门实战教程】2-实现注册登陆业务
1.系列目录 [kratos入门实战教程]0-商城项目介绍 [kratos入门实战教程]1-kratos项目搭建和开发环境配置 [kratos入门实战教程]2-实现注册登陆业务 2.概览 通过本篇文章 ...
- 【Redis】redis入门保姆教程
[Redis]redis入门保姆教程 数据库分类 Sql与NoSql Redis特性: Redis持久化机制好在哪里? Redis的特性:分布式共享 Redis的应用场景 Redis环境搭建 1.创建 ...
- SharePoint Online 入门实战教程-杨建宇(霖雨)-专题视频课程
SharePoint Online 入门实战教程-1053人已学习 课程介绍 本次课程以SharePoint Online国际版为环境,为大家介绍SharePoint Online的基 ...
- 视频教程-SharePoint 2019 入门实战教程-企业信息化
SharePoint 2019 入门实战教程 大家好,我是霖雨,从2010年开始致力于SharePoint相关的技术研究,精通SharePoint环境搭建.实施.开发.运维.排错等相关技术,从2014 ...
最新文章
- MySQL-自定义函数
- 方正ceb阅读器手机版_海信阅读手机A5Pro 经典版评测:体验和阅读完美平衡
- 团队作业8——第二次项目冲刺(Beta阶段)博客汇总
- 看完这些自动化原理图,有一种豁然开朗的感觉
- 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图
- c++循环执行一个函数_循环
- php中define的参数_php中define的用法有哪些
- 算法题2 插序算法
- fanuc 机床,加工中心通信总结,机床联网监控系统
- 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
- matlab gui的callback,matlab GUI callback 函数实现
- 披荆斩棘,蜕变从来学吧这里开始
- 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
- 软件测试工程师春招薪资20K+,BAT校招薪资表出炉!学弟学妹们看齐...
- 子域,代数闭域,代数闭包
- HashMap 的长度为什么是 2 的幂次方
- 各大游戏公司面经笔试题汇总(资源来自网络)(实时更新)
- Java经典面试:完美世界java开发待遇
- mt9v034相机ros驱动包
- Test source folder ‘src/test/java‘ in project ‘o2o...tput folder that is not also used for main sour