redis简介:

1、redis是单线程

2、安装完成之后默认16个数据库,默认使用0号数据库

切换数据库使用select命令,如"select 2"就是切换到2号数据库

3、16个库的密码都是一样的,要么一个都连不上,要么全能连上(redis默认没有密码)

一、redis安装

二、redis设置外网访问

redis默认开启了保护模式,在保护模式下只有本地可以访问(因为bind配的是127.0.0.1),所以redis默认没有密码

设置外网访问的两个相关配置:

  1. 配置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来访问。
  1. protected-mode 保护模式(除本机外,其他的都无法连接上),默认是开启的,要设置外网访问需要将它改为no。

设置外网访问的3种方法

  1. 注释掉bind并把protected-mode设置为no
  2. 使用bind
  3. 设置密码
  • 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持久化

  1. 什么是RDB?

Redis启动时会自动调用fork方法创建一个与redis进程一模一样的fork进程,这个进程的所有数据(变量,环境变量、程序计数器等)都和原进程一模一样。Fork进程会先将数据写入到一个临时文件,待持久化结束了,在用这个临时文件替换上一次持久化好的文件。整个过程中,主进程不进行任何IO操作,这就确保主进程性能不受影响。

  1. 持久化文件在哪?

Redis启动目录是哪里,持久化文件就默认生成在哪里

3、它什么时候fork子进程?什么时候触发RDB持久化机制?

Redis启动时会自动创建

  1. shutdown时,如果没有配置aof,则会触发RDB
  2. 配置文件中默认的快照配置(在redis集群中通常会注释掉master配置文件中save配置)
  3. 手动执行save或者bgsave命令。save命令不会fork子进程,只管保存,其他不管,全部阻塞。bgsave会fork子进程,子进程会在后台异步进行快照操作,同时可以响应客户端的的请求。

AOF持久化

  1. 什么是aof?

将redis的操作日志以追加的方式写入文件,读操作是不记录的。这样当redis宕机了下次重启时候会去读这个文件,然后将命令执行

  1. Aof持久化文件是哪里?
  1. Aof持久化的3种策略
  1. no表示等操作系统进行缓存同步到磁盘,速度快但是不安全,不推荐使用
  2. Always同步持久化,每次发生数据变更时,立刻记录到磁盘,速度慢(太小号redis性能)但是安全
  3. EverySec表示每秒同步一次,redis默认是EverySec,很快但是可能丢失一秒以内的数据

3、aof重写机制

当AOF文件增大到一定大小的时候redis能够调用bgrewriteaof对持久化文件进行重写。重写的对象主要是重复性的操作

  • RDB和AOF持久化对比总结
  1. redis提供了RDB为什么还要AOF?

优化数据丢失的问题,rdb会丢失最后一次快照以后的数据,aof不会丢失超过2秒的数据(因为aof可以配置每秒备份一次)

  1. 如果RDB和AOF同时存在,听谁的?

听aof,因为aof数据准确率更高。

  1. 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”。

  • 缓存穿透

缓存的基本用法(如查询接口):先在缓存当中查,如果有就返回,如果没有就去数据库查。简单示例代码如下图

缓存穿透:数据库当中没有这条数据,缓存当中也没有这条数据。

缓存穿透的解决办法:

  1. 缓存空对象:

以上图的代码来说假如查询一个缓存和数据库中都不存在的数据,每查询一次都会去请求数据库,为了不使它频繁查询数据库,就可以在第一次查询完数据库后,如果没查到就返回一个空对象,代码如下

2、布隆过滤器(相当于一个集合)

以上的解决办法会产生一个问题,就是redis中存在大量的空对象。使用布隆过滤器时候,如果按照ID查询,如果这个ID可能存在于布隆过滤器中,接着往下执行。绝对不存在于布隆过滤器中,就直接返回,不查询数据库。

缓存击穿:数据库当中有这条数据,缓存当中没有这条数据,原因可能是这条数据根本没有加入到缓存,或者这条数据失效了。

缓存击穿的解决办法:使用互斥锁?分布式锁?ReantreeLock?

假设有100个线程查询,如果不加锁在高并发情况下会查询100次数据库,枷加锁之后只会查询1次数据库。

 

  • 缓存雪崩

缓存雪崩:redis宕机,或者大部分缓存在同一时间失效

雪崩的解决办法:

  1. 搭建redis高可用集群,目前最流行的就是cluster
  2. 设置不同的过期时间,不让数据在同一时间失效

redis入门实战教程相关推荐

  1. Spring Boot 入门实战教程

    Spring Boot 2.0 入门实战教程 开发环境:JDK1.8或以上 源码下载:https://pan.baidu.com/s/1Z771VDiuabDBJJV445xLeA 欢迎访问我的个人博 ...

  2. Python之Numpy入门实战教程(2):进阶篇之线性代数

    Numpy.Pandas.Matplotlib是Python的三个重要科学计算库,今天整理了Numpy的入门实战教程.NumPy是使用Python进行科学计算的基础库. NumPy以强大的N维数组对象 ...

  3. Python之Numpy入门实战教程(1):基础篇

    Numpy.Pandas.Matplotlib是Python的三个重要科学计算库,今天整理了Numpy的入门实战教程.NumPy是使用Python进行科学计算的基础库. NumPy以强大的N维数组对象 ...

  4. 视频教程-深度学习与PyTorch入门实战教程-深度学习

    深度学习与PyTorch入门实战教程 新加坡国立大学研究员 龙良曲 ¥399.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ↓ ...

  5. 【kratos入门实战教程】1-kratos项目搭建和开发环境配置

    1.系列目录 [kratos入门实战教程]0-商城项目介绍 [kratos入门实战教程]1-kratos项目搭建和开发环境配置 [kratos入门实战教程]2-实现注册登陆业务 2.概览 经过上一篇的 ...

  6. 【kratos入门实战教程】2-实现注册登陆业务

    1.系列目录 [kratos入门实战教程]0-商城项目介绍 [kratos入门实战教程]1-kratos项目搭建和开发环境配置 [kratos入门实战教程]2-实现注册登陆业务 2.概览 通过本篇文章 ...

  7. 【Redis】redis入门保姆教程

    [Redis]redis入门保姆教程 数据库分类 Sql与NoSql Redis特性: Redis持久化机制好在哪里? Redis的特性:分布式共享 Redis的应用场景 Redis环境搭建 1.创建 ...

  8. SharePoint Online 入门实战教程-杨建宇(霖雨)-专题视频课程

    SharePoint Online 入门实战教程-1053人已学习 课程介绍         本次课程以SharePoint Online国际版为环境,为大家介绍SharePoint Online的基 ...

  9. 视频教程-SharePoint 2019 入门实战教程-企业信息化

    SharePoint 2019 入门实战教程 大家好,我是霖雨,从2010年开始致力于SharePoint相关的技术研究,精通SharePoint环境搭建.实施.开发.运维.排错等相关技术,从2014 ...

最新文章

  1. MySQL-自定义函数
  2. 方正ceb阅读器手机版_海信阅读手机A5Pro 经典版评测:体验和阅读完美平衡
  3. 团队作业8——第二次项目冲刺(Beta阶段)博客汇总
  4. 看完这些自动化原理图,有一种豁然开朗的感觉
  5. 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图
  6. c++循环执行一个函数_循环
  7. php中define的参数_php中define的用法有哪些
  8. 算法题2 插序算法
  9. fanuc 机床,加工中心通信总结,机床联网监控系统
  10. 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
  11. matlab gui的callback,matlab GUI callback 函数实现
  12. 披荆斩棘,蜕变从来学吧这里开始
  13. 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
  14. 软件测试工程师春招薪资20K+,BAT校招薪资表出炉!学弟学妹们看齐...
  15. 子域,代数闭域,代数闭包
  16. HashMap 的长度为什么是 2 的幂次方
  17. 各大游戏公司面经笔试题汇总(资源来自网络)(实时更新)
  18. Java经典面试:完美世界java开发待遇
  19. mt9v034相机ros驱动包
  20. Test source folder ‘src/test/java‘ in project ‘o2o...tput folder that is not also used for main sour

热门文章

  1. 安全职业生涯进阶:92 个简单步骤 破解 安全行业
  2. QT配置调试器windbg (Debugging Tools for Windows)
  3. Scaled-YOLOv4 快速开始,训练自定义数据集
  4. word常用快捷键、操作及实例:
  5. pythonchallenge闯关游戏_PythonChallenge闯关游戏——第16-20关
  6. toggle()方法
  7. 细胞工程-5-植物细胞培养和次生代谢产物生产
  8. Jmeter使用文档
  9. 为建设四个现代化的大数据平台奋斗终身
  10. 名帖324 启功 行书《李太白诗四首》